2012-02-14 22 views
0

ショートバージョンPostsコレクションのうち、/web/または他の用語と一致する別個のタグの配列を取得する必要があります。MongoDbのMapReduceで "オートコンプリート"タグ


私は、「オートコンプリート」フィールドを養うためのMapReduceパターンの実装に関する疑問を抱えています。これが最善のアプローチだと思いますか? 、私のような結果があるだろうな/web/として検索考える

{ 
    'title': 'A great post', 
    'tags': ['web2.0', 'monetize', 'cloud', 'someOtherDumbTerm'] 
} 
{ 
    'title': 'Another great post', 
    'tags': ['monetize', 'seo-optimization', 'web3.0'] 
} 

["web2.0", "web3.0"]

マイMapReduceの機能のような行く:

var mapFn = function(){ 
    if(this.tags){ 
     this.tags.forEach(function(value){ 
      if (value.match(/web/i)){ 
       emit('web', value); 
      } 
     }); 
    } 
}; 
var reduceFn = function(key, values){ 
    return {result:values}; 
}; 

db.runCommand({ 
    mapreduce: 'posts', 
    out: {inline:1}, 
    map: mapFn, 
    reduce: reduceFn, 
    query: {tags:/web/} 
}); 

Postsコレクションのような書類を持っています私は別のコレクションにタグを格納することを考えていて、それらのための通常の検索を行いますが、それは何年ものRDBMS学習の痕跡が残っているということです。私はまた、これらの種類のクエリのパフォーマンスやその他の意味については全く知らないし、ドキュメントはこのケースではあまり役に立たないようだ。

ありがとうございます!私は実際にのみの分析のためのMapReduceを使用して終了

をやってしまった何を


タグを言いました。

私は、それらを元の用語を保持するだけでなく、正規表現の検索のために基本的なASCII(すなわち、アクセントなしなど)に正規化することを考慮しながら、別のコレクションに保存します。次に、別のコレクションのpost IDにtagオブジェクトIDを参照します。

このすべては、別のクライアントにサービスを提供するために別のアプリに変わりました。それは私の特別な必要性のための最良の解決策であることが分かった。

答えて

0

私はマップ/別のコレクションにタグを減らすことは非常に合理的だと思います。

Map/Reduceクエリをリアルタイムで実行することはできません。また、標準の「検索」クエリを使用して、既存のコレクションから必要なタグだけを取得することはできません。また、タグの自動補完システムに直近の1時間または最後の日からの新しいタグが含まれていない場合や、MapReduceジョブが頻繁に実行される場合は、おそらく気にしません。

+0

私はそれについて考えていませんでしたが、おそらくこれが最善のアプローチです: 'out:{merge:" tagIndexes "}'を使用して、それをリアルタイムで照会してください。ありがとう! – Roberto

+0

私はまったく別のことをやってしまいましたが、あなたの答えは私がMap/Reduceの良い使い方を理解する助けになりました。ありがとう! – Roberto

関連する問題