MongoDB文本索引搜索对于大表中的常用单词来说很慢

kme*_*hta 8 performance full-text-search lazy-evaluation mongodb

我正在为一个服务提供mongodb数据库,该服务支持对具有680万条记录的集合进行全文搜索.

其文本索引包括十个具有不同权重的字段.

指数规范

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

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

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

我可以通过从db查询中省略最常用的单词(即"products"),然后在接收到db找到的记录之后在应用程序端重新应用公共术语过滤器来实现上述场景.所有查询逻辑最好在数据库上发生,但对应用程序端处理开放以获得速度支付.

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

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

kme*_*hta 8

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

如果有人只使用AND搜索来解决MongoDB文本搜索性能问题,只需切换回OR并使用权重控制结果.它可以更好地实现飞跃.

心连心

  • 究竟.如果你在引号中使用搜索词(我认为你的意思是和格式),MongoDB的文本搜索将首先使用文本索引而不是词干,然后检查每个文档以确保(a)两个词都存在,和(b)单词的未被引用的版本与您传入的引用术语相同.这比其他选项(不引用术语)的性能低得多,其中使用了文本索引并且没有第二遍通过每个文件.加权应该考虑排名结果,两个单词只出现在结果上方. (3认同)