我使用Mongodb来存储全世界的位置列表,记录超过2M。每条记录都是这样的对象:
{ "_id" : ObjectId("4e5b339feee76320ab26f930"), "city" : "New York", "longitude" : -87.2008333, "latitude" : 30.8383333, "country_code" : "US", "country_name" : "United States" }
我想执行搜索以使所有“CITIES”包含“纽约”,我花了大约10秒才得到结果(这在我的网络系统中是不可接受的)。我使用ensureIndex()函数索引了“city”,但查询仍然很慢。
这是我的问题:
db.locations.find({"city": { "$regex": "(New York)", "$options": 'i' }})
我猜问题是“正则表达式”。你可以建议我一个解决方案,以便在2-3秒内获得查询结果(我在MySQL中有超过4M的记录,类似的查询只用了1-2秒 - 带索引)。
谢谢和问候。
答案 0 :(得分:8)
你不能在没有使用regexp或javascript的情况下使用mongodb中的包含操作进行搜索(由于没有索引的工作,它们很慢)。
我可以建议以小写字母存储其他城市,并按完全匹配搜索。如果您想要“包含”和快速,则应使用其他全文搜索引擎,例如solr或lucene。
答案 1 :(得分:3)
我建议使用多键。
示例:
{ title : "this is fun" ,
_keywords : [ "this" , "is" , "fun" ]
}
然后你可以使用
db.articles.findOne( { _keywords: "this" } )
这会更快
答案 2 :(得分:2)
mongo在使用不区分大小写的搜索时不使用regexp的索引,因此我建议您使用大写或小写存储字段并使用相同的搜索。
而不是搜索,如果您搜索以下面的内容开头
db.locations.find({“city”:{“$ regex”:/ ^ New York /}})
您的查询将快速返回。
了解更多信息
http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-RegularExpressions