MongoDB 文本索引搜索大表中常见单词的速度很慢

2023-12-24

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

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

大多数搜索只需要不到一秒钟的时间。有些搜索需要两到三秒。然而,有些搜索需要 15 - 60 秒! 15-60秒的搜索案例对于我的应用来说是不可接受的。我需要找到一种方法来加快速度。

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

我似乎文本搜索功能不支持惰性参数。我的第一个想法是在我的文本索引中缓存 50 个最常见单词的列表,然后要求 mongodb 评估最后的(懒惰的)以及不太常见的参数返回的过滤结果。希望人们仍然和我在一起。例如,假设我有一个查询“产品巧克力”,其中产品很常见,而巧克力不常见。我希望能够要求 mongodb 首先评估“巧克力”,然后使用“产品”术语过滤这些结果。有谁知道如何实现这一目标?

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

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

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


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

如果有人在仅使用 AND 搜索时遇到 MongoDB 文本搜索性能问题,只需切换回 OR 并使用权重控制结果即可。它的跳跃性能更好。

hth

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MongoDB 文本索引搜索大表中常见单词的速度很慢 的相关文章

  • mongoid 中的嵌入文档与哈希数据类型

    我找不到任何讨论此问题的博客文章或文档 它们 嵌入式文档和哈希数据类型 非常相似 彼此相比有何好处或限制 考虑我的架构设计 class HistoryTracker include Mongoid Document include Mong
  • 将 mongo 数组转换为具有键值对的对象

    我有一个包含字符串数组的 mongo 文档 我需要将这个特定的字符串数组转换为包含键值对的对象数组 以下是我目前的做法 id ObjectId 57e3720836e36f63695a2ef2 platform A1 available C
  • 嗖嗖 - 访问 search_page 结果项会引发 ReaderClosed 异常

    下面是一个简单的分页函数 from whoosh import index def search q wix index open dir settings WHOOSH INDEX DIR term Term title q Term c
  • Python 惰性迭代器

    我试图了解迭代器表达式如何以及何时被求值 以下似乎是一个懒惰的表达 g i for i in range 1000 if i 3 i 2 然而 这个在构造上失败了 g line strip for line in open xxx r if
  • 多文档事务在使用 mongodb 4.08 社区服务器的 C# 中不起作用

    我需要使用 mongodb 事务更新多个文档 mongodb 社区服务器版本是 4 08 net 的 mongodb 驱动程序是 2 9 beta 也尝试过 2 8 从调试中 我可以看到它执行了 session AbortTransacti
  • 为 MongoDB 中的对象数组建立索引

    我有一个巨大的电子邮件转储 我正在尝试在 MongoDB 中存储和查询它 有 160 万封电子邮件 每封电子邮件都存储为节点模块 https github com andris9 mailparser它将原始电子邮件解析为漂亮的 Javas
  • 在java中将RFC3339 DateTime转换为Date [重复]

    这个问题在这里已经有答案了 如何转换RFC 3339 https www rfc editor org rfc rfc3339java 中的 com google api client util DateTime 到 DateTime 例如
  • 有没有办法提高linux管道的性能?

    我正在尝试使用 64 位将超高速数据从一个应用程序传输到另一个应用程序CentOS http en wikipedia org wiki CentOS6 我使用以下方法进行了基准测试dd发现阻碍我的是管道而不是程序中的算法 我的目标是达到
  • MongoDB 存储过程等效项

    我有一个包含商店列表的大型 CSV 文件 其中一个字段是邮政编码 我有一个名为 ZipCodes 的独立 MongoDB 数据库 它存储任何给定邮政编码的纬度和经度 在 SQL Server 中 我将执行一个名为 InsertStore 的
  • 为什么在 data.frame 中预先指定类型会比较慢?

    我预先分配了一个大 data frame 以便稍后填写 我通常这样做NA是这样的 n lt 1e6 a lt data frame c1 1 n c2 NA c3 NA 我想知道如果我预先指定数据类型是否会让事情变得更快 所以我测试了 f1
  • 为关联数组选择哪种映射类型?学说ODM

    我有一个关于 顺便说一句 真的很棒 Doctrine ODM 的简单问题 假设您有一个类似以下的文档 Document class Test Id public id WHICHTYPE public field array 现在我想存储一
  • C++ OpenCV imdecode 慢

    我将图像的字节数组从 C 发送到 C 库 我使用 OpenCV 版本 3 3 1 解码图像 BMP 图像解码速度很快 但 JPEG 图像解码速度很慢 如何加快 JPEG 图像的解码时间 多线程 GPU 解码性能 Resolution For
  • 如何使用 Java2D 创建硬件加速图像?

    我正在尝试创建一个快速图像生成器 它可以执行大量 2d 转换和形状渲染 因此我尝试使用 BufferedImage 然后获取 Graphics2D 对象来执行所有绘图 我现在主要关心的是 make 速度非常快 所以我创建一个像这样的 Buf
  • CoreAnimation 性能分析 - CAReplicatorLayer 与 CAShapeLayer

    我正在制作一个依赖 CoreAnimation 的应用程序 它有一个 CAReplicatorLayer 和一个 CAShapeLayer 作为子层 当进行 12 次复制 然后对路径进行动画处理 在 touchMoved 上更改它 时 一旦
  • 为什么在 this 方法中添加 If 语句会大大降低速度?

    我在中遇到过这个回答另一个问题 https stackoverflow com questions 12233594 faster way to apply alpha to a jpeg in an android app 我试图诊断哪些
  • 如何清除chrome性能条目或绕过其数量限制?

    我使用 Google Chrome 来分析一些使用 Javascript 动态加载脚本和其他资源的网页的性能 我用performance getEntries 方法 但我注意到 Chrome 只记录前 150 个资源 我找不到任何方法来获取
  • 为什么我的代码在编译用于分析 (-pg) 时在多线程下运行比在单线程下运行慢?

    我正在写一个光线追踪器 最近 我在程序中添加了线程 以利用 i5 四核上的附加内核 奇怪的是 应用程序的调试版本现在运行速度变慢 但优化后的构建运行速度比添加线程之前更快 我将 g pg 标志传递给 gcc 以进行调试构建 并将 O3 标志
  • 非规范化如何提高数据库性能?

    我听说过很多关于非规范化的内容 它是为了提高某些应用程序的性能而进行的 但我从来没有尝试过做任何相关的事情 所以 我只是好奇 规范化数据库中的哪些地方会使性能变差 或者换句话说 非规范化原则是什么 如果我需要提高性能 如何使用此技术 非规范
  • 国外收藏的查找和排序

    所以我有一个收藏users 并且此集合中的每个文档以及其他属性都有另一个集合中文档的 id 数组 workouts 集合中的每个文档workouts有一个名为date 这就是我想要得到的 对于特定用户 我想要获取属于该用户的锻炼的 work
  • 我必须做什么才能使通过 HTTPS 提供的图像等内容缓存在客户端?

    我使用 Tomcat 作为服务器 使用 Internet Explorer 6 作为浏览器 我们应用程序中的网页大约有 75 张图像 我们正在使用 SSL 加载所有内容似乎非常慢 如何配置 Tomcat 以便 IE 缓存图像 如果您通过 h

随机推荐