Docs 菜单
Docs 主页
/
MongoDB Atlas
/ /

Atlas Search 查询性能

在此页面上

  • 考虑查询操作符和查询复杂性
  • 使用 $search而不是$text$regex
  • $match在 之后避免使用$search
  • $group在 之后避免使用$search
  • $sort在 之后避免使用$search
  • 限制在 之后使用$skip$limit$search
  • 监控性能
  • 继续学习

Atlas Search 查询的复杂程度和使用的操作符类型会影响数据库性能。包含多个子句的高度复杂查询需要大量资源,使用regex (正则表达式)操作符的查询也是如此。

如果您的查询包含多个嵌套复合声明,请确保这些声明不是多余的。如果以编程方式添加子句,请考虑在应用程序中实现逻辑,避免在查询中包含冗余子句。 mongot对每个字段执行的每次分数计算(例如针对mustshould子句)都会增加执行时间。

您可以使用 Atlas Search 分收集器提取元数据,避免对搜索结果和元数据运行多个查询。有关示例,请参阅元数据和搜索结果示例。

Atlas Search 查询按分数排名。返回大量结果的查询的计算量更大,因为它们必须跟踪结果集的所有分数。

对于严重依赖 MongoDB $text$regex查询的应用程序,请使用以下建议来确定是否重构应用程序或将应用程序迁移到 Atlas Search $search$search聚合管道阶段提供的功能要么通过 MongoDB 操作符不可用,要么通过 MongoDB 操作符可用但性能不如 Atlas Search $search

下表显示了 MongoDB $regex$text和 Atlas Search $search如何满足您的应用程序的要求。

如果应用程序需要……
使用……
因为……
数据存储遵循写关注
对于写入后有大量读取操作的事务,建议使用$regex 。对于$search ,写入后读取应该很少见。
针对写入性能优化的集群
Atlas Search 索引不会降低集群写入性能。
搜索大型数据集
Atlas Search 使用倒排索引,可以实现海量数据的快速文档检索。
语言认知
Atlas Search 支持许多语言分析器,这些分析器可以对语言进行分词(创建可搜索词)、删除停用词并解释变音符号以提高搜索相关性。要了解更多信息,请参阅如何运行多语言 Atlas Search 查询
不区分大小写的文本搜索
$search提供的功能比$regex更多。
突出显示结果文本
Atlas Search highlighting 可以将结果中的文档置于上下文中,这对于自然语言查询至关重要。
地理空间感知搜索查询
MongoDB $regex和 Atlas Search $search以不同方式处理地理空间参数。在 MongoDB 中,坐标之间的线是球面线,这非常适合长距离的坐标,例如空中飞行。 Atlas Search 使用 Lucene,坐标之间的线是直线,非常适合短距离。要了解更多信息,请参阅如何运行 Atlas Search 复合地理 JSON 查询。
本地部署
Atlas Search 不能用于本地部署。Atlas Search 仅适用于 Atlas 集群上的数据。
自动完成搜索查询

对于字符 (nGrams) 的自动完成,Atlas Search 包括:edgeGrams 用于从左到右自动完成,nGrams 用于不含空格的语言的自动完成,rightEdgeGram 用于从右到左书写和阅读的语言的自动完成。

对于单词 (wordGrams) 的自动完成,Atlas Search 包括 shingle 词元筛选器,它通过连接相邻单词构成单个词元来支持基于单词的自动完成。

要了解更多信息,请参阅如何将 Autocomplete 与 Atlas Search 结合使用教程。

文本输入的模糊匹配
Atlas Search textautocomplete 操作符支持 fuzzy 匹配以过滤输入文本并处理拼写错误的词语(错别字)。
基于多个字符串的筛选
Atlas Search复合支持基于多个字符串的筛选。
相关性分数排序搜索
Atlas Search 使用 BM25 算法 用于确定文档的搜索相关性分数。它支持通过乘法和高斯衰减等boost 表达式以及分析器、搜索运算符和同义词进行高级配置。要了解更多信息,请参阅 如何使用加权字段运行 Atlas Search 复合查询。
部分索引
Atlas Search 不支持部分索引。
局部匹配
Atlas Search wildcardautocomplete 操作符支持部分匹配查询。要了解详情,请参阅如何运行部分匹配 Atlas Search 查询
数组上的单一复合索引
Atlas Search 的多个词语索引可以合并在单个 Atlas Search 索引中进行查询,无需创建复合索引来对数组进行过滤。
同义词搜索
Atlas Search 支持在单独的集合中定义同义词,您可以在搜索索引中引用这些同义词。要了解更多信息,请参阅如何在 Atlas Search 中使用同义词教程。
计数分面
Atlas Search 可以基于文本条件快速计数文档,而且支持对数字和日期进行分面搜索。要了解详情,请参阅如何在 Atlas Search 中使用分面
提取元数据
Atlas Search 分收集器会返回元数据,并且不要求您运行多个查询来检索元数据。要了解更多信息,请参阅如何在 Atlas Search 中使用分面教程。
自定义分析器
Atlas Search 支持自定义分析器以满足特定索引编制要求。例如,可以使用自定义分析器对电子邮件地址和 HTTPHTTPS URL 编制索引并进行搜索。要了解详情,请参阅如何定义自定义分析器和运行 Atlas Search 不区分变音符号的查询
搜索短语或多个单词
Atlas Search phrase 操作符支持搜索词语序列。
使用正则表达式搜索
当您改用 Atlas Search自动完成操作符时,Atlas Search 的性能将得到改进。

提示

另请参阅:

$search 阶段之后使用 $match 聚合管道阶段会大幅减慢查询结果的速度。如果可能,请设计$search 查询,以便所有必要的筛选都发生在$search 阶段,从而不再需要$match 阶段。

Atlas Search复合操作符可帮助处理需要多个筛选操作的查询。如果必须在聚合管道中使用$match阶段,请考虑使用StoredSource选项,仅存储$match条件所需的字段。然后,您可以使用returnStoredSource选项检索存储的字段。

提示

$group $search 阶段之后使用 聚合管道阶段可能会减慢查询结果的速度。如果使用$group 获取字段聚合的基本计数,我们建议您改用 阶段内的分 $searchMeta面 。

$search 阶段之后使用 $sort 聚合管道阶段会大幅减慢查询结果的速度。

如果查询结果很大,则使用$skip$limit非按顺序检索结果可能会很慢。为获得最佳性能,请使用$search searchAftersearchBefore选项对结果进行分页。要了解更多信息,请参阅对结果进行分页。

要返回非连续结果,例如从第2页跳转到第5页,您可以使用以下管道阶段:

  • $search searchAfter 第2页上的最后一个结果

  • $skip 3和4页上的文档

  • $limit 页面5的结果

此处,您的查询经过优化,仅跳过2页的结果,而不是在未使用searchAfter的情况下跳过4页。

您可以监控您的 Atlas 集群,并在 Atlas Metrics标签页上查看包含性能统计信息的 Atlas Charts。这些指标可以帮助您了解 Atlas Search 搜索查询和索引构建如何影响集群的性能。要了解更多信息,请参阅查看 Atlas Search 指标。

Atlas 可能会在以下情况下触发某些 Atlas警报

  • Atlas Search 会查询集群,这可能会影响 Atlas 性能指标,例如查询定位指标。

    注意

    Atlas Search 进程 ( mongot ) 用于保持 Atlas Search 索引更新的变更流游标可以提高查询目标比率,并在该比率较高时触发查询目标警报

  • Atlas Search 从 MongoDB 复制数据,这些数据有助于 Atlas 中衡量的指标,例如getmore操作的次数。

注意

如果集群的资源已紧张或接近可接受性能的限制,请考虑在实施 Atlas Search 功能之前升级到更大的集群层。

提示

观看此视频,了解如何使用解释$搜索 分数详细信息来理解、迭代和改进 Atlas Search 结果。

时长: 5分钟

← Atlas Search 索引性能