1

当我在 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 个文档的查询设置了一个限制(),然后它工作得很好。但是,如果我在那里设置限制,对我来说有什么用例,在搜索时使用skip()非常广泛。

另一方面,如果我使用用户 ID 搜索数据,它不包含正则表达式类型查询:

db.collection.ensure_index("userid")
db.collection.find({"userid": 1213444}, {"_id:0", 'user_rank': 1, 'username': 1})

它的工作效率非常高,因为 id 是整数并且非常快。唯一的区别是我在带有正则表达式的位置查询部分使用' like '查询,而我研究过 mongo docs正则表达式在性能方面还不错。

我应该去增加我的服务器上的物理内存,目前是 1.5G,以便有效地使用索引,还是使用Apache Solr搜索引擎,它通过 mongo_connector 索引我所有的 mongo 文档并将数据从 mongodb 同步到 solr(将数据直接索引到 solr 在记忆方面)?

我试图把所有的努力都放在我的问题陈述中,如果我的问题陈述有任何问题,请告诉我,我会尽力改进它。

编辑:我应该使用 mongo 进行弹性搜索吗?因为有索引或无索引搜索结果太慢,比如最大时间显示260ms太高了

4

1 回答 1

1

$regex并不总是使用索引

只有当正则表达式在字符串的开头(即^)有一个锚点并且是区分大小写的匹配时,$regex 才能有效地使用索引。此外,同时 /^a/, /^a. / 和 /^a。$/ 匹配等效字符串,它们具有不同的性能特征。如果存在适当的索引,则所有这些表达式都使用索引;但是,/^a。/ 和 /^a。$/ 更慢。/^a/ 匹配前缀后可以停止扫描。

您必须创建查询才能使用索引。您可以使用解释命令检查是否使用了索引

于 2013-10-18T07:33:40.883 回答