Atlas Search 查询性能
在此页面上
考虑查询操作符和查询复杂性
Atlas Search 查询的复杂程度和使用的操作符类型会影响数据库性能。包含多个子句的高度复杂查询需要大量资源,使用regex (正则表达式)操作符的查询也是如此。
复合查询
如果您的查询包含多个嵌套复合声明,请确保这些声明不是多余的。如果以编程方式添加子句,请考虑在应用程序中实现逻辑,避免在查询中包含冗余子句。 mongot
对每个字段执行的每次分数计算(例如针对must
和should
子句)都会增加执行时间。
分面搜索
您可以使用 Atlas Search 分面收集器提取元数据,避免对搜索结果和元数据运行多个查询。有关示例,请参阅元数据和搜索结果示例。
对结果进行评分
Atlas Search 查询按分数排名。返回大量结果的查询的计算量更大,因为它们必须跟踪结果集的所有分数。
使用$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 词元筛选器,它通过连接相邻单词构成单个词元来支持基于单词的自动完成。 要了解更多信息,请参阅如何将 Autocomplete 与 Atlas Search 结合使用教程。 | |
文本输入的模糊匹配 | Atlas Search text 和 autocomplete 操作符支持 fuzzy 匹配以过滤输入文本并处理拼写错误的词语(错别字)。 | |
基于多个字符串的筛选 | Atlas Search复合支持基于多个字符串的筛选。 | |
相关性分数排序搜索 | Atlas Search 使用 BM25 算法 用于确定文档的搜索相关性分数。它支持通过乘法和高斯衰减等 boost 表达式以及分析器、搜索运算符和同义词进行高级配置。要了解更多信息,请参阅 如何使用加权字段运行 Atlas Search 复合查询。 | |
部分索引 | Atlas Search 不支持部分索引。 | |
局部匹配 | Atlas Search wildcard 和 autocomplete 操作符支持部分匹配查询。要了解详情,请参阅如何运行部分匹配 Atlas Search 查询。 | |
数组上的单一复合索引 | Atlas Search 的多个词语索引可以合并在单个 Atlas Search 索引中进行查询,无需创建复合索引来对数组进行过滤。 | |
同义词搜索 | Atlas Search 支持在单独的集合中定义同义词,您可以在搜索索引中引用这些同义词。要了解更多信息,请参阅如何在 Atlas Search 中使用同义词教程。 | |
计数分面 | Atlas Search 可以基于文本条件快速计数文档,而且支持对数字和日期进行分面搜索。要了解详情,请参阅如何在 Atlas Search 中使用分面。 | |
提取元数据 | 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 进行全文正则表达式查询— 描述如何使用
$search
替换低效的正则表达式匹配,以提高文本查询的性能。
$match
在 之后避免使用$search
在 $search 阶段之后使用 $match 聚合管道阶段会大幅减慢查询结果的速度。如果可能,请设计$search
查询,以便所有必要的筛选都发生在$search
阶段,从而不再需要$match
阶段。
Atlas Search复合操作符可帮助处理需要多个筛选操作的查询。如果必须在聚合管道中使用$match
阶段,请考虑使用StoredSource选项,仅存储$match
条件所需的字段。然后,您可以使用returnStoredSource选项检索存储的字段。
$group
在 之后避免使用$search
$group
在 $search 阶段之后使用 聚合管道阶段可能会减慢查询结果的速度。如果使用$group
获取字段聚合的基本计数,我们建议您改用 阶段内的分 $searchMeta
面 。
$sort
在 之后避免使用$search
在 $search 阶段之后使用 $sort 聚合管道阶段会大幅减慢查询结果的速度。
要对数字、日期或字符串字段进行排序,请使用带有
$search
阶段的sort
选项。要了解更多信息,请参阅对 Atlas Search 结果进行排序。要对地理字段进行排序,请使用near操作符。
要对其他字段进行排序,请使用
$sort
和returnStoredSource字段。
限制在 之后使用$skip
和$limit
$search
如果查询结果很大,则使用$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 从 MongoDB 复制数据,这些数据有助于 Atlas 中衡量的指标,例如getmore操作的次数。
注意
如果集群的资源已紧张或接近可接受性能的限制,请考虑在实施 Atlas Search 功能之前升级到更大的集群层。
继续学习
观看此视频,了解如何使用解释和$搜索 分数详细信息来理解、迭代和改进 Atlas Search 结果。
时长: 5分钟