我使用Mongodb来存储世界各地的位置列表,有超过200万条记录。每条记录都是一个对象,如下所示:
{ "_id" : ObjectId("4e5b339feee76320ab26f930"), "city" : "New York", "longitude" : -87.2008333, "latitude" : 30.8383333, "country_code" : "US", "country_name" : "United States" }
我想执行搜索来找出所有包含“纽约”的“城市”,我花了大约10秒钟才得到结果(这在我的网络系统中是不可接受的)。我已经使用ensureIndex()函数为"city“建立了索引,但是查询仍然很慢。
下面是我的问题:
db.locations.find({"city": { "$regex": "(New York)", "$options": 'i' }})
我猜问题出在“正则表达式”上。你能给我一个解决方案,让我在2-3秒内得到查询结果(我在MySQL中有超过4M条记录,类似的查询只用了1-2秒-带索引)。
谢谢并致以问候。
发布于 2011-08-29 17:29:51
如果不使用regexp或javascript,你不能在mongodb中使用contain操作进行搜索(它们很慢,因为没有索引)。
我可以建议以小写存储额外的城市,并按完全匹配进行搜索。如果你想要“包含”和更快的速度,你应该使用其他一些全文搜索引擎,如solr或lucene。
发布于 2011-08-29 19:40:40
我建议使用多个键。
示例:
{ title : "this is fun" ,
_keywords : [ "this" , "is" , "fun" ]
}
然后你就可以使用
db.articles.findOne( { _keywords: "this" } )
这样会更快
发布于 2011-08-29 21:07:37
Mongo在不区分大小写的情况下进行搜索时,不会将索引用于regexp。我建议你用大写或小写存储你的字段,并使用相同的搜索。
如果你搜索,不是搜索,而是像下面这样开始
db.locations.find({"city": { "$regex": /^New York/}})
您的查询将快速返回。
有关更多信息,请访问RegularExpressions
https://stackoverflow.com/questions/7228018
复制相似问题