搜索查询和搜索索引之间的关系决定了您使用Atlas Search在MongoDB集合中查找数据的效率和效果。
Atlas 搜索查询指定在数据库中查找文档的条件。Atlas Search 查询采用聚合管道的形式,以$search
或$searchMeta
管道阶段开始。您可以在管道阶段内使用操作符、收集器和搜索选项来实现复杂的搜索功能,如全文搜索、基于相关性的排名、分面搜索、过滤和排序。
在运行 Atlas Search 查询之前,您必须在要搜索的字段上创建 Atlas Search 索引。搜索索引是经过优化的数据结构,能够快速检索符合查询条件的文档。当您定义搜索索引时,您需要指定要索引的字段以及这些字段应如何进行分词。
有效的搜索查询依赖于正确定义的搜索索引。您要搜索的字段必须建立索引,您的索引配置决定了搜索是否支持排序、分面、自动完成和其他搜索功能。您可以在查询和索引设计上进行迭代,以平衡搜索的准确性和性能。
本页介绍如何规划您的 Atlas Search 搜索体验,并定义 Atlas Search 索引和查询以满足您的搜索需求。
规划您的搜索体验
在规划 Atlas Search 实施时,首先定义您希望提供的搜索体验:
明确识别您的应用程序需要执行的搜索类型。您是否正在为需要全文搜索和文章标题自动完成功能的博客网站构建搜索功能,还是为需要分面搜索和按产品类别过滤的电商站点构建搜索功能?
确定用户如何与应用程序交互。优先考虑可增强用户体验的功能,例如快速响应时间或准确的自动完成建议。
然后,考虑以下问题,以帮助根据这些用户需求确定Atlas Search 搜索索引和查询的结构:
考虑应用程序用户是否要返回文档内容或有关文档的元数据:
如果用户想要文档内容,请使用
$search
聚合阶段来返回符合其搜索条件的文档。如果用户想要获取其搜索结果的元数据,可以使用
$searchMeta
阶段来返回匹配文档和分面的可自定义计数。
用户的常用搜索词可能与Atlas 集群中的数据完全匹配、相似匹配或部分匹配。例如,电影查看应用程序的用户可能希望过滤来自确切年份的电影,或查看与其喜爱的电影相似的电影推荐。
确定用户正在搜索的匹配类型,以便确定在 Atlas 搜索查询中应使用哪些操作符:
对于精确匹配,使用诸如等于或in的操作符来匹配包含与指定
query
值相同的术语的文档。您还可以使用text操作符来匹配包含query
值中any
或all
字符串的文档。对于相似匹配,您可以使用near、moreLikeThis或phrase等操作符来匹配包含与指定搜索术语相似的数值、文档或字符串排序的文档。您还可以使用范围操作符来匹配包含指定值范围内的文档。
对于部分匹配,例如键入搜索查询,请使用autocomplete、regex或通配符等操作符来实现键入搜索功能或使用正则表达式匹配术语。
您可以根据用户的过滤器、排序或相关性要求调整搜索结果的呈现方式:
使用score查询选项来修改文档的相关性分数,并影响用户查看结果的顺序。Atlas 搜索查询将基于相关性的分数与结果集中的每个文档相关联,并按从最高到最低分数的顺序返回文档。
为用户可能按升序或降序排序的索引字段(例如日期或数字字段)设置排序查询选项。
使用 searchBefore 或 searchAfter 查询选项将结果显示为一组页面,用户可以按顺序浏览或跳过这些页面。
Use the
facet
Collector collector to allow users to filter results by categories or other dimensions. This can significantly improve the relevance of search results, offering users a more guided search experience.
Atlas Search 查询性能受您的索引配置和查询复杂性的影响。专注于对您的应用程序搜索功能至关重要的索引字段,并在查询复杂性和速度之间实现合理的平衡。
要进一步优化性能,请考虑以下查询选项:
使用并发查询选项来设置在评估查询时执行的并发搜索请求的数量。此选项对于复杂查询或大型数据集非常有用。
使用returnStoredSource查询选项与storedSource索引选项结合,以确定是否在返回搜索结果时同时返回作为索引一部分存储的原始源文档。此选项对于根据搜索条件显示摘要或重点的应用程序非常有用。
使用numPartitions索引选项对索引进行分区,以最佳方式在子索引之间分配索引对象。
有关如何优化查询性能的更多建议,请参阅Atlas Search查询性能。
定义索引
在使用 Atlas Search 搜索数据之前,您必须创建一个或多个 Atlas Search 搜索索引,以便在 Atlas Search 查询中使用。本节演示如何在 Atlas Search 索引的 JSON 配置语法中体现您的查询首选项。
要在索引定义中使用本节中的JSON语法,请用有效值替换占位符,并确保完整的索引定义包含必要的选项。
要学习;了解如何将Atlas Search索引添加到Atlas 集群,请参阅Atlas Search快速入门。
选择要创建索引的字段。
如果您知道要查询集合中的哪些字段,请启用静态映射,并在 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 }
(可选)应用文本分析规则。
如果您有特殊的语言或解析要求,则可以应用索引定义:
指定对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 }
为 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 }
(可选)添加选项以优化查询性能。
如果您想优化大型数据集上的查询性能,可以将以下选项添加到索引定义中,以限制 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快速入门。
选择您的初始 Atlas Search 管道阶段。
Atlas Search查询聚合管道的第一阶段必须是 $search
或 $searchMeta
阶段,具体取决于您要搜索的是文档还是元数据:
聚合管道阶段 | 用途 |
---|---|
返回全文搜索的搜索结果。 | |
返回关于搜索结果的元数据。 |
应用操作符来定义搜索条件。
要定义您的搜索条件,您必须将一个或多个操作符或收集器应用到您的 $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> } } ]
(可选)应用选项或收集器以返回元数据。
If you want to retrieve metadata from your Atlas Search query, you can apply one of the following configurations to choose between the count or facet
Collector type of metadata results document:
要返回搜索结果的总数或下限计数,请在聚合阶段设立计数选项。
$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 }
To run a facet query, which groups results by values or ranges and returns the count for each of these groups, use the facet
Collector collector in your aggregation stage.
$searchMeta
阶段返回facet
元数据结果,而 $search
阶段将元数据结果存储在 $$SEARCH_META 聚合变量中,只返回搜索结果。有关如何从 $$SEARCH_META
变量中检索 facet
元数据结果的示例,请参阅分面结果。
1 { 2 "$search" | "$searchMeta": { 3 "facet": { 4 "facets": { 5 <facet-definitions> 6 } 7 } 8 } 9 }
(可选)向 $search 阶段添加搜索选项,以检索有关 Atlas Search 查询的更多信息。
您可以使用以下选项检索有关您的 $search
阶段结果的更多信息:
选项 | 用例(Use Case) |
---|---|
在查询结果中将搜索词作为字段显示在其原始上下文中。 | |
检索 Atlas Search 返回的每个文档的得分明细。 | |
追踪并提供您的查询搜索词的分析信息。 | |
检索有关Atlas Search为满足您的查询而执行的Lucene查询的分析,以及查询在各个执行阶段花费的时间。 |
(可选)添加 $search 选项以定义结果排名。
您可以通过以下选项为您的$search
结果实现特殊排序功能:
选项 | 用例(Use Case) |
---|---|
修改结果中文档的相关性分数,确保Atlas Search返回相关结果。 | |
按数字、字符串和日期字段或评分对结果进行排序。 | |
设置参考点以停止或启动排序结果 |
了解详情
要学习如何构建和运行 Atlas Search 索引和 Atlas Search 查询,请参阅 Atlas Search 快速入门。
要学习;了解有关本教程中提到的Atlas Search查询配置选项的更多信息,请参阅以下参考页面:
要详细了解本教程中提到的 Atlas Search 索引配置选项,请参阅以下参考页面: