搜索查询和搜索索引之间的关系决定了您使用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值中any或all字符串的文档。对于相似匹配,您可以使用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搜索索引的 JSON配置语法。
要在索引定义中使用本节中的JSON语法,请用有效值替换占位符,并确保完整的索引定义包含必要的选项。
要学习;了解如何将MongoDB Search索引添加到集群,请参阅MongoDB Search 快速入门。
选择要创建索引的字段。
If you know which fields you want to query in your collection, enable static mappings and specify the fields in your MongoDB Search index definition. Otherwise, you can enable dynamic mappings to automatically index all fields based on a default or configured set of field types (typeSet).
To learn more, see Dynamic and Static Mappings.
重要提示:如果您的集合包含 16MB 或更大的文档, MongoDB Search 将无法对您的数据索引。当对大型文档的更新操作导致变更流事件超过 16MB BSON 限制时,也可能会出现此问题。为避免这种情况,请考虑以下最佳实践:
将您的文档结构化,以减少子文档或数组的大小。
避免执行更新或替换大字段、子文档或数组的操作。
要了解更多信息,请参阅 Change Streams 生产建议和减少大型文档的大小。
1 { 2 "mappings": { 3 "dynamic": true | { 4 "typeSet": "<typset-name>" 5 }, 6 "typeSets": [ 7 { 8 "name": "<typset-name>", 9 "types": [ 10 { 11 "type": "<field-type>" 12 }, 13 ... 14 ] 15 }, 16 ... 17 ] 18 } 19 }
1 { 2 "mappings": { 3 "dynamic": true|false, 4 "fields": { 5 "<field-name>": { 6 "type": "<field-type>", 7 ... 8 }, 9 ... 10 } 11 } 12 }
(可选)应用文本分析规则。
If you have special language, parsing, or scoring requirements for your string data, you can apply the following options to your index definition:
To specify how MongoDB Search breaks your text fields into tokens, you can set built-in analyzers in your MongoDB Search index.
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 }
To customize how MongoDB Search breaks text into tokens, you can define a custom analyzer in the analyzers field of your MongoDB Search index.
1 { 2 "analyzers": [ 3 { 4 "name": "<custom-analyzer-name>", 5 "tokenizer": { 6 "type": "<tokenizer-type>" 7 } 8 }, 9 ... 10 ] 11 }
To run queries with the text operator that account for terms with the same or similar meanings, you can define synonyms in the synonyms field of your MongoDB Search index.
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 }
To set which similarity algorithm MongoDB Search uses to calculate relevance scores during queries, specify an algorithm in the similarity.type property for your string fields indexed as the MongoDB Search string or autocomplete type.
This option determines how the text, phrase, queryString, and autocomplete operators calculate relevance scores. To learn more about the different similarity algorithms, see Score Details.
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 操作符允许您根据内容、格式或数据类型从集群中查找和检索相关数据。要学习了解哪些操作符支持每种字段类型的搜索,请参阅操作符参考部分中的表格。您必须在操作符的查询路径参数中指定一个或多个索引搜索字段:
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索引配置选项的更多信息,请参阅以下参考页面: