Atlas Search 查询性能
在此页面上
考虑查询操作符和查询复杂性
Atlas Search 查询的复杂程度和使用的 操作符类型可能会影响数据库性能。具有多个子句的高度复杂查询会占用大量资源,使用 regex(正则表达式)或通配符操作符的查询也是如此。
复合查询
如果您的查询包含多个嵌套复合声明,请确保这些声明不是多余的。如果以编程方式添加子句,请考虑在应用程序中实现逻辑,避免在查询中包含冗余子句。 mongot
对每个字段执行的每次分数计算(例如针对must
和should
子句)都会增加执行时间。
分面搜索
您可以使用 Atlas Search 分面收集器提取元数据,避免对搜索结果和元数据进行多次查询。有关示例,请参阅元数据和搜索结果示例。
对结果进行评分
Atlas 搜索查询按分数排序。返回大量结果的查询需要更多的计算,因为它们必须跟踪结果集的所有分数。
使用 $search
而不是 $text
或 $regex
对于严重依赖于 MongoDB$text
和 $regex
查询的应用程序,请使用以下建议确定是重构应用程序,还是将应用程序迁移到 Atlas Search $search
。$search
聚合管道阶段提供的功能无法通过 MongoDB 操作符使用,或者可以通过 MongoDB 操作符使用,但性能不如 Atlas Search $search
。
下表显示了 MongoDB $regex
、$text
和 Atlas Search $search
如何满足应用程序的要求。
如果应用程序需要…… | 使用…… | 因为…… |
---|---|---|
数据存储遵循写关注 | ||
针对写入性能优化的集群 | Atlas Search 索引不会降低集群写入性能。 | |
搜索大型数据集 | Atlas Search 使用倒排索引,可以实现海量数据的快速文档检索。 | |
语言认知 | Atlas Search 支持许多语言分析器,这些分析器可以对语言进行分词(创建可搜索词)、删除停用词并解释变音符号以提高搜索相关性。要了解更多信息,请参阅如何运行多语言 Atlas Search 查询。 | |
不区分大小写的文本搜索 | ||
突出显示结果文本 | Atlas Search highlighting 可以将结果中的文档置于上下文中,这对于自然语言查询至关重要。 | |
地理空间感知搜索查询 | MongoDB $regex 和 Atlas Search $search 对地理空间参数的处理方式不同。在 MongoDB 中,坐标之间的线是球面弧线,这非常适合长距离坐标,例如空中飞行。Atlas Search 使用 Lucene,坐标之间的线是直线,非常适合短距离。要了解详情,请参阅 如何运行 Atlas Search 复合地理 JSON 查询。 | |
本地部署 | Atlas Search 不能用于本地部署。Atlas Search 仅适用于 Atlas 集群上的数据。 | |
自动完成搜索查询 | 对于字符 (nGrams) 的自动完成,Atlas Search 包括: 对于单词 (wordGrams) 的自动完成,Atlas Search 包括 shingle 词元筛选器,它通过连接相邻单词构成单个词元来支持基于单词的自动完成。 要了解详情,请参阅如何在 Atlas Search 中使用自动完成教程。 | |
文本输入的模糊匹配 | ||
基于多个字符串的筛选 | Atlas Search compound 支持基于多个字符串进行过滤。 | |
相关性分数排序搜索 | Atlas Search 使用 BM25 算法 来确定文档的搜索相关性分数。它支持通过 boost 表达式(如乘法和高斯衰变)进行高级配置,还支持分析器、search 操作符和同义词。要了解更多信息,请参阅如何使用加权字段运行 Atlas Search 复合查询。 | |
部分索引 | Atlas Search 不支持部分索引。 | |
局部匹配 | ||
数组上的单一复合索引 | Atlas Search 的多个词语索引可以合并在单个 Atlas Search 索引中进行查询,无需创建复合索引来对数组进行过滤。 | |
同义词搜索 | Atlas Search 支持在单独的集合中定义同义词,您可以在搜索索引中引用这些同义词。如要了解更多信息,请参阅如何在 Atlas Search 中使用同义词教程。 | |
计数分面 | ||
Extract metadata | Atlas Search 分面收集器会返回元数据,不需要运行多个查询来检索元数据。要了解详情,请参阅如何在 Atlas Search 中使用分面。 | |
自定义分析器 | Atlas Search 支持自定义分析器以满足特定索引编制要求。例如,可以使用自定义分析器对电子邮件地址和 HTTP 或 HTTPS URL 编制索引并进行搜索。要了解详情,请参阅如何定义自定义分析器和运行 Atlas Search 不区分变音符号的查询。 | |
搜索短语或多个单词 | Atlas Search phrase 操作符支持搜索词语序列。 | |
使用正则表达式进行搜索 | 当您改用 Atlas Search 自动完成操作符时,Atlas Search 可以提高性能。 |
提示
另请参阅:
使用 Atlas Search 更新 $text 查询以提高搜索性能 - 介绍了如何将查询中的
$text
聚合管道阶段替换为$search
,以提高这些查询的灵活性和性能。使用 Atlas Search 进行全文 regex 查询- 介绍如何用
$search
代替低效的 regex 匹配,以提高文本查询的性能。
在 $facet
之前使用 $limit
在 $facet
聚合管道阶段后使用 $limit
聚合管道阶段可能会对查询性能产生负面影响。为避免性能瓶颈,请在 $facet
之前使用 $limit
。
例子
{ { "$search": {...} }, { "$limit": 20 }, { "$facet": { "results": [], "totalCount": $$SEARCH_META } } }
有关演示,请参阅以下示例:
避免在 $search
之后使用 $match
在 $search 阶段之后使用 $match 聚合管道阶段会大幅减慢查询结果的速度。如果可能,请设计您的$search
查询,以便所有必要的筛选都发生在$search
阶段,从而不再需要$match
阶段。
Atlas Search 复合操作符可帮助处理需要多次过滤操作的查询。如果必须在聚合管道中使用 $match
阶段,请考虑使用 storedSource 选项,仅存储 $match
条件所需的字段。然后您可以使用 returnStoredSource 选项来检索存储的字段。
避免在 $search
之后使用 $group
$group
在 $search 阶段之后使用聚合管道阶段会降低查询结果的速度。如果使用 $group
来获取字段聚合的基本计数,我们建议您使用 $searchMeta
阶段内的分面来代替。
避免在 $search
之后使用 $count
在 $search 阶段之后使用 $count
聚合管道阶段可能会降低查询结果的速度。如果您使用 $count
来获取文档数,我们建议您改用 $search
或 $searchMeta
阶段内的计数。
避免在 $search
之后使用 $sort
在 $search 阶段之后使用 $sort 聚合管道阶段可能会大大降低查询结果的速度。
若要对数字、日期或字符串字段进行排序,请在
$search
阶段使用sort
选项。要了解详情,请参阅对 Atlas Search 结果进行排序。要对地理字段进行排序,请使用 near 操作符。
要对其他字段进行排序,请使用
$sort
和returnStoredSource字段。
在 $search
之后限制使用 $skip
和 $limit
如果查询结果较多,使用 $skip
和 $limit
按顺序检索结果可能会比较慢。为了获得最佳性能,请使用 $search
searchAfter
或 searchBefore
选项对结果进行分页。要了解详情,请参阅 对结果进行分页。
要返回非顺序结果,例如从第 2 页跳转到第 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 分钟