Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Docs 菜单
Docs 主页
/ /

autocomplete Operator

autocomplete

autocomplete 操作符会搜索包含来自非完整输入字符串的一系列字符的词或短语。您打算使用 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}
字段
类型
说明
必要性
默认

query

字符串或字符串数组

要搜索的一个或多个字符串。 如果字符串中有多个词, MongoDB Search 还会分别为字符串中的每个术语查找匹配项。

path

字符串

要搜索的索引字段。该字段必须建立索引为 autocomplete 数据类型。要了解更多信息,请参阅如何为自动完成的字段编制索引。

autocomplete 操作符不支持 path 参数中的 multiwildcard (*) 选项。它也不支持将字段数组作为 path 值。

有关跨多个字段的 autocomplete 查询示例,请参阅跨多个字段搜索。

fuzzy

对象

启用模糊搜索。查找与搜索词相似的字符串。

no

fuzzy
.maxEdits

整型

匹配指定搜索词所需的最大单字符编辑数。值可以是 12

no

2

fuzzy
.prefixLength

整型

结果中每个术语开头必须完全匹配的字符数。

no

0

fuzzy
.maxExpansions

整型

生成和搜索变体的最大数量。此限制适用于每个令牌。

no

50

score

对象

要分配给匹配搜索词结果的分数。使用以下选项之一修改默认分数:

  • boost将生成的分数乘以给定数字。

  • constant将结果分数替换为给定数字。

  • function:使用给定的表达式替换结果分数。

autocomplete 以较低的分数保真度换取更快的查询执行速度。要学习;了解更多信息,请参阅对行为进行评分。

有关在查询中使用 score 的信息,请参阅对结果中的文档进行评分

no

tokenOrder

字符串

搜索令牌的顺序。值可以是以下之一:

any

表示查询中的标记可按任意顺序出现在文档中。结果包含令牌会按顺序和无顺序显示的文档。但是,令牌按顺序显示的结果的得分高于其他非连续值。

sequential

表示查询中的令牌必须彼此相邻,或按照查询中指定的顺序出现在文档中。结果只包含令牌依次出现的文档。

no

any

默认情况下,自动完成操作符使用 bm25 相似度算法根据文档与查询的相关性对文档进行评分。

您可以通过在 similarity.type 属性中为 MongoDB Search 索引定义中的 autocomplete 字段指定不同的相似性算法来更改所使用的相似性算法。要了解如何配置 autocomplete 类型的 MongoDB Search 索引,请参阅如何为自动完成功能编制索引

要了解有关支持的相似度算法的更多信息,请参阅评分详情

autocomplete操作符查询完全匹配的结果比非完全匹配的结果得分低。如果您仅指定自动完成索引的令牌子字符串,则MongoDB Search 无法确定查询字符串是否与索引文本完全匹配。 要提高完全匹配的得分,请尝试以下解决方法:

注意

以下解决方法无法保证在所有情况下精确匹配都能获得较高的分数。

  1. 将字段索引为自动完成字符串类型。

    autocomplete字段也被索引为 string 时, MongoDB Search autocomplete 会提升精确匹配,从而提高精确匹配的分数。

  2. 使用复合操作符查询。

有关此解决方法的演示,请参阅跨多个字段搜索。

The following examples use the movies collection in the sample_mflix database. If you loaded the sample dataset on your cluster, you can create the static index for autocompletion and run the example queries on your cluster.

以下标签页包含 edgeGramrightEdgeGramnGram 词汇切分策略的示例索引定义。除了 autocomplete 类型以外,示例索引定义还包括 title 字段上的 stringtoken 类型。

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 的电影。

注意

结果可能会有所不同

MongoDB Search 根据自动完成类型的索引定义中配置的分词策略返回不同的结果。要学习;了解更多信息,请参阅如何为自动完成的字段编制索引。

下面的查询会搜索 title 字段中包含字符 pre 的电影。查询使用:

字段

说明

maxEdits

表示查询字符串 pre 中只允许有一个字符变体,以便将查询与文档中的单词匹配。

prefixLength

表示将查询与文档中的单词进行匹配时,查询字符串 pre 中的第一个字符无法更改。

maxExpansions

表示将查询字符串与文档中的单词进行匹配时,最多可以为 pre 考虑 256 个相似的术语。

注意

结果可能会有所不同

MongoDB Search 根据自动完成类型的索引定义中配置的分词策略返回不同的结果。要学习;了解更多信息,请参阅如何为自动完成的字段编制索引。

以下查询演示了如何搜索指定字段中包含您在查询中所指定字符序列的单词或短语。

以下查询搜索在 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 & 开头的电影标题。

注意

结果可能会有所不同

MongoDB Search 根据自动完成类型的索引定义中配置的分词策略返回不同的结果。要学习;了解更多信息,请参阅如何为自动完成的字段编制索引。

注意

结果可能会有所不同

MongoDB Search 根据自动完成类型的索引定义中配置的分词策略返回不同的结果。要学习;了解更多信息,请参阅如何为自动完成的字段编制索引。

以下查询在movies 集合的 title 字段中搜索 ger 字符,并为 title 字段启用了 highlight 选项。

重要

要突出显示 autocomplete 已索引版本的路径,autocomplete 运算符必须是唯一在此查询中使用该路径的运算符。

注意

结果可能会有所不同

MongoDB Search 根据自动完成类型的索引定义中配置的分词策略返回不同的结果。要学习;了解更多信息,请参阅如何为自动完成的字段编制索引。

下面的查询使用复合操作符在 movies 集合的 titleplot 字段中搜索以字符串 inter 开头的单词。

注意

结果可能会有所不同

MongoDB Search 根据自动完成类型的索引定义中配置的分词策略返回不同的结果。要学习;了解更多信息,请参阅如何为自动完成的字段编制索引。

要学习;了解更多信息,请参阅如何运行自动完成和部分匹配MongoDB搜索查询。

后退

操作符和收集器

在此页面上