查询引用
管道阶段
Atlas Search查询采用 聚合管道阶段 的形式。 Atlas Search提供 $search
和 $searchMeta
阶段,这两个阶段都必须是任何查询管道(包括 $lookup
和 $unionWith
子管道)中的第一阶段。这些阶段可与查询管道中的其他 聚合管道阶段 结合使用。
根据所选的管道阶段,查询返回全文搜索的搜索结果或关于搜索结果的元数据:
聚合管道阶段 | 用途 |
---|---|
返回全文搜索的搜索结果。 | |
返回关于搜索结果的元数据。 |
运算符和收集器
Atlas Search还提供可在 $search
和$searchMeta
聚合管道阶段中使用的查询操作符和收集器。 Atlas Search操作符允许您从Atlas 集群上的集合中查找和检索相关数据。收集器返回表示搜索元数据结果的文档。
您可以使用Atlas Search操作符来查询词、短语、地理形状和点、数值、类似文档、同义词等。
您还可以使用正则表达式和通配符表达式搜索。 Atlas Search 复合 运算符允许您在 阶段中组合多个操作符,以根据Atlas$search
Search返回的文档中 必须 、 不得 或 应该 出现的内容执行复杂的数据搜索和过滤。您还可以使用 复合 运算符在$search
$search
阶段匹配或过滤文档。在$match
$search
之后运行 的性能低于使用 复合 运算符运行 的性能。
要学习;了解有关操作符和收集器的更多信息,请参阅操作符和收集器。
查询处理
mongod
和mongot
在同一节点上当您运行查询时,Atlas Search 会使用配置的读取偏好来确定运行查询的节点。该查询首先进入 MongoDB 进程,对于副本集集群为
mongod
,对于分片集群为mongos
。对于副本集集群,MongoDB 进程将查询路由到同一节点上的
mongot
。对于分片集群,您的集群数据跨mongod
实例进行分区,并且每个mongot
仅了解同一节点上的mongod
数据。因此,您无法运行针对特定分片的 Atlas Search 查询。mongos
将查询定向到所有分片,使这些查询成为分散聚集查询。如果您使用区域将分片集合分布到集群中的一部分分片上,则 Atlas Search 将查询路由到包含所查询的集合分片的区域,并仅对该集合所在的分片运行$search
查询。Atlas Search 会执行搜索和评分,并将匹配结果的文档 ID 和其他搜索元数据返回
mongod
。然后,mongod
将对匹配结果隐式执行完整文档查找,并将结果返回客户端。如果在查询中使用$search
并发选项,则 Atlas Search 将启用查询内并行机制。要了解更多信息,请参阅并行查询各分段。mongod
和mongot
在不同节点上运行查询时,查询会首先根据配置的读取偏好进入
mongod
。mongod
进程通过同一节点上的负载均衡器路由搜索查询,以便将请求分发到所有mongot
进程。Atlas Search
mongot
进程执行搜索和评分,并将匹配结果的文档 ID 和元数据返回到mongod
。然后,mongod
对匹配结果执行完整文档查找,并将结果返回客户端。如果在查询中使用$search
并发选项,则 Atlas Search 将启用查询内并行机制。要了解更多信息,请参阅并行查询各分段。
评分
Atlas Search 会将基于相关性的分数与结果集中的每个文档相关联。基于相关性的评分允许 Atlas Search 按从最高分到最低分的顺序返回文档。如果查询词频繁出现在某一文档中,Atlas Search 则会将此文档评为较高分;如果该查询词出现在集合内的很多文档中,则其评分较低。Atlas Search 还支持通过提升、衰减或其他修改选项来自定义基于相关性的默认分数。要了解有关自定义所生成分数的更多信息,请参阅对结果中的文档进行评分。
另请参见:通过观看了解
支持的客户端
您可以使用以下客户端创建并运行Atlas Search查询:
查询故障排除
空结果集
mongot
不返回任何错误,但在以下情况下返回空结果集: $search
查询:
引用了不存在的索引。如果您不在查询中按名称指定索引, Atlas Search默认使用名为
default
的索引。如果您没有名为default
的索引,或者您指定的索引不存在,则Atlas Search不会返回错误而是返回空结果设立。您可以使用index
选项按名称指定有效索引。指定非索引字段。 如果您对未编入索引的字段运行查询,Atlas Search 不会返回错误并返回空结果集。您必须仅指定索引字段作为
path
参数的值。 您可以在集合的索引定义中启用动态映射,以确保自动为集合中的所有可动态索引的字段编制索引。 要了解更多信息,请参阅动态映射。在未索引为
string
类型的字段路径(Field Path)上使用text
操作符。如果字段被索引为string
以外的 Atlas Search 字段类型(例如stringFacet
或autocomplete
,则 Atlas Search 不会返回错误并返回空结果集。 您必须使用string
BSON数据类型值作为字符串类型对字段进行索引,才能使用文本操作符查询字段。
PlanExecutor
错误
mongot
如果$search
查询出现以下情况,则会返回PlanExecutor
错误:
指定作为不正确数据类型进行索引的字段。在这种情况下,如果您运行查询,Atlas Search 会返回一条错误消息,标识索引不正确的字段及其正确的数据类型。例如:
PlanExecutor error during aggregation :: caused by :: Cannot facet on field "genres" because it was not indexed as a "stringFacet" field. 例如,要对
string
、number
或date
字段运行分面(Facet)查询,请分别使用相应的 Atlas Search 字段类型(例如stringFacet
、number
和date
为字段创建索引。要了解详情,请参阅支持和不支持的数据类型。