对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Docs 菜单

查询和索引

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

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

在运行MongoDB Search查询之前,您必须在要搜索的字段上创建MongoDB Search索引。搜索索引是经过优化的数据结构,可快速检索符合搜索查询的文档。定义搜索索引时,您需要指定要索引的字段以及应如何标记这些字段。

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

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

在规划MongoDB Search实施时,首先要定义要提供的搜索体验:

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

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

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

选择返回文档内容或搜索元数据。

考虑应用程序用户是否要返回文档内容或有关文档的元数据:

  • 如果用户想要文档内容,请使用 $search 聚合阶段来返回符合其搜索条件的文档。

  • 如果用户想要获取其搜索结果的元数据,可以使用 $searchMeta 阶段来返回匹配文档和分面的可自定义计数。

根据哪些字段包含用户想要查找的数据,确定要索引的字段。

确定用户可能搜索集合中的特定字段,以便知道要索引哪些字段。每个MongoDB Search查询都会搜索一个MongoDB Search索引,该索引包含从集合中的一个或多个指定字段中提取的术语。在规划MongoDB搜索查询时,请通过启用静态或动态映射来决定是仅对关键字段进行索引,还是对指定集合中的每个字段进行索引。您可以通过将查询路径指定为字段大量,或使用queryString操作符来跨多个字段查询。

根据用户的常用搜索术语与数据是完全匹配、相似匹配还是部分匹配来选择搜索操作符。

用户的常用搜索词可能与集群中的数据完全匹配相似匹配部分匹配。例如,电影查看应用程序的用户可能希望过滤来自确切年份的电影,或查看与其喜爱的电影相似的电影推荐。

确定用户正在搜索的匹配项类型,以告知在MongoDB Search 查询中使用哪些操作符

  • 对于精确匹配,使用诸如等于in的操作符来匹配包含与指定query值相同的术语的文档。您还可以使用text操作符来匹配包含query值中anyall字符串的文档。

  • 对于相似匹配,您可以使用nearmoreLikeThisphrase等操作符来匹配包含与指定搜索术语相似的数值、文档或字符串排序的文档。您还可以使用范围操作符来匹配包含指定值范围内的文档。

  • 对于部分匹配,例如键入搜索查询,请使用autocompleteregex通配符等操作符来实现键入搜索功能或使用正则表达式匹配术语。

  • 使用复合运算符在单个查询中混合多个匹配行为。

如果您的应用程序需要文本规范化、多语言支持或其他功能,请使用文本分析工具。

对于需要文本规范化、多语言支持、词干提取等功能的应用程序,请利用MongoDB Search 文本分析工具:

  • 在您的索引定义中选择内置分析器,以匹配您的文本数据的语言和性质。分析器将文本分解为术语或标记,并可以调整文本以删除标点符号和大写字母,将单词转换为其词根形式等。

  • 如果您的应用程序有特定要求(例如处理特定领域的术语或解析格式化文本(例如电子邮件地址或破折号分隔的 ID)),请配置自定义分析器。自定义分析器启用您能够按字符过滤文本,定义每个词元数据块中包含的字符数,或者启用词干提取或校订。

  • 定义 同义词 以提高具有相同或相似含义的术语的搜索准确性。

使用搜索选项实现搜索结果的筛选、排序或相关性要求。

您可以根据用户的过滤器、排序或相关性要求调整搜索结果的呈现方式:

  • 使用分数查询选项可修改文档的相关性分数,并影响用户查看结果的顺序。MongoDB Search 查询将基于相关性的分数与结果设立的每个文档相关联,并按从最高到最低分数的顺序返回文档。

  • 为用户可能按升序或降序排序的索引字段(例如日期或数字字段)设置排序查询选项。

  • 使用 searchBefore 或 searchAfter 查询选项将结果显示为一组页面,用户可以按顺序浏览或跳过这些页面。

  • 使用 facet(MongoDB搜索操作符) 收集器,允许用户按类别或其他维度过滤结果。这可以显着提高搜索结果的相关性,为用户提供更具引导性的搜索体验。

调整您的索引和查询配置以优化搜索性能。

MongoDB Search查询性能受索引配置和查询复杂性的影响。重点关注对应用程序搜索功能至关重要的索引字段,并力求在查询复杂性和速度之间实现逻辑平衡。

要进一步优化性能,请考虑以下查询选项:

  • 使用并发查询选项来设置在评估查询时执行的并发搜索请求的数量。此选项对于复杂查询或大型数据集非常有用。

  • 使用returnStoredSource查询选项与storedSource索引选项结合,以确定是否在返回搜索结果时同时返回作为索引一部分存储的原始源文档。此选项对于根据搜索条件显示摘要或重点的应用程序非常有用。

  • 使用numPartitions索引选项对索引进行分区,以最佳方式在子索引之间分配索引对象。

有关如何优化查询性能的更多建议,请参阅MongoDB Search Query Performance。

在使用MongoDB Search搜索数据之前,您必须创建一个或多个要在MongoDB Search查询期间使用的MongoDB Search 索引。本部分演示如何应用查询偏好到MongoDB Search索引的JSON配置语法。

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

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

1

如果您知道要查询集合中的哪些字段,请启用静态映射,并在 MongoDB Search 索引定义中指定这些字段。否则,您可以启用动态映射以根据默认或配置的字段类型集自动为所有字段创建索引(typeSet)。

要学习;了解更多信息,请参阅动态和静态映射。

注意

For more details on MongoDB Search indexes behaviour and limitations, see Considerations for MongoDB Search Indexes.

1{
2 "mappings": {
3 "dynamic": true
4 }
5}
1{
2 "mappings": {
3 "dynamic": true|false,
4 "fields": {
5 "<field-name>": {
6 "type": "<field-type>",
7 ...
8 },
9 ...
10 }
11 }
12}
2

如果您对 string 数据有特殊的语言、解析或评分要求,可以对索引定义应用以下选项:

要指定 MongoDB Search 如何将文本字段分解为标记,您可以在 MongoDB Search 搜索索引中设置内置分析器

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|autocomplete",
10 "analyzer": "<field-analyzer-name>" // field-specific index analyzer
11 "multi": {
12 "<multi-option-name>": {
13 "type": "string|autocomplete",
14 "analyzer": "<alternate-analyzer-name>" // multi-option specific index analyzer
15 }
16 }
17 }
18 ]
19 }
20 }
21}

要自定义 MongoDB Search 如何将文本拆分为标记,您可以在 MongoDB Search 索引的 analyzers 字段中定义自定义分析器

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

要使用解释具有相同或相似含义的术语的文本操作符运行查询,您可以在 MongoDB Search 索引的 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}

要设置 MongoDB Search 在查询过程中使用哪种相似性算法来计算相关性分数,请在 similarity.type 属性中为作为 MongoDB Search stringautocomplete 类型索引的 string 字段指定一种算法。

此选项确定 文本短语查询字符串自动完成 操作符如何计算相关性分数。要了解有关不同相似度算法的更多信息,请参阅评分详情。

1 "mappings": {
2 "fields": {
3 "<field-name>": {
4 "type": "string|autocomplete",
5 "similarity": {
6 "type": "bm25|boolean|stableTfl"
7 },
8 },
9 "<field-name>": {
10 "type": "string",
11 "multi": {
12 "<multi-option-name>": {
13 "type": "string",
14 "similarity": {
15 "type": "bm25|boolean|stableTfl"
16 }
17 }
18 }
19 }
20 }
21 }
3

如果要优化大型数据集上的查询性能,可以在索引定义中添加以下选项,以限制MongoDB搜索查询必须遍历的数据量:

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

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

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

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

为集合中要搜索的所有字段创建MongoDB搜索索引后,您可以运行MongoDB搜索查询。本部分演示如何应用您的应用程序的搜索体验目标于MongoDB搜索查询的JSON语法。

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

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

1

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

聚合管道阶段
用途

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

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

2

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

MongoDB Search operators allow you to locate and retrieve relevant data from your cluster according to content, format, or data type. To learn which operators support searches for each field type, see the table in the operators reference section. You must specify one or more indexed search fields in the operator's query path parameter:

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

如果要从MongoDB搜索查询中检索元数据,可以应用以下配置之一来选择计数facet(MongoDB搜索操作符)类型的元数据结果文档:

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

$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}

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

$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)

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

检索MongoDB Search 返回的每个文档的分数明细。

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

5

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

选项
用例(Use Case)

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

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

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

6

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

选项
用例(Use Case)

通过仅检索存储在 mongot 上的字段(如集合的MongoDB Search索引定义中指定的那样),更高效地运行MongoDB Search查询。

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

要学习;了解如何构建和运行MongoDB搜索索引和MongoDB搜索查询,请参阅MongoDB搜索快速入门。

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

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