定义
autocompleteautocomplete操作符会搜索包含来自非完整输入字符串的一系列字符的词或短语。您打算使用autocomplete操作符查询的字段必须使用集合索引定义中的 autocomplete 数据类型进行索引。要了解如何为自动完成配置索引,请参阅 如何为自动完成的字段编制索引。
注意
对于单个字符串中包含三个以上单词的查询, MongoDB搜索可能会返回不准确的结果。
示例使用案例
您可以将 autocomplete 运算符与“键入时搜索”应用程序一起使用,以在应用程序的搜索字段中输入字符时更加准确地预测单词。autocomplete 返回的结果包含根据自动完成索引定义中指定的标记化策略所预测的单词。
如果您想使用MongoDB Search autocomplete操作符构建建议或下拉列表,我们建议您查询建议搜索术语的集合或使用过去的搜索术语来填充下拉列表。如果您创建了单独的建议搜索术语集合,则可以在您的 MongoDB Search 索引中定义同义词映射,以在集合中搜索确切的单词或替代单词。
语法
autocomplete 通过以下语法实现:
1 { 2 $search: { 3 "index": "<index name>", // optional, defaults to "default" 4 "autocomplete": { 5 "query": "<search-string>", 6 "path": "<field-to-search>", 7 "tokenOrder": "any|sequential", 8 "fuzzy": <options>, 9 "score": <options> 10 } 11 } 12 }
选项
字段 | 类型 | 说明 | 必要性 | 默认 | ||||
|---|---|---|---|---|---|---|---|---|
| 字符串或字符串数组 | 要搜索的一个或多个字符串。 如果字符串中有多个词, MongoDB Search 还会分别为字符串中的每个术语查找匹配项。 | 是 | |||||
| 字符串 | 要搜索的索引字段。该字段必须建立索引为
有关跨多个字段的 | 是 | |||||
| 对象 | 启用模糊搜索。查找与搜索词相似的字符串。 | no | |||||
fuzzy.maxEdits | 整型 | 匹配指定搜索词所需的最大单字符编辑数。值可以是 | no |
| ||||
fuzzy.prefixLength | 整型 | 结果中每个术语开头必须完全匹配的字符数。 | no |
| ||||
fuzzy.maxExpansions | 整型 | 生成和搜索变体的最大数量。此限制适用于每个令牌。 | no |
| ||||
| 对象 | 要分配给匹配搜索词结果的分数。使用以下选项之一修改默认分数:
有关在查询中使用 | no | |||||
| 字符串 | 搜索令牌的顺序。值可以是以下之一:
| no |
|
评分行为
默认情况下,自动完成操作符使用 bm25 相似度算法根据文档与查询的相关性对文档进行评分。
您可以通过在 similarity.type 属性中为 MongoDB Search 索引定义中的 autocomplete 字段指定不同的相似性算法来更改所使用的相似性算法。要了解如何配置 autocomplete 类型的 MongoDB Search 索引,请参阅如何为自动完成功能编制索引。
要了解有关支持的相似度算法的更多信息,请参阅评分详情。
autocomplete操作符查询完全匹配的结果比非完全匹配的结果得分低。如果您仅指定自动完成索引的令牌子字符串,则MongoDB Search 无法确定查询字符串是否与索引文本完全匹配。 要提高完全匹配的得分,请尝试以下解决方法:
注意
以下解决方法无法保证在所有情况下精确匹配都能获得较高的分数。
当
autocomplete字段也被索引为string时, MongoDB Searchautocomplete会提升精确匹配,从而提高精确匹配的分数。使用复合操作符查询。
有关此解决方法的演示,请参阅跨多个字段搜索。
示例
以下示例使用 sample_mflix 数据库中的 movies 集合。如果在集群上加载了样本数据集,则可以创建用于自动完成的静态索引,并在集群上运行示例查询。
索引定义
以下标签页包含 edgeGram、rightEdgeGram 和 nGram 词汇切分策略的示例索引定义。除了 autocomplete 类型以外,示例索引定义还包括 title 字段上的 string 和 token 类型。
1 { 2 "mappings": { 3 "dynamic": false, 4 "fields": { 5 "title": [ 6 { 7 "type": "token" 8 }, 9 { 10 "type": "string" 11 }, 12 { 13 "foldDiacritics": false, 14 "maxGrams": 7, 15 "minGrams": 3, 16 "tokenization": "edgeGram", 17 "type": "autocomplete" 18 } 19 ], 20 "plot": [ 21 { 22 "type": "autocomplete", 23 "tokenization": "edgeGram", 24 "minGrams": 2, 25 "maxGrams": 15, 26 "foldDiacritics": true 27 } 28 ] 29 } 30 } 31 }
1 { 2 "mappings": { 3 "dynamic": false, 4 "fields": { 5 "title": [ 6 { 7 "type": "token" 8 }, 9 { 10 "type": "string" 11 }, 12 { 13 "foldDiacritics": false, 14 "maxGrams": 7, 15 "minGrams": 3, 16 "tokenization": "rightEdgeGram", 17 "type": "autocomplete" 18 } 19 ], 20 "plot": [ 21 { 22 "type": "autocomplete", 23 "tokenization": "rightEdgeGram", 24 "minGrams": 2, 25 "maxGrams": 15, 26 "foldDiacritics": true 27 } 28 ] 29 } 30 } 31 }
1 { 2 "mappings": { 3 "dynamic": false, 4 "fields": { 5 "title": [ 6 { 7 "type": "token" 8 }, 9 { 10 "type": "string" 11 }, 12 { 13 "foldDiacritics": false, 14 "maxGrams": 7, 15 "minGrams": 3, 16 "tokenization": "nGram", 17 "type": "autocomplete" 18 } 19 ], 20 "plot": [ 21 { 22 "type": "autocomplete", 23 "tokenization": "nGram", 24 "minGrams": 2, 25 "maxGrams": 15, 26 "foldDiacritics": true 27 } 28 ] 29 } 30 } 31 }
➤ 使用 Select your language(选择您的语言)下拉菜单设置此页面上示例的语言。
基本示例
下面的查询会搜索 title 字段中包含字符 off 的电影。
模糊示例
基本示例
下面的查询会搜索 title 字段中包含字符 pre 的电影。查询使用:
字段 | 说明 |
| 表示查询字符串 |
| 表示将查询与文档中的单词进行匹配时,查询字符串 |
| 表示将查询字符串与文档中的单词进行匹配时,最多可以为 |
部分匹配示例
以下查询演示了如何搜索指定字段中包含您在查询中所指定字符序列的单词或短语。
令牌顺序示例
以下查询搜索在 title 字段中包含字符 men
with 的电影。这些查询还使用 tokenOrder 字段,该字段指定查询是按 any 顺序还是按 sequential 顺序搜索令牌。
从示例开始
您可以使用关键字分析器将 title 字段编入索引,搜索以某个术语或短语开头的电影片名。
您必须使用关键字分析器和 edgeGram 分词策略为字段索引,才能检索以下示例查询的结果。如果您使用任何其他内置分析器字段索引, MongoDB Search 不会返回任何结果,因为它不会将您的文本字段作为单个术语索引。edgeGram 分词策略从单词的左侧开始创建词元。
您还必须将 foldDiacritics设立为 true 才能返回区分大小写的结果。如果将 foldDiacritics设立为 false,则查询术语的字母大小写必须与文档中的字母大小写完全匹配, MongoDB Search 才能返回任何结果。
{ "mappings": { "dynamic": false, "fields": { "title": [ { "type": "token" }, { "type": "string" }, { "foldDiacritics": true, "maxGrams": 7, "minGrams": 3, "analyzer": "lucene.keyword", "tokenization": "edgeGram", "type": "autocomplete" }] } } }
以下查询搜索以 Fast & 开头的电影标题。
简单的 any 示例
简单的 sequential 示例
突出显示示例
以下查询在movies 集合的 title 字段中搜索 ger 字符,并为 title 字段启用了 highlight 选项。
重要
要突出显示 autocomplete 已索引版本的路径,autocomplete 运算符必须是唯一在此查询中使用该路径的运算符。
跨多个字段搜索
下面的查询使用复合操作符在 movies 集合的 title 和 plot 字段中搜索以字符串 inter 开头的单词。
通过分面查询对结果分桶
了解详情
要学习;了解更多信息,请参阅如何运行自动完成和部分匹配MongoDB搜索查询。