当我在mongo中进行查询时,我的数据库中有 ~~200万个文件,其中包含:
db.collection.ensure_index("location")
db.collection.find({"location.name": {"$regex": 'norway', "$option": 'i'}}, {"_id:0", 'userid': 1, 'username': 1})
用于位置搜索的mongo文档示例:
Mongodb document: {"location": {id:3235726, name: Oslo, Norway }}
在索引中我没有指定 cache_time 部分,它使用默认值。现在,它显示了 2或4秒之后的数据非常糟糕,而且当它找不到任何位置时最糟糕的部分则是 25秒用于搜索操作。我使用python time.time()方法映射了这个时间。然后我在查询上只放置了100个文档的 limit(),然后它运行得有点好。但是如果我在那里设置限制,那么使用 skip()的搜索是非常广泛的。
另一方面,如果我使用userid搜索数据,它不包含正则表达式类型查询:
db.collection.ensure_index("userid")
db.collection.find({"userid": 1213444}, {"_id:0", 'user_rank': 1, 'username': 1})
它非常有效,因为id是整数且非常快。唯一的区别是我正在使用' 喜欢'使用正则表达式查询位置查询部分,我研究了mongo docs 正则表达式在性能方面也不错。
我应该在我的服务器上增加物理内存(当前为1.5G)以便有效地使用索引或使用 Apache Solr 搜索引擎,该搜索引擎通过mongo_connector将所有mongo文档编入索引并将数据从mongodb同步到solr (将数据直接索引到solr在内存方面非常广泛)?
我试图将所有的努力都放在我的问题陈述中,如果我的问题陈述有任何问题然后告诉我,我可以尽力改进它。
编辑:我应该使用mongo进行elasticsearch吗?因为有索引或没有索引搜索结果太慢,比如显示 260ms 的最大时间太高
答案 0 :(得分:1)
$regex
并不总是使用索引
$ regex只能在正则表达式具有字符串开头(即^)的锚点时有效地使用索引,并且是区分大小写的匹配。另外,当/ ^ a /,/^a。 /和/^a.$/匹配等效字符串时,它们具有不同的性能特征。如果存在适当的索引,则所有这些表达式都使用索引;但是,/ ^ a。 /,和/^a。 $ /更慢。 / ^ a /可以在匹配前缀后停止扫描。
您必须创建查询才能使用索引。您可以检查该索引是否与explain命令一起使用