Docs 菜单
Docs 主页
/
MongoDB Atlas
/ /

Atlas Search 查询性能

在此页面上

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

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

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

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

Atlas 搜索查询按分数排序。返回大量结果的查询需要更多的计算,因为它们必须跟踪结果集的所有分数。

对于严重依赖于 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 词元筛选器,它通过连接相邻单词构成单个词元来支持基于单词的自动完成。

要了解详情,请参阅如何在 Atlas Search 中使用自动完成教程。

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

提示

另请参阅:

$facet 聚合管道阶段后使用 $limit 聚合管道阶段可能会对查询性能产生负面影响。为避免性能瓶颈,请在 $facet 之前使用 $limit

例子

{
{
"$search": {...}
},
{ "$limit": 20 },
{
"$facet": {
"results": [],
"totalCount": $$SEARCH_META
}
}
}

有关演示,请参阅以下示例:

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

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

提示

另请参阅:

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

$search 阶段之后使用 $count 聚合管道阶段可能会降低查询结果的速度。如果您使用 $count 来获取文档数,我们建议您改用 $search$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 功能之前考虑升级到更大的集群层。

提示

另请参阅:

跟随本视频学习如何使用 explain$search score details 来了解、迭代和改进 Atlas Search 结果。

时长:5 分钟

后退

索引