人々はコンテンツを見つけたいと思っています。適切な検索が不可欠です。
全文検索。ネイティブMongoDB コマンドの使用。
アプリの例:
デフォルトでは、Meteor は MongoDB の独自のインスタンスを起動します。これには全文インデックス作成/検索がないため、ネイティブにする必要があります。
システムに MongoDB の「実際の」インストールがまだない場合は、 HomeBrewを使用してインストールします。
brew update
brew install mongodb
Mac を使用していない場合は...
ターミナル/コンソール ウィンドウで、次のコマンドを使用して mongod データベースを起動します。
mongod --dbpath ~/code/meteor-search/.meteor/local/db --setParameter textSearchEnabled=true
注:
http://localhost:28017/ (ブラウザ内) にアクセスして、動作を確認します。
テキスト検索の有効化の詳細: http://docs.mongodb.org/manual/tutorial/enable-text-search/
「本物の」Mongo を使用しているため、meteor を開始するときにそれを指定する必要があります。 (これは、ENV を設定する実稼働環境での開発中にのみ適用されます)
)
MONGO_URL="mongodb://localhost:27017/meteor" meteor
アプリが正常に起動したら、ゲームが始まります。
(そうでない場合は、このリポジトリにバグを送信してください。サポートさせていただきます。)
このアプリを起動すると、Twitter Streaming API にアクセスし、(ローカルで) 検索できるように何千ものツイートを取得します。 (数分間実行したままにすると、10,000 件の投稿が取得されます。数十万件の検索のストレス テストが必要な場合は、数時間かかります)
大量のコンテンツをすぐにご覧になりたい場合は、キーワードをnewsに変更してください。
(大容量をシミュレートするために)非常識な量の (ノイズの多い) データが必要な場合は、以下を使用します。
var KEYWORDS = "katie, justin, kim, beyonce, miley, Obama, 1DWorld, OMG, FML, breaking, news";
コンテンツを取得したら、MongoDB がそのコンテンツにインデックスを作成していることを確認する必要があります。
ありがたいことに、これは MongoDB のensureIndexメソッドを使用すると非常に簡単です。この例では、単純に投稿の本文フィールドにインデックスを付けます。
db.posts.ensureIndex( { body: "text" },{ background:true } );
これを自動的に実行する起動スクリプトがserver/indexes.jsにあります。
すでに挿入したデータの量によっては、これには時間がかかる場合があります...実行したとき、DB に 92,000 件の投稿 (ツイート) がありましたが、10 秒もかかりませんでした。
ensureIndexの詳細:
db.posts.runCommand( "text", { search: "paypal" } )
これは RoboMongo では正常に機能しますが、
Meteor はrunCommandメソッドをサポートしていません。
それで ...
http://stackoverflow.com/questions/17159626/implementing-mongodb-2-4s-full-text-search-in-a-meteor-app/18258688#18258688
ハッシュタグ付きキーワードをリンクに変換する簡単な正規表現を作成しました。生データをリンクで汚染する (そしてレコードが肥大化する) 代わりに、Handlebars テンプレート ヘルパー メソッドを使用してレンダリング時 (クライアント側) に #keywords を検索/置換します。
// place this code in your main.js or inside an Meteor.isClient block
Handlebars.registerHelper('highlight', function(text) {
var hashtagPattern = /s*(#w*)/gi,
link = "/search/",
m, match, matches = [], t, url ='';
// initial check for hashtag in text
if(text.indexOf("#") !== -1) {
// find all #keywords (that have hashtags)
while ( (match = hashtagPattern.exec(text)) ) {
matches.push(match[0]);
}
// replace any #keywords with <a href="/search/keywords">#keywords</a>
for(var j=0; j < matches.length; j++) {
m = matches[j].replace(/s/g, "");
// console.log('match',m);
url = link+m;
url = url.replace('#',"").toLowerCase(); // remove hashtag for lookup
t = " <a class='hashtag' href='"+url+"'>"+m+"</a> "; // replace with
replace = new RegExp("\s*("+m+")", 'gi');
text = text.replace(replace, t);
}
}
return text;
});
注:リンク パターンはハードコーディングされた/search/:keywords
であり、メソッドは完璧とは程遠い連鎖可能ではありません。改善した場合はプルリクエストを送信してください。 :-)
MongoHQでは、デフォルトでは (フル) テキストのインデックス作成が有効になっていません。
しかし、私がそれを求めたとき、彼らはすぐに助けてくれました: https://twitter.com/nelsonic/statuses/451758108285489152
コマンドを使用して手動でインデックスを設定する必要があります
(Mongo クライアント (RoboMongo を使用) または Web インターフェイスのいずれか)
それが設定されたら、準備完了です。
RoboMongo (または選択した MongoDB クライアント) で、次のコマンドを使用してコレクション全体を検索します (検索可能として指定したフィールド上で)
db.COLLECTION.runCommand( "text", { search: "KEYWORDS" } );
// e.g:
db.posts.runCommand( "text", { search: "learn" } );
コレクションに327,000 件の投稿がある場合、検索結果は0.15 秒で返されました。
このプロジェクトでは、URL ルーティングに Iron Router を使用します。
Meteor に詳しくない場合は (Meteor を真剣に使用する場合はよく知っているはずです)、以下をお読みください。
mrt add iron-router
http://yoursite.com/search/:keywords
の形式でリクエストを受け入れるようにこれをどのように接続したかの詳細については、 routes.jsファイルを参照してください。