Docs 菜单
Docs 主页
/
Atlas
/

查询和索引

搜索查询和搜索索引之间的关系决定了您使用Atlas Search在MongoDB集合中查找数据的效率和效果。

Atlas 搜索查询指定在数据库中查找文档的条件。Atlas Search 查询采用聚合管道的形式,以$search$searchMeta管道阶段开始。您可以在管道阶段内使用操作符收集器搜索选项来实现复杂的搜索功能,如全文搜索、基于相关性的排名、分面搜索、过滤和排序。

在运行 Atlas Search 查询之前,您必须在要搜索的字段上创建 Atlas Search 索引。搜索索引是经过优化的数据结构,能够快速检索符合查询条件的文档。当您定义搜索索引时,您需要指定要索引的字段以及这些字段应如何进行分词。

有效的搜索查询依赖于正确定义的搜索索引。您要搜索的字段必须建立索引,您的索引配置决定了搜索是否支持排序、分面、自动完成和其他搜索功能。您可以在查询和索引设计上进行迭代,以平衡搜索的准确性和性能。

本页介绍如何规划您的 Atlas Search 搜索体验,并定义 Atlas Search 索引和查询以满足您的搜索需求。

在规划 Atlas Search 实施时,首先定义您希望提供的搜索体验:

  • 明确识别您的应用程序需要执行的搜索类型。您是否正在为需要全文搜索和文章标题自动完成功能的博客网站构建搜索功能,还是为需要分面搜索和按产品类别过滤的电商站点构建搜索功能?

  • 确定用户如何与应用程序交互。优先考虑可增强用户体验的功能,例如快速响应时间或准确的自动完成建议。

然后,考虑以下问题,以帮助根据这些用户需求确定Atlas Search 搜索索引和查询的结构:

在使用 Atlas Search 搜索数据之前,您必须创建一个或多个 Atlas Search 搜索索引,以便在 Atlas Search 查询中使用。本节演示如何在 Atlas Search 索引的 JSON 配置语法中体现您的查询首选项。

要在索引定义中使用本节中的JSON语法,请用有效值替换占位符,并确保完整的索引定义包含必要的选项。

要学习;了解如何将Atlas Search索引添加到Atlas 集群,请参阅Atlas Search快速入门。

1

如果您知道要查询集合中的哪些字段,请启用静态映射,并在 Atlas Search 索引定义中指定这些字段。否则,您可以启用动态映射以自动为受支持类型的所有字段创建索引。

如需了解更多信息,请参阅静态和动态映射

注意

如果您的集合包含 16 MB 或更大的文档,Atlas Search 将无法为您的数据编制索引。当大型文档的更新操作导致变更流事件超过 16MB BSON 限制时,也可能会出现此问题。为避免这种情况,请考虑以下最佳实践:

  • 将您的文档结构化,以减少子文档或数组的大小。

  • 避免执行更新或替换大字段、子文档或数组的操作。

要了解更多信息,请参阅 Change Streams 生产建议减少大型文档的大小。

1{
2 "mappings": {
3 "dynamic": true,
4 "fields": { // Optional, use this to configure individual fields
5 "<field-name>": {
6 "type": "<field-type>",
7 ...
8 },
9 ...
10 }
11 }
12}
1{
2 "mappings": {
3 "dynamic": false, // Optional, if omitted defaults to "false"
4 "fields": {
5 "<field-name>": {
6 "type": "<field-type>",
7 ...
8 },
9 ...
10 }
11 }
12}
2

如果您有特殊的语言或解析要求,则可以应用索引定义:

指定对analyzer searchAnalyzer、 或fields.<field-name>.analyzer 字段中要索引的字符串字段应用哪些内置分析器。

1{
2 "analyzer": "<index-analyzer-name>", // top-level index analyzer, used if no analyzer is set in the field mappings
3 "searchAnalyzer": "<search-analyzer-name>", // query text analyzer, typically the same as the index analyzer
4 "mappings": {
5 "dynamic": <boolean>,
6 "fields":{
7 "<field-name>": [
8 {
9 "type": "string",
10 "analyzer": "<field-analyzer-name>" // field-specific index analyzer
11 }
12 ]
13 }
14 }
15}

字段中为Atlas Search索引定义自定义分析器。analyzers

1{
2 "analyzers": [
3 {
4 "name": "<custom-analyzer-name>",
5 "tokenizer": {
6 "type": "<tokenizer-type>"
7 }
8 },
9 ...
10 ]
11}

synonyms 字段中具有相同或相似意义的术语定义同义词

1{
2 "synonyms": [
3 {
4 "name": "<synonym-mapping-name>",
5 "source": {
6 "collection": "<source-collection-name>"
7 },
8 "analyzer": "<synonym-mapping-analyzer>"
9 }
10 ]
11}
3

如果您想优化大型数据集上的查询性能,可以将以下选项添加到索引定义中,以限制 Atlas Search 查询必须遍历的数据量:

使用 numPartitions 选项为索引配置分区。当您对索引进行分区时,Atlas Search 会自动以最佳方式在子索引之间分配索引对象。

1{
2 "numPartitions": <integer>,
3}

使用 StoredSource 选项指定Atlas Search必须存储的源文档中的字段。

1{
2 "storedSource": true | false | {
3 "include" | "exclude": [
4 "<field-name>",
5 ...
6 ]
7 }
8}

在为要在集合中搜索的所有字段创建 Atlas Search 索引后,您可以运行 Atlas Search 查询。本节演示如何将您的应用搜索体验的目标JSON 语法在 Atlas Search 查询中实现。

要在 Atlas Search 查询聚合管道中使用本节中的 JSON 语法,请将占位符替换为有效值,并确保完整的查询管道包含所需的 $search 字段$searchMeta 字段

要学习;了解如何运行搜索查询,请参阅Atlas Search快速入门。

1

Atlas Search查询聚合管道的第一阶段必须是 $search$searchMeta 阶段,具体取决于您要搜索的是文档还是元数据:

聚合管道阶段
用途

返回全文搜索的搜索结果。

返回关于搜索结果的元数据。

2

要定义您的搜索条件,您必须将一个或多个操作符收集器应用到您的 $search$searchMeta 管道阶段。

Atlas Search 操作符允许您根据内容、格式或数据类型在 Atlas 集群中查找和检索相关数据。要了解哪些操作符支持每种字段类型的搜索,请查看操作符参考部分中的表格。您必须在操作符的查询路径参数中指定一个或多个索引搜索字段:

1{
2 $search: {
3 "<operator-name>"|"<collector-name>": {
4 <operator-specification>|<collector-specification>
5 }
6 }
7}
[
{
_id: <result-document-id>,
...
},
{
_id: <result-document-id>,
...
},
...
]
1{
2 $searchMeta: {
3 "<operator-name>"|"<collector-name>": {
4 <operator-specification>|<collector-specification>
5 }
6 }
7}
[
{
count: {
total: <results-count>
}
}
]

提示

您可以使用复合操作符将多个操作符组合成一个运算。您还可以使用复合操作符过滤器子句来筛选与给定子句匹配的查询输出。

3

如果您想从 Atlas Search 查询中检索元数据,可以应用以下配置之一来选择元数据结果文档的计数分面(Facet)类型:

要返回搜索结果的总数或下限计数,请在聚合阶段设立计数选项。

$searchMeta 阶段返回 count 元元数据结果,而 $search 阶段将元数据结果存储在 $$SEARCH_META聚合变量中,并仅返回搜索结果。有关如何从 $$SEARCH_META 变量检索count 元元数据结果的示例,请参阅对结果进行计数。

1{
2 "$search" | "$searchMeta": {
3 "<operator-name>": {
4 <operator-specifications>
5 },
6 "count": {
7 "type": "lowerBound" | "total",
8 "threshold": <number-of-documents> // Optional
9 }
10 }
11}

要在聚合阶段运行分面查询(按值或范围对结果进行分组并返回每个组的计数),请使用分面收集器。

$searchMeta 阶段返回facet 元数据结果,而 $search 阶段将元数据结果存储在 $$SEARCH_META 聚合变量中,只返回搜索结果。有关如何从 $$SEARCH_META 变量中检索 facet 元数据结果的示例,请参阅分面结果

1{
2 "$search" | "$searchMeta": {
3 "facet": {
4 "facets": {
5 <facet-definitions>
6 }
7 }
8 }
9}
4

您可以使用以下选项检索有关您的 $search 阶段结果的更多信息:

选项
用例(Use Case)

在查询结果中将搜索词作为字段显示在其原始上下文中。

检索 Atlas Search 返回的每个文档的得分明细。

追踪并提供您的查询搜索词的分析信息。

检索有关Atlas Search为满足您的查询而执行的Lucene查询的分析,以及查询在各个执行阶段花费的时间。

5

您可以通过以下选项为您的$search结果实现特殊排序功能:

选项
用例(Use Case)

修改结果中文档的相关性分数,确保Atlas Search返回相关结果。

按数字、字符串和日期字段或评分对结果进行排序。

设置参考点以停止或启动排序结果

6

使用以下 $search 选项来优化查询性能:

选项
用例(Use Case)

根据您为集合定义的 Atlas Search 索引,仅检索存储在 mongot 上的字段,可以更高效地运行 Atlas Search 查询。

专用搜索节点上并行搜索各分段。

要学习如何构建和运行 Atlas Search 索引和 Atlas Search 查询,请参阅 Atlas Search 快速入门。

要学习;了解有关本教程中提到的Atlas Search查询配置选项的更多信息,请参阅以下参考页面:

要详细了解本教程中提到的 Atlas Search 索引配置选项,请参阅以下参考页面:

后退

如何在 Atlas Search 中使用分面