2013-04-08 5 views
4

Я попытался выполнить поиск в телескопе с использованием чистого javascript, так как выглядит FTS для Meteor, и я не мог получить 2.4, играя красиво с Meteor.Как реализовать полнотекстовый поиск в Метеор/Телескоп

Я использую существующую модель разбивки на страницы, которая уже реализована в телескопе, чтобы отображать сообщения Top/New/Best, а также переменную сеанса для ключевого слова поиска, установленного в маршрутизаторе при навигации по, например,/Поиск/Foobar.

Однако, похоже, что это не работает; когда у меня есть, скажем, 100 сообщений, регулярная подписка на страницы только возвращается с 25 из них, и мои результаты поиска показывают только сообщения в начале 25.

Я несколько дней стуча головой о стену отлаживать это: иногда это работает, иногда это не так!

Вот код (я включил весь дополнительный код поиска для справки):

app.js:

var resultsPostsSubscription = function() { 
    var handle = paginatedSearchSubscription(10, 'searchResults'); 
    handle.fetch = function() { 
    return limitDocuments(searchPosts(Session.get('keyword')), handle.loaded()); 
    }; 
    return handle; 
}; 

var resultsPostsHandle = resultsPostsSubscription(); 

paginated_sub.js:

Я продублировал существующий paginatedSubscription, потому что я не могу передать Session var в качестве arg; он должен быть динамичным. Я, вероятно, реорганизую позже.

paginatedSearchSubscription = function (perPage/*, name, arguments */) { 
    var handle = new PaginatedSubscriptionHandle(perPage); 
    var args = Array.prototype.slice.call(arguments, 1); 

    Meteor.autosubscribe(function() { 
    var subHandle = Meteor.subscribe.apply(this, args.concat([ 
     Session.get('keyword'), handle.limit(), function() { handle.done(); } 
    ])); 
    handle.stop = subHandle.stop; 
    }); 

    return handle; 
} 

search.js: (новый файл, в/общий каталог)

// get all posts where headline, categories, tags or body are LIKE %keyword% 
searchPosts = function(keyword) { 
    var query = new RegExp(keyword, 'i'); 
    var results = Posts.find({ $or: [ { 'headline': query }, { 'categories': query }, { 'tags': query }, { 'body': query } ] }); 
    return results; 
}; 

publish.js:

Meteor.publish('searchResults', searchPosts); 

posts_list.html:

<template name="posts_results"> 
    {{> posts_list resultsPostsHandle}} 
</template> 

posts_list.js:

Template.posts_results.resultsPostsHandle = function() { 
    return resultsPostsHandle; 
}; 

router.js: есть панель поиска в нав, что перенаправляет здесь

posts_results = function(keyword) { 
    Session.set('keyword' , keyword); 
    return 'posts_results'; 
}; 

Meteor.Router.add({ 
    ... 
    '/search/:keyword':posts_results, 
    ... 
}) 

Любая помощь будет принята с благодарностью!

+1

Мы много боролись с этими сложными подписками. Возможно, было бы более плодотворно напрямую связаться с Sacha + I, и мы можем вместе попытаться понять это. Я думаю, вы можете узнать наши адреса электронной почты :) –

+0

Не могли бы вы клонировать телескоп на GitHub и нажимать на него все свои точные изменения? Я сделал очень простой поисковый тест (https: // gist.github.com/yeputons/8807589) с двумя подписками и работает так, как ожидалось. – yeputons

ответ

2

Немного поздно, но here - это полная запись о том, как реализовать полнотекстовый поиск в метеоре.

«Самый простой способ без редактирования какого-либо кода Метеор - использовать свой собственный монгод».

Смежные вопросы