搜索查询和搜索索引之间的关系决定了您使用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 查询中使用哪些操作符:
对于相似匹配,您可以使用near、moreLikeThis或phrase等操作符来匹配包含与指定搜索术语相似的数值、文档或字符串排序的文档。您还可以使用范围操作符来匹配包含指定值范围内的文档。
对于部分匹配,例如键入搜索查询,请使用autocomplete、regex或通配符等操作符来实现键入搜索功能或使用正则表达式匹配术语。
您可以根据用户的过滤器、排序或相关性要求调整搜索结果的呈现方式:
使用分数查询选项可修改文档的相关性分数,并影响用户查看结果的顺序。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 快速入门。
选择要创建索引的字段。
如果您知道要查询集合中的哪些字段,请启用静态映射,并在 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 }
(可选)应用文本分析规则。
如果您对 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 在查询过程中使用哪种相似性算法来计算相关性分数,请在 similarity.type 属性中为作为 MongoDB Search string 或 autocomplete 类型索引的 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 }
(可选)添加选项以优化查询性能。
如果要优化大型数据集上的查询性能,可以在索引定义中添加以下选项,以限制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搜索快速入门。
选择初始MongoDB搜索管道阶段。
MongoDB Search查询聚合管道的第一阶段必须是 $search 或 $searchMeta 阶段,具体取决于您要搜索的是文档还是元数据:
聚合管道阶段 | 用途 |
|---|---|
返回全文搜索的搜索结果。 | |
返回关于搜索结果的元数据。 |
应用操作符来定义搜索条件。
要定义您的搜索条件,您必须将一个或多个操作符或收集器应用到您的 $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> } } ]
(可选)应用选项或收集器以返回元数据。
如果要从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 }
(可选)将搜索选项添加到 $ 搜索阶段,以检索有关MongoDB搜索查询的其他信息。
您可以使用以下选项检索有关您的 $search 阶段结果的更多信息:
选项 | 用例(Use Case) |
|---|---|
在查询结果中将搜索词作为字段显示在其原始上下文中。 | |
检索MongoDB Search 返回的每个文档的分数明细。 | |
检索有关为满足您的查询而执行的Lucene查询MongoDB Search 的分析,以及查询在各个执行阶段花费的时间。 |
(可选) 添加 $search 选项以定义结果排序。
您可以通过以下选项为您的$search结果实现特殊排序功能:
选项 | 用例(Use Case) |
|---|---|
修改结果中文档的相关性分数,确保MongoDB Search 返回相关结果。 | |
按数字、字符串和日期字段或评分对结果进行排序。 | |
设置参考点以停止或启动排序结果 |
了解详情
要学习;了解如何构建和运行MongoDB搜索索引和MongoDB搜索查询,请参阅MongoDB搜索快速入门。
要学习;了解有关本教程中提到的MongoDB Search查询配置选项的更多信息,请参阅以下参考页面:
要学习;了解有关本教程中提到的MongoDB Search索引配置选项的更多信息,请参阅以下参考页面: