2016-02-04 75 views
0

什麼有關MongoDB的文本搜索調整,如果我想這下面MongoDB的文本搜索邏輯

var items = [{ 
    title: 'Fender Jazz Bass Guitar 4 String Barely used' 
}, { 
    title: 'Mark Bass' 
}, { 
    title: 'Fender Telecaster' 
}, { 
    title: 'Fender Double Fat Strat' 
}]; 

db.collection('items').createIndex({ title: 'text'}, function(){}); 

// Using MongooseJS to query 
Items.find({ $text: { $search: 'Fender Jazz Bass Guitar 4 String' }}) 

// After query this it does not return Fender Jazz Bass Guitar 4 String as the top most search result 

我想要的結果的數組第一個元素是Fender Jazz Bass Guitar 4 String Barely used

這甚至可能嗎?還是我不得不另一個更復雜的搜索引擎?

回答

1

文本搜索,默認情況下,匹配分數的順序不會返回匹配的文檔,請參閱documentation。您需要在$ sort階段使用$meta表達式來排序textScore

Item.find({ $text: { $search: 'Fender Jazz Bass Guitar 4 String' }}, {score: {$meta: "textScore"}}).sort({score:{$meta:"textScore"}}) 

排序後,包含Fender Jazz Bass Guitar 4 String Barely used的文檔應該顯示爲結果中的第一個元素。

+0

ahhh!我明白了,這完全有效!謝謝 –

0

在Mongo中使用文本搜索可以搜索單詞(對於包含'Fender'或'Jazz'或'Bass'或'吉他'或'4'或'String'的任何文本索引字段搜索)

如果你想明確這個詞組的出現,使用轉義字符串

{ $text: { $search: "\"Fender Jazz Bass Guitar 4 String\"" } } 

要匹配上一個短語,而不是個別條款的短語慣例,逃脫雙封閉短語引號(\「)

如果短語搜索選項不是你正在尋找的,那麼我不知道一個簡單的方法來完成你正在尋找的東西。可以找到關於結構化搜索的更多信息短語here

*編輯鏈接到MongoDB的文檔和澄清詞

0

您正在尋找的是根據它們與關鍵字相關性對結果進行排序。爲此,mongodb文本搜索會生成meta分數.Meta分數是根據輸入關鍵字的文檔的加權平均分數。您然後可以對這個meta分數結果進行排序。

這是可以做到:

db.yourcollectioname.find({ $text: { $search:"keywords" } }, 
{ score: { $meta: "textScore" } } 
).sort({ score: { $meta: "textScore" } }) 

知道所有你需要遵循成功運行的MongoDB文本搜索查詢,請參閱本文中的步驟:http://codewhoop.com/article/MongoDb%20Text%20Search%20in%20fields%20of%20document

我發現這篇文章非常有用的,你也發現它很有用:)