【问题标题】:MongoDB text index search slow for common words in large tableMongoDB文本索引搜索大表中的常用词很慢
【发布时间】:2013-07-22 16:04:44
【问题描述】:

我正在为一项服务托管一个 mongodb 数据库,该服务支持对包含 680 万条记录的集合进行全文搜索。

它的文本索引包括十个不同权重的字段。

大多数搜索不到一秒钟。有些搜索需要两到三秒钟。但是,有些搜索需要 15 - 60 秒!我的申请无法接受 15-60 秒的搜索案例。我需要找到一种方法来加快这些速度。

当在搜索查询中使用索引中非常常见的词时,搜索需要 15-60 秒。

我好像文本搜索功能不支持惰性参数。我的第一个想法是在我的文本索引中缓存 50 个最常见单词的列表,然后要求 mongodb 评估最后一个(惰性)并在不太常见的参数返回的过滤结果之上。希望人们还在我身边。例如,假设我有一个查询“产品巧克力”,其中产品是常见的,而巧克力是不常见的。我希望能够让 mongodb 先评估“巧克力”,然后用“产品”术语过滤这些结果。有谁知道实现这一目标的方法?

我可以通过从 db 查询中省略最常用的词(即“products”),然后在收到 db 找到的记录后在应用程序端重新应用常用词过滤器来实现上述场景。最好是所有查询逻辑都发生在数据库上,但对应用程序端处理开放以加快速度。

这个设计还有一些漏洞。如果用户只搜索常用术语,我别无选择,只能将所有术语都打到数据库中。从初步阅读来看,我认为不建议(或不支持)在同一个集合上拥有多个文本索引(具有不同的名称)。我的计划是创建两个相同的表,每个表都有我的 680 万条记录,具有不同的索引 - 一个用于常用词,一个用于不常用词。这感觉很笨拙,但我愿意这样做以提高速度。

有没有人对如何加速这个系统有任何见解和/或建议。我希望在数据库上进行尽可能多的处理以保持快速。我确信我的 6.8M 小记录表不是 mongodb 见过的最大的。谢谢!

【问题讨论】:

  • 现在是 2018 年(5 年后),mongodb 仍然存在完全相同的问题 :(
  • 因为这与 mongo 通过实现这一点对性能的显着影响相结合,我们确定以这种方式使用 mongo 不是“支持”或“预期”的主要用途,我们决定放弃完全蒙戈。对不起,冷水。
  • 您是否发现随着时间的推移,写记录变得越来越慢?你最后加了索引吗?

标签: performance mongodb full-text-search lazy-evaluation


【解决方案1】:

我通过允许 MongoDB 全文搜索以基于 OR 的格式搜索来解决这些性能问题。我通过微调索引字段的权重并仅按排名排序来确定我的结果的优先级。我确实得到了比预期更多的结果,但这不是一个大问题,因为我出现在顶部的加权结果很可能会在我的用户在底部获得不太相关的结果之前被消耗掉。

如果有人在仅使用 AND 搜索的 MongoDB 文本搜索性能方面遇到困难,只需切换回 OR 并使用权重控制您的结果。它的飞跃性能更好。

【讨论】:

  • 没错。如果您在引号中使用搜索词(我认为这是 AND 格式的意思),MongoDB 的文本搜索将首先使用文本索引而不是词干词,然后检查每个文档以确保 (a) 两个词都存在, 和 (b) 单词的无词干版本与您传入的引用术语相同。这比使用文本索引且没有第二遍的其他选项(不引用术语)的性能要差得多通过每个文档。权重应该注意排名结果,两个词都出现在上面的结果中。
【解决方案2】:

这与 $all 与 $in 完全相同。 $all 仅使用数组中第一个关键字的索引。我相信你在这里看到了同样的问题,为什么 OR a.k.a. IN 适合你。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-12
    • 2013-06-24
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    • 1970-01-01
    • 1970-01-01
    • 2022-12-22
    相关资源
    最近更新 更多