2011-08-29 70 views
2

我使用Mongodb存儲世界上超過2M記錄的位置列表。每個記錄是這樣的對象:Mongodb按正則表達式查詢

{ "_id" : ObjectId("4e5b339feee76320ab26f930"), "city" : "New York", "longitude" : -87.2008333, "latitude" : 30.8383333, "country_code" : "US", "country_name" : "United States" } 

我想執行的搜索,獲得了所有的「城市」包含「紐約」,我花了大約10秒有結果(這是不可接受的我網絡系統)。我使用ensureIndex()函數爲「城市」建立了索引,但查詢仍然很慢。

這裏是我的查詢:

db.locations.find({"city": { "$regex": "(New York)", "$options": 'i' }}) 

我想這個問題是 「正則表達式」。你能否爲我提供一個解決方案,以便在2-3秒內獲得查詢結果(我在MySQL中有超過4M的記錄,類似的查詢只需1-2秒 - 帶有索引)。

感謝和問候。

回答

8

如果不使用正則表達式或javascript(因爲沒有索引的工作,它們很慢),您無法在mongodb中使用包含操作進行搜索。

我可以建議以小寫字母存儲更多城市,並通過完整匹配進行搜索。如果你想'包含'和快速,你應該使用一些其他全文搜索引擎,如solrlucene

+0

偉大的答案!謝謝! – ofecrpnr

+0

@ofecrpnr:不客氣。 –

3

我建議使用多鍵。

例如:

{ title : "this is fun" , 
    _keywords : [ "this" , "is" , "fun" ] 
} 

那麼你可以使用

db.articles.findOne({ _keywords: "this" }) 

這將是更多更快

2

蒙戈不使用正規表達式指數當它與搜索的情況下不區分大小寫所以我建議您可以使用大寫字母或小寫字母來存儲字段,並使用相同的字符進行搜索。

而不是包含如果搜索中包含

db.locations.find({ 「城市」:{ 「$正則表達式」:/ ^紐約/}})開始搜索

查詢將快速返回。

更多信息
http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-RegularExpressions