Docs 菜单
Docs 主页
/
Atlas
/ / / /

$search

$search

$search 阶段对指定的一个或多个字段执行全文搜索。这些字段必须由 Atlas Search 索引覆盖。

$search 管道阶段采用以下原型形式:

{
$search: {
"index": "<index-name>",
"<operator-name>"|"<collector-name>": {
<operator-specification>|<collector-specification>
},
"highlight": {
<highlight-options>
},
"concurrent": true | false,
"count": {
<count-options>
},
"searchAfter"|"searchBefore": "<encoded-token>",
"scoreDetails": true| false,
"sort": {
<fields-to-sort>: 1 | -1
},
"returnStoredSource": true | false,
"tracking": {
<tracking-option>
}
}
}

$search 阶段采用包含以下字段的文档:

字段
类型
必要性
说明

<collector-name>

对象

可选的

用于查询的收集器名称。您可以提供一个包含收集器特定选项的文档作为该字段的值。必须提供此项或 <operator-name>

concurrent

布尔

Optional

专用搜索节点上并行搜索各分段。如果您的集群上没有单独的搜索节点,Atlas Search 会忽略此标志。如果省略,则默认值为 false。要了解详情,请参阅并行查询各分段

count

对象

Optional

文件,用于指定检索结果计数的计数选项。 要了解更多信息,请参阅 Count Atlas 搜索结果。

highlight

对象

Optional

指定在原始上下文中显示搜索词的高亮选项的文档。

index

字符串

Optional

要使用的 Atlas Search 索引的名称。如果省略,则默认值为 default

如果将索引命名为 default,则在使用 $search 管道阶段时无需指定 index 参数。如果您为索引指定了自定义名称,则必须在 index 参数中指定此名称。

如果您写错索引名称,或者指定的索引在集群上尚不存在,则 Atlas Search 不会返回结果。

<operator-name>

对象

可选的

搜索使用的操作符名称。您可以提供一个包含操作符特定选项的文档作为该字段的值。必须提供此项或 <collector-name>。使用 compound 操作符可运行包含多个操作符的复合查询。

returnStoredSource

布尔

Optional

标志,指定是对后端数据库执行完整文档查找,还是直接从 Atlas Search 仅返回存储的源字段。如果省略,则默认值为 false。 要了解详情,请参阅返回已存储源字段

searchAfter

字符串

Optional

用于检索结果的参考点。searchAfter 返回紧随指定参考点之后开始的文档。参考点必须是由 $meta 关键字 searchSequenceToken 生成的 Base64 编码令牌。如要了解详情,请参阅对结果进行分页。此字段与 searchBefore 字段互斥。

searchBefore

字符串

Optional

用于检索结果的参考点。searchBefore 返回在指定参考点之前开始的文档。参考点必须是由 $meta 关键字 searchSequenceToken 生成的 Base64 编码令牌。要了解详情,请参阅分页结果。此字段与 searchAfter 字段互斥。

scoreDetails

布尔

Optional

标志,指定是否检索结果中文档得分的明细。如果省略,则默认值为 false。要查看详情,必须在 $project 阶段中使用 $meta 表达式。要了解更多信息,请参阅返回得分详情。

sort

对象

Optional

文档,指定按升序或降序对 Atlas Search 结果进行排序的字段。您可以按日期、数字(整数、浮点数和 double)和字符串值排序。要了解详情,请参阅对 Atlas Search 结果进行排序

tracking

对象

Optional

指定用于检索搜索词相关分析信息的跟踪选项的文档。

警告

This is now deprecated. The official end-of-life and complete removal of support will take effect on December 5, 2025. Therefore, Atlas will no longer collect query data for display in the Atlas UI starting on this date and the UI for this feature will be removed. If you have any questions or need further assistance, contact support or your Account Executive.

$search 必须是其所在的任何管道中的第一阶段。$search 不能用于以下场合中:

  • 视图定义

  • $facet 管道阶段

$search 仅返回查询结果。$search 查询的元数据结果保存在 $$SEARCH_META 聚合变量中。您可以使用 $$SEARCH_META 变量查看 $search 查询的元数据结果。

$$SEARCH_META 聚合变量可以用在任何管道中 $search 阶段之后的任何地方,但不能用在任何管道中 $lookup$unionWith 阶段之后。从 MongoDB 6.0 开始,$$SEARCH_META 聚合变量不能在 $searchMeta 阶段之后的任何后续阶段使用。

例子

假设 sample_mflix.movies 集合上有如下索引。

{
"mappings": {
"dynamic": false,
"fields": {
"released": {
"type": "date"
}
}
}
}

以下查询使用 $search 阶段搜索在 2011 年 9 月 01 日前后上映的电影。查询包括:

  • $project 阶段,用来排除文档中除 titlereleased 之外的所有字段。

  • $facet 阶段,将输出:

    • docs 字段,其中包含由前 5 项搜索结果组成的数组

    • meta 值为$$SEARCH_META变量的字段

db.movies.aggregate([
{
"$search": {
"near": {
"path": "released",
"origin": ISODate("2011-09-01T00:00:00.000+00:00"),
"pivot": 7776000000
}
}
},
{
$project: {
"_id": 0,
"title": 1,
"released": 1
}
},
{ "$limit": 5 },
{
"$facet": {
"docs": [],
"meta": [
{"$replaceWith": "$$SEARCH_META"},
{"$limit": 1}
]
}
}
])
{
"docs" : [
{
"title" : "Submarino",
"released" : ISODate("2011-09-01T00:00:00Z")
},
{
"title" : "Devil's Playground",
"released" : ISODate("2011-09-01T00:00:00Z")
},
{
"title" : "Bag It",
"released" : ISODate("2011-09-01T00:00:00Z")
},
{
"title" : "Dos",
"released" : ISODate("2011-09-01T00:00:00Z")
},
{
"title" : "We Were Here",
"released" : ISODate("2011-09-01T00:00:00Z")
}
],
"meta" : [
{ "count" : { "lowerBound" : NumberLong(17373) } }
]
}

要了解有关 $$SEARCH_META 变量及其用法的更多信息,请参阅:

如果您在使用 Atlas Search $search 查询时遇到问题,请参阅查询问题排查。

后退

选择聚合管道阶段

在此页面上