【问题标题】:Mongoose speed up the search on multiple fieldsMongoose 加快了多个字段的搜索速度
【发布时间】:2017-01-25 10:34:41
【问题描述】:

我正在开发 mongoose 文档的搜索功能,我必须搜索超过 250,000 个文档。 在此功能中,我必须在多个字段上添加搜索索引。 在文档中,一些字段是字符串类型, 有些是多层次的对象。 我已经索引了所有可能的字段。

在本地,我有 100,000 个文档,当我搜索它们时,大约需要 300-400 毫秒。 但是当我在服务器上搜索它们时,大约需要 10-15 秒才能做出响应。

搜索查询是基于条件的,但我正在共享一个小代码 sn-p。

   $and(

{
    $or:[
        {'field1': {$regex: re }},
        {'field2': {$regex: re }},
        {'level1.level2.value': {$regex: re }}
    ]
},
{
    $and:[ 
        {
            lowAge: {$lte: parseInt(age)}
        },
        {
            highAge: {$gte: parseInt(age)}
        },
        {
            $or:[
                {
                   gender:gender
                },
                {
                   gender:"N/A"
                }
            ]
        }
    ]
}
 )

有人可以建议我如何加快服务器上的进程。

【问题讨论】:

  • 我的猜测是您的服务器在 RAM、CPU 或(可能)两者方面的性能不足。您使用的是哪种实例类型?此外,正则表达式查询可能非常慢,即使使用索引也是如此。如果可能,尽量避免它们。
  • 除正则表达式之外的任何你知道的替代方法
  • 这完全取决于您的查询/正则表达式的样子。
  • 还是要看re是什么。
  • @robertkelp 我们在一个集群中有三个实例,每个实例都有 4gb 内存和可爆 CPU。读取应该分布在它们之间,而写入将始终转到当前主节点。

标签: node.js mongodb amazon-ec2 mongoose mongoose-schema


【解决方案1】:

为了进一步加快速度,您可以使用文本索引。

但文本索引附带以下存储要求和性能成本

  • 文本索引可能很大。它们为插入的每个文档的每个索引字段中的每个唯一后置词包含一个索引条目。
  • 构建文本索引与构建大型多键索引非常相似,并且比在相同数据上构建简单的有序(标量)索引需要更长的时间。 在现有集合上构建大型文本索引时,请确保对打开的文件描述符有足够高的限制。查看推荐的设置。
  • 文本索引会影响插入吞吐量,因为 MongoDB 必须为每个新源文档的每个索引字段中的每个唯一后置词添加一个索引条目。
  • 此外,文本索引不存储有关文档中单词接近度的短语或信息。因此,当整个集合适合 RAM 时,短语查询的运行效率会更高。

请参阅以下参考资料

https://docs.mongodb.com/manual/core/index-text/

https://www.tutorialspoint.com/mongodb/mongodb_text_search.htm

希望对你有帮助!

【讨论】:

  • 我在其他集合中使用过猫鼬文本搜索,因为我认为它适用于字符串类型的字段。现在我必须像这样搜索字段,所以我可以在我刚刚在新编辑中添加的代码上定义文本索引。 “疾病”:[{“疾病”:[{“价值”:“囊性纤维化”}],“名称”:“CG”},{“疾病”:[{“价值”:“囊性 xx”}], “名称”:“CI”},{“疾病”:[{“价值”:“囊性 xx”}],“名称”:“CI”} {“疾病”:[{“价值”:“囊性 yys” }],"名称": "CI"} ],
  • 是的,文本搜索仅适用于字符串类型。我们需要创建一次索引,因此请尝试在 mongo shell 中创建它,当您在 mongo shell/mongoose 或通过任何其他方式执行 find 查询时,它将在您的搜索查询中使用。
  • @varun - 您可以删除性别的$or 条件,因为它只能接受 3 个值 Male、Female 或 N/A,并且您已在查询中包含所有这些选项。所以不需要 $or 操作,因为无论性别是否存在,我们都会在这两种情况下获取记录。
猜你喜欢
  • 2021-02-10
  • 2013-05-07
  • 2023-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-14
  • 1970-01-01
  • 2013-07-14
相关资源
最近更新 更多