2012-03-29 48 views
3

我正在創建一個自動完成服務,針對我的mongo db文章集合,其中用戶可以開始輸入文章的標題。它應該在標題中返回所有包含該關鍵字的帖子,並按「總計」字段進行排序。有沒有辦法優化mongo中的自動完成關鍵字查詢

我有一個名爲「lower」的字段,它是我們想要搜索的標題字段的小寫版本,並且它有一個索引集。由於我正在尋找任何關鍵字匹配,我正在對lowerCaseTitle進行正則表達式搜索,以查找出現在標題中任何位置的單詞,而不僅僅是在開頭。

我看着執行計劃,它看起來像掃描每個項目(完整的文章集合有10061項)。我試圖暗示「lower_1」索引和「total_-1」索引,它們看起來很相似,但如果我爲查詢設置了50個限制數,那麼總體索引似乎更好,而且帶有較低的已掃描數字。有什麼我可以做的優化?對於這種全文搜索,我無法想到任何簡單的事情。

"cursor" : "BtreeCursor lower_1", 
    "nscanned" : 10061, 
    "nscannedObjects" : 2, 
    "n" : 2, 
    "scanAndOrder" : true, 
    "millis" : 154, 
    "nYields" : 0, 
    "nChunkSkips" : 0, 
    "isMultiKey" : false, 
    "indexOnly" : false, 
    "indexBounds" : { 
     "lower" : [ 
      [ 
       "", 
       { 

       } 
      ] 
     ] 
    } 

回答

6

我做對lowerCaseTitle正則表達式搜索任何地方出現的稱號,不只是在一開始的話。

documentation

對於簡單的前綴查詢(也稱爲紮根的正則表達式),如/^prefix/,數據庫使用索引時可用的和適當的(就像使用大多數SQL數據庫一個LIKE 'prefix%'表達式的索引)。這隻有在標誌中沒有i(不區分大小寫)的情況下才有效。

換句話說,不,MongoDB不支持快速搜索子字符串。

但是,你可以做以下的支持開始給定的字符串的話:現在

BlogPost { 
    Title : "This is furiously interesting post" 
    TitleSearch : [ "this", "is", "furiously", "interesting", "post" ] 
} 

,與TitleSearch索引和使用紮根正則表達式,用於'inter'搜索將返回的樣本,也爲'furious' ,但不適用於'eresting'

+0

我想我會做一個&&匹配匹配多個單詞搜索...有沒有建​​議如何使精確匹配首先顯示?因此,「這是瘋狂的」在先說「這是瘋狂的」和「這是瘋狂的」之前會首先展示上面的例子嗎? – MonkeyBonkey 2012-03-29 23:16:27

+0

我不這麼認爲。如果您需要更高的保真度,我認爲最好使用搜索專用解決方案,例如SolR,該解決方案還支持詞幹,分面搜索,結果排名以及更多與搜索相關的功能。 – mnemosyn 2012-03-30 07:11:31

相關問題