2017-02-26 68 views
13

前比方說,我有一個蒙戈集合與text indexitemName場與這3個文件:

{ 
    _id: ..., 
    itemName: 'Mashed carrots with big carrot pieces', 
    price: 1.29 
}, 
{ 
    _id: ..., 
    itemName: 'Carrot juice', 
    price: 0.79 
}, 
{ 
    _id: ..., 
    itemName: 'Apple juice', 
    price: 1.49 
} 

然後我Exec中查詢,像這樣:

db.items.find({ $text: { $search: 'Car' } }, { score: { $meta: "textScore" } }).sort({ score: { $meta: "textScore" } }); 

如何強制蒙戈以與「汽車」(不區分大小寫)開始返回文件之前返回任何其他文檔還包含「汽車」一些在itemName字符串中哪裏?

所以我要檢索的文檔按以下順序:

[ 
    {..., itemName: 'Carrot Juice', ...}, 
    {..., itemName: 'Mashed carrots with big carrot pieces', ...} 
] 

當然,這是指在一個搜索功能,不僅可以使用,所以它非常有意義,顯示項目開始與用戶之前顯示任何其他項目之前他的搜索字符串。

到目前爲止我使用的是標準正則表達式,但是這裏的性能當然要差很多! +因爲我必須搜索不區分大小寫,根據文檔,正常的正則表達式根本不使用任何索引?!

編輯:

而且,有時$text行爲是非常奇怪的。 例如,我有大約10-15件商品,其中itemName以「Zwiebel」開頭。 該查詢

db.items.find({ $text: { $search: "Zwiebel" }, supplier_id: 'iNTJHEf5YgBPicTrJ' }, { score: { $meta: "textScore" } }).sort({ score: { $meta: "textScore" } }); 

的作品就像一個魅力並返回所有這些文件,而這個查詢

db.items.find({ $text: { $search: "Zwie" }, supplier_id: 'iNTJHEf5YgBPicTrJ' }, { score: { $meta: "textScore" } }).sort({ score: { $meta: "textScore" } }); 

不返回任何!只有在$search中將「Zwiebel」更改爲「Zwie」。

我真的不明白這怎麼可能?!

最好,P

+0

它,當你排序的textScore有什麼影響? –

+0

請檢查我的編輯! :-) 謝謝! –

+0

@PatrickDaVader看到我的編輯 – felix

回答

7

一種解決方案是使用$indexOfCP操作者在introcuced MongoDB的3。4

這個操作符返回一個字符串的發生指數在另一個字符串,和-1如果沒有occurence

它是如何工作的:

  1. 過濾掉不包含的所有文件「汽車」有一個正則表達式:/car/gi(情況inensitive)
  2. 創建一個名爲index存儲「車」的itemName
  3. 排序文件索引的場場

查詢將是這樣的:

db.items.aggregate([ 
    { 
     $match:{ 
     itemName:/car/gi 
     } 
    }, 
    { 
     $project:{ 
     index:{ 
      $indexOfCP:[ 
       { 
        $toLower:"$itemName" 
       }, 
       "car" 
      ] 
     }, 
     price:1, 
     itemName:1 
     } 
    }, 
    { 
     $sort:{ 
     index:1 
     } 
    } 
]) 

,這將返回:

{ "_id" : 2, "itemName" : "Carrot juice", "price" : 0.79, "index" : 0 } 
{ "_id" : 1, "itemName" : "Mashed carrots with big carrot pieces", "price" : 1.29, "index" : 7 } 

編輯:

對於$text指數的行爲,這是完全正常的

使用定界符(默認分隔符是空格和標點)的文本索引標記化文本。它只能用於搜索整個世界,因此它不會對詞

的分部從mongodb text index documentation

$文本的工作將使用空格和最 標點符號作爲分隔符標記化的搜索字符串,並在搜索字符串執行邏輯或全部令牌 。

+0

感謝您的回覆!請檢查我在OP中的編輯!謝謝! –