2012-02-14 100 views
0

短版:我需要得到匹配/web/不同的標籤或任何其他條款的數組對於這個問題,出了Posts收藏。「自動完成」標籤與MapReduce的


我對執行MapReduce模式來提供「自動完成」字段存在懷疑。你認爲這是最好的方法嗎?

Posts收藏有像證件:

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

給定的搜索,如/web/,我想有這樣的結果:["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/} 
}); 

我正在考慮將標籤存儲在不同的集合中,只是定期搜索它們,但我似乎找到了多年RDBMS學習留下的殘留直覺。我也不知道這些類型的查詢的性能或其他含義,對於這種情況,文檔似乎不是很有用。

謝謝!


我最終什麼事做

我其實只是結束了使用的MapReduce進行的分析說標籤。

我將它們按照所描述的方式存儲在不同的集合中,負責將其歸一化爲基本的ASCII(即,沒有重音和諸如此類)用於正則表達式搜索,並且保留原始術語。然後,我將tag對象ID引用到另一個集合中的post id。

所有這些我變成了一個不同的應用程序來服務於不同的客戶端。它原來是我特別需要的最佳解決方案。

回答

0

我認爲Map/Reducing the tags into a different collection聽起來很合理。

您無法實時運行Map/Reduce查詢。而且,您不能使用標準的「查找」查詢來獲取您想要從現有集合中獲取的標籤。而且您可能不在乎自己的代碼自動完成系統是否在最後一小時或最後一天不包含新代碼,或者您的MapReduce作業經常運行。

+0

我還沒有想過,但也許這是最好的方法:使用'out:{merge:「tagIndexes」}'並實時查詢。謝謝! – Roberto 2012-02-15 23:27:33

+0

我最終做了一件完全不同的事情,但你的回答幫助我找到了Map/Reduce的一個很好的用法。謝謝! – Roberto 2012-02-23 08:56:22