Atlas Search 概述
在此页面上
MongoDB 的 Atlas Search 允许对 Atlas 集群上的数据进行细粒度文本索引和数据查询。它为您的应用程序启用高级搜索功能,无需任何额外的管理或与数据库一起的单独搜索系统。 Atlas Search 提供了几种文本分析器的选项,这是一种丰富的查询语言,它将 $search
和$searchMeta
等 Atlas Search 聚合管道阶段与其他 MongoDB 聚合管道阶段结合使用,并提供基于分数的结果排名。
提示
通过 Atlas Search Playground快速试用 Atlas Search,而无需 Atlas 帐户、集群或集合。要了解更多信息,请参阅文档。
Atlas Search 基础知识
以下概念构成了 Atlas Search 的基础,对于优化您的应用程序至关重要。
索引
在搜索环境中,索引是一种数据结构,以便于搜索的格式对数据进行分类。使用搜索索引,可以更快地检索包含特定术语的文档,而不必扫描整个集合。尽管 Atlas Search 索引和 MongoDB 索引都能加速数据检索,但它们并不相同。就像书本后面的索引一样,搜索索引是术语与包含术语的文档之间的映射。搜索索引还包含其他相关的元数据,例如术语在文档中出现的位置信息。
任何搜索应用程序通常都需要创建至少一个搜索索引。更多信息,请参阅 Atlas Search 索引。
分词器
创建搜索索引时,必须首先将数据转换为词元或术语序列。分析器通过以下步骤来简化此过程,包括:
标记化:将字符串中的单词分解为可索引的标记。例如用空格和标点符号划分句子。
规范化:整理数据,使其呈现方式一致且更易于分析。例如,将文本转换为小写或删除称为停用词的不需要的词。
词干提取:将单词简化为其词根形式。例如,忽略后缀、前缀和复数形式。
分词的细节因语言而异,可能需要做出其他选择。使用哪种分析器取决于您的数据和应用程序。有关更多信息,请参阅使用分析器处理数据。
查询
搜索查询会查阅索引以返回一组结果。搜索查询不同于传统的数据库查询,因为它们旨在满足更一般的信息需求。数据库查询必须遵循严格的语法,而搜索查询可以用于简单的文本匹配,但它也可以查找相似的短语、数字或日期范围,或者使用正则表达式或通配符。
有关更多信息,请参阅 Atlas Search 查询。
评分
每个文档都会收到一个相关性分数,该分数可以按从最高相关性到最低相关性的顺序返回查询结果。在最简单的评分形式中,如果查询词频繁出现在某一文档中,则该文档的评分较高;如果该查询词出现在集合内的很多文档中,则其评分较低。也可以自定义评分。针对特定域定制搜索通常意味着通过以其他方式提升、衰减或修改基于相关性的默认分数来进行自定义。
有关更多信息,请参阅对文档进行评分。
Atlas Search 可用性
Atlas Search 仅适用于运行 MongoDB 4.2 或更高版本的 Atlas 实例。对于某些功能,Atlas Search 可能需要特定的 MongoDB 版本。下表列出了需要特定 MongoDB 版本的 Atlas Search 功能。
Atlas Search 功能 | 适合该功能的 MongoDB 版本 |
---|---|
5.0.4+、6.0+、7.0+ | |
6 。 0 +, 7 。 0 + | |
5.0.6+、6.0+、7.0+ | |
5 。 0 + | |
6 。 0 +, 7 。 0 + | |
6 。 0 +, 7 。 0 + | |
5 。 0 +, 6 。 0 +, 7 。 0 + | |
6 。 0 +, 7 。 0 + | |
6 。 0 +, 7 。 0 + | |
6 。 0 +, 7 。 0 + | |
使用 Atlas CLI 进行 Atlas Search 本地部署 | 6 。 0 +, 7 。 0 + |
6 。 0 。 13 +, 7 。 0 。 5 + |
时间序列集合不支持 Atlas Search。
Atlas Search 架构
Atlas Search mongot
进程使用 Apache Lucene 并在 Atlas 集群中的每个节点上与 mongod
一起运行。mongot
进程:
根据该集合的索引定义中的规则来创建 Atlas Search 索引。
监控变更流以了解文档的当前状态以及您为其定义 Atlas Search 索引的集合的索引更改。
处理 Atlas Search 查询并返回匹配的文档。
存储源架构
如果您在 Atlas Search 索引中定义存储源字段,则mongot
进程会存储指定的字段,并且如果您在查询中指定了 returnStoredSource 选项,则会为匹配的文档直接从mongot
返回存储的这些字段,而不是对数据库执行完整文档查找。
搜索节点架构
对于任何云提供商上的专用(M10
或更高层级)分片和非分片Atlas集群,您可以部署单独的Atlas Search节点,仅运行 mongot
进程以实现工作负载隔离。 Atlas为每个集群或集群上的每个分片部署Atlas Search Nodes。 例如,如果您为具有 3 个分片的集群部署 2 个Atlas Search节点,则Atlas会部署 6 个Atlas Search节点,每个分片 2 个。
单独部署搜索节点具有以下优势:
独立于 MongoDB 集群扩展存储空间。
独立于 MongoDB 扩展查询负载。
部署单独的搜索节点时,mongot
进程将在您可以独立配置的单独搜索节点上运行。
您可以配置搜索节点,使其运行的 mongot
进程,与 Atlas 集群上运行 mongod
进程的数据库节点分开运行。您还可以预配搜索节点的数量,以及为每个搜索节点配置的资源量。
您无法为无服务器集群单独部署搜索节点。要了解有关单独部署搜索节点的更多信息,请参阅用于隔离工作负载的搜索节点。要从用户界面或 API部署搜索节点,请参阅创建集群。
部署单独的搜索节点时,Atlas 会自动为每个 mongot
分配一个mongod
。mongot
会与 mongod
通信,以侦听并同步其所存储索引的索引更改。
如果删除集群上的所有搜索节点,则在处理搜索查询结果时会出现短暂中断。要了解详情,请参阅修改集群。如果删除 Atlas 集群,Atlas 则会暂停,然后删除所有关联的 Atlas Search 部署(mongot
进程)。
注意
用于搜索节点的本地固态硬盘需要 20% 的存储开销来支持索引操作。
Atlas Search 索引
Atlas Search 索引是一种数据结构,它以易于搜索的格式对数据进行分类。它是术语与包含这些术语的文档之间的映射。 Atlas Search 索引可以使用某些标识符更快地检索文档。您必须配置 Atlas Search 索引,才能使用 Atlas Search 查询 Atlas 集群中的数据。
您可在单个字段或多个字段上创建 Atlas Search 索引。我们建议您对经常用于排序或筛选数据的字段建立索引,以便在查询时快速检索包含相关数据的文档。
您可以使用以下方法指定要进行索引的字段:
动态映射,使 Atlas Search 能够自动索引每个文档中支持类型的所有字段。这样会占用磁盘空间,可能对集群性能产生负面影响。
静态映射,可让您有选择地确定要索引的字段。如果字段包含多态数据,Atlas Search 仅对与索引定义中的映射相对应的文档进行索引编制,并忽略包含如下值的文档:与字段的索引定义中指定的映射不对应的值。
虽然 Atlas Search 上存储的数据与 Atlas 集群上的集合中的数据副本不同,Atlas Search 索引仍会占用部分磁盘空间和内存。如果您为包含字符串值的字段启用 store
选项,或在索引中配置存储的源字段,Atlas Search 则会在磁盘上存储指定字段的相同副本,而此副本可能会占用磁盘空间。
Atlas Search 提供内置分析器,用于创建可索引术语,纠正标点符号、大写、停用词等方面的差异。分析器会在查询中应用解析规则和语言规则。您还可以使用可用的内置字符筛选器、分词器和令牌筛选器创建自定义分析器。要了解有关内置和自定义分析器的更多信息,请参阅使用分析器处理数据。
要进一步了解 Atlas Search 对其他数据类型的支持情况,请参阅数据类型。mongot
进程在磁盘上按索引存储集群上集合的索引字段和 _id
字段。
如果您更改现有索引,Atlas Search 无需停机即可重建索引。这允许您继续将旧索引用于现有查询和新查询,直到索引重建完成。如果部署了单独的搜索节点,Atlas Search 还会为以下事件重建索引:
添加搜索节点
扩展搜索节点
内部
mongot
发生变更时,需要重新同步索引(例如,某些 Atlas Search 功能需要索引更新)
如果您部署了单独的搜索节点,则 Atlas 会在索引重建期间自动部署额外的搜索节点,以使旧索引保持最新状态并在构建新索引时可用于查询。
如果您对为其定义 Atlas Search 索引的集合进行更改,最新数据可能无法立即用于查询。但是,mongot
会监控变更流,使其能够更新存储的数据副本,Atlas Search 索引最终也会保持一致。
注意
注意
Atlas Search 不支持使用 Atlas 用户界面中的 Customer Key Management(客户密钥管理)通过加密密钥对 Atlas Search 索引进行加密。
为集合设置 Atlas Search 索引后,您可以对已建立索引的字段运行查询。
Atlas Search 查询
Atlas Search 查询采用聚合管道阶段的形式。Atlas Search 提供 $search
和 $searchMeta
阶段,二者都必须是查询管道中的第一个阶段。这些阶段可与查询管道中的其他聚合管道阶段结合使用。要了解有关这些管道阶段的更多信息,请参阅选择聚合管道阶段。
Atlas Search 还提供查询运算符和收集器,而您可在 $search
和 $searchMeta
聚合管道阶段使用它们。Atlas Search 运算符允许您从 Atlas 集群上的集合中查找和检索匹配的数据。收集器会返回一个代表搜索元数据结果的文档。
您可以使用 Atlas Search 操作符来查询词、短语、地理形状和点、数值、类似文档、同义词等。您还可以使用正则表达式和通配符表达式进行搜索。 Atlas Search 复合 操作符允许您在 阶段中组合多个操作符,以根据 Atlas$search
Search 返回的文档中 必须 、 不得 或 应该 存在的内容执行复杂的数据搜索和过滤。您还可以使用 复合 运算符在$search
阶段匹配或筛选文档。在$match
$search
} 之后运行 的性能低于使用$search
复合 运算符运行 。
要了解有关 Atlas Search 操作符的事务语法、选项和用法的详情,请参阅在 Atlas Search 查询中使用操作符和收集器。
运行查询时,Atlas Search 会使用配置的读取偏好来识别运行查询的节点。查询首先进入 MongoDB 进程,对于副本集集群为mongod
,对于分片集群为mongos
。对于分片集群,您的集群数据跨mongod
实例进行分区,并且每个mongot
仅了解同一节点上的mongod
数据。因此,您无法运行针对特定分片的查询。 mongos
将查询定向到所有分片,使这些查询成为分散聚集查询。如果您使用区域将分片集合分布在集群中的一部分分片上,则 Atlas Search 会将查询路由到包含您正在查询的集合的分片的区域,并仅对满足以下条件的分片运行$search
查询:集合所在的位置。
MongoDB 进程会将查询路由到同一节点上的 mongot
。Atlas Search 执行搜索和评分,并将匹配结果的文档 ID 和其他搜索元数据返回 mongod
。然后,mongod
对匹配结果隐式执行完整文档查找,并将结果返回客户端。
注意
Atlas Search 会将基于相关性的分数与结果集中的每个文档相关联。基于相关性的评分允许 Atlas Search 按从最高分到最低分的顺序返回文档。如果查询词频繁出现在某一文档中,Atlas Search 则会将此文档评为较高分;如果该查询词出现在集合内的很多文档中,则其评分较低。Atlas Search 还支持通过提升、衰减或其他修改选项来自定义基于相关性的默认分数。要了解有关自定义所生成分数的更多信息,请参阅对结果中的文档进行评分。
搜索节点成本
MongoDB 支持在专用( M10
或更高)集群上使用单独的搜索节点。搜索节点部署在计算密集型 NVMe 实例上。您必须至少部署两个节点。每天将按每个节点的每小时资源使用量向您收费。要了解更多信息,请参阅搜索节点成本。
后续步骤
要获得创建 Atlas Search 索引和对示例数据集运行 Atlas Search 查询的实践经验,请尝试MongoDB University 上的 Atlas Search 课程和以下页面中的教程:
喜欢通过观看视频来学习?
观看 Atlas 和 Atlas Search 的概述,并开始为您的数据设置 Atlas Search。该视频演示了如何在集群上加载样本数据、创建 Atlas Search 索引以及使用 Search Tester 和 Data Explorer 运行样本查询。
时长:10 分钟