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