2013-03-11 17 views
3

我正在研究需要搜索標題的大量列表的應用程序。理想情況下,我想使用NoSQL,但似乎跨越整個數據庫的文本搜索不如SQL數據庫(請糾正我,如果我錯了)使用mapreduce在NoSQL中進行文本搜索

無論如何,我確實想優化速度搜索。正常的搜索可能足夠快,但我確實需要一個響應式實時搜索和模糊搜索。因此,我只能想到2個approches的:

  1. 裝載在內存標題的整個列表和索引的索引樹或前綴樹

  2. 實現與映射縮減功能的某種類型的索引樹算法。這將是優先考慮的解決方案,但我不確定是否可以完成,或者磁盤空間成本可能會超過收益。

有什麼想法嗎?此外,我不確定「模糊搜索」是使用trie還是使用B +樹最好實現的。

由於「標題」是唯一的。我應該使用完整的標題作爲ID嗎?

回答

2

要有效地做到這一點,你必須通過文字索引你的文字。

換句話說,題爲MapReduce: Simplified Data Processing on Large Clusters將被映射到以下項對象foo

  • MapReduce: Simplified Data Processing on Large Clusters
  • Simplified Data Processing on Large Clusters
  • Data Processing on Large Clusters
  • Processing on Large Clusters
  • on Large Clusters
  • Large Clusters
  • Clusters

如果文本太長,可以將鍵截斷爲給定數量的字符(如24)。

下面是CouchDB的一個代碼示例:

function map(o) { 
    const SIZE = 24; 
    function format(text, begin) { 
    return text.substr(begin, SIZE).toLowerCase(); 
    } 
    const WORD_MATCHER = /\S+/g; 
    while ((match = WORD_MATCHER.exec(o.title))) { 
     var begin = match.index; 
     emit(format(o.title, begin), {position: begin}); 
    } 
} 

然後,如果你問data processdata processZ之間的鍵,你會得到:

{"key": "data processing on large clusters", "id": "foo", "value":{"position": 22}}