2016-07-05 66 views
15

我使用MongoDB的,我有文件具有以下結構的集合:指數邊界上蒙戈的正則表達式搜索

{ 
    fName:"Foo", 
    lName:"Barius", 
    email:"[email protected]", 
    search:"foo barius" 
} 

我建立將執行在search場正​​則表達式搜索功能。爲了優化性能,我將這個集合編入了搜索字段。但是,事情還是有點慢。於是我就在樣品上查詢的explain():獲勝的計劃下

db.Collection.find({search:/bar/}).explain(); 

看,我看到以下指標範圍:

"search": [ 
     "[\"\", {})", 
     "[/.*bar.*/, /.*bar.*/]" 
] 

第二組是有道理的 - 它看起來從任何含有酒吧任何包含酒吧。但是,第一套讓我感到困惑。它看起來在""的範圍內,包括{}排他性。我擔心這個額外的邊界會減慢我的查詢速度。是否有必要保持?如果不是,我如何防止它被包含?

+0

有同樣的問題,你有沒有找到解釋? – kirhgoff

+0

@kirhgoff您正在使用哪個版本的mongoDB? – barbakini

+0

@kirhgoff你在用什麼'mongoDB native'或'mongoose'。檢查一下 - http://voidcanvas.com/mongoose-vs-mongodb-native/ –

回答

5

我認爲這只是mongodb使用正則表達式的方式(請參閱https://scalegrid.io/blog/mongodb-regular-expressions-indexes-performance/)。只要注意nscanned/totalKeysExamined值,如果它太大,那麼索引對您的查詢就沒用了。

參見: MongoDB, performance of query by regular expression on indexed fields

+0

同意,如MongoDB文檔和https://stackoverflow.com/a/33219393中所述/ 8291949如果您的正則表達式不是「前綴表達式」,mongo將全面掃描索引中的鍵,然後將獲取匹配的文檔(應該比完整的集合掃描更快)。 – wp78de

0

這是蒙戈可與這種類型的正則表達式和索引的方式。我的意思是你正在搜索/ bar /而不是/^bar /。

當您在該字段上指定索引時,它將從第一個字符開始編制索引。因此,「Foo barius」從F開始索引。由於您正在搜索字段中的任何位置的「bar」,因此您必須搜索該字段上的整個索引,查找* bar *。

您的解釋中的第一行指出查看索引中的每條記錄。

第二行說,給我只能從那些索引(1)在他們酒吧。底線:設計您的記錄,以便他們有效地使用索引。對於字符串,請確保您的搜索位於字符串的開頭,例如/^bar /。如果我要按姓氏搜索,則需要首先在索引字段中進行搜索。

作爲練習,請在/^bar /上進行說明。你不會得到你的數據,但是第一個索引邊界將會是/^bar/to/^ bas /。

我希望我的意識流有幫助。

UDude

-1

想到我會加我兩分錢。

前面兩個答案是正確的。如果從頭開始搜索,則正則表達式只能使用標準索引。實際上,使用正則表達式搜索索引和搜索可能會對搜索產生不利影響,因爲它嘗試使用索引但不會成功。

還有一種類型的索引可能對您的情況有用。 Mongo的文本索引。它的索引基於空間的每一個字,所以這將是能夠做到兩個詞「foo」和「barius」,這可能是一個索引更多使用

下面是該文檔: https://docs.mongodb.com/manual/core/index-text/