Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Docs 菜单
Docs 主页
/
Atlas
/ /

Atlas Search 查询性能

Atlas Search 查询的复杂程度和使用的 操作符类型可能会影响数据库性能。

高度复杂的查询,例如包含多个子句并使用复合操作符的查询,或使用 regex(正则表达式)或通配符操作符的查询,会消耗大量资源。

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

您可以使用Atlas Search facet(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 支持许多语言分析器,这些分析器可以对语言进行分词(创建可搜索词)、删除停用词并解释变音符号以提高搜索相关性。

不区分大小写的文本搜索

$search 的功能多于 $regex

突出显示结果文本

Atlas Search highlighting 可以将结果中的文档置于上下文中,这对于自然语言查询至关重要。

地理空间感知搜索查询

MongoDB $regex 和 Atlas Search $search 对地理空间参数的处理方式不同。在 MongoDB 中,坐标之间的线是球面弧线,这非常适合长距离坐标,例如空中飞行。Atlas Search 使用 Lucene,坐标之间的线是直线,非常适合短距离。

本地部署

Atlas Search不可用于本地部署部署。Atlas Search仅适用于Atlas 集群上的数据。

自动完成搜索查询

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

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

文本输入的模糊匹配

Atlas Search textautocomplete 操作符支持 fuzzy 匹配以过滤输入文本并处理拼写错误的词语(错别字)。

基于多个字符串的筛选

Atlas Search compound 支持基于多个字符串进行过滤。

相关性分数排序搜索

部分索引

Atlas Search通过使用带有 $match表达式的视图来支持部分索引。要学习;了解更多信息,请参阅示例:筛选文档。

局部匹配

Atlas Search wildcardautocomplete 操作符支持部分匹配查询。

数组上的单一复合索引

Atlas Search 的多个词语索引可以合并在单个 Atlas Search 索引中进行查询,无需创建复合索引来对数组进行过滤。

同义词搜索

Atlas Search 支持在单独的集合中定义同义词,您可以在搜索索引中引用这些同义词。如要了解更多信息,请参阅如何在 Atlas Search 中使用同义词教程。

计数分面

Atlas Search 可以基于文本条件快速计数文档,而且支持对数字和日期进行分面搜索。要了解详情,请参阅如何在 Atlas Search 中使用分面

Extract metadata

Atlas Search facet(Atlas Search操作符)收集器会返回元数据,并且不要求您运行多个查询来检索元数据。要学习;了解更多信息,请参阅如何在Atlas Search中使用分面教程。

自定义分析器

Atlas Search 支持自定义分析器以满足您的特定索引要求。例如,可以使用自定义分析器对电子邮件地址和 HTTPHTTPS URL 编制索引并进行搜索。

搜索短语或多个单词

Atlas Search phrase 操作符支持搜索词语序列。

使用正则表达式进行搜索

当您改用 Atlas Search 自动完成操作符时,Atlas Search 可以提高性能。

提示

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

例子

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

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

请尝试将整个搜索逻辑封装在 $search 阶段内,并尽量减少使用额外的阻塞阶段,例如 $group$count$match$sort。这优化了 Atlas Search 索引的使用,并减少了在 mongod 中进行额外数据库操作的需要。

对于需要多个过滤操作的查询,请将 compound 操作符和 filter 子句结合使用。如果必须在聚合管道中使用 $match 阶段,请考虑使用 storedSource 选项,仅存储 $match 条件所需的字段。然后,您可以使用 $searchreturnStoredSource选项来检索存储的字段,并避免进行 mongod 全文档查找。

如果使用 获取字段聚合的基本计数,则可以在$group 阶段内使用facet (Atlas Search Operator)。$search如果您只需要元数据结果,则可以改为在 阶段内使用facet (Atlas Search操作符) $searchMeta

如果您使用 $count 来获取文档数,我们建议您改用 $search$searchMeta 阶段内的计数

  • 要对数字、日期、字符串、布尔值、UUID 和 objectID 字段进行排序,请使用 sort 选项与 $search 阶段。要了解详情,请参阅对 Atlas Search 结果进行排序

  • 要对地理字段进行排序,请使用 near 操作符。

  • 要对其他字段进行排序,请使用 $sortreturnStoredSource字段。

如果查询结果较多,使用 $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 分钟

后退

索引