純粋な JavaScript を使用して Telescope に検索を実装しようとしました。FTS が Meteor に実装されるのはしばらく先のようで、まだ Meteor で 2.4 をうまく動作させることができなかったからです。
Telescope に既に実装されている既存のページネーション モデルを使用して、上位/新規/最良の投稿を表示します。また、/search/foobar などに移動したときに Router に設定された検索キーワードのセッション変数を使用しています。
ただし、まったく機能していないようです。たとえば、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 を複製しました。動的である必要があります。おそらく後でリファクタリングします。
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: (新しいファイル、/common ディレクトリにあります)
// 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;
};
パブリッシュ.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,
...
})
どんな助けでも大歓迎です!