问题:在用户输入之后联想词返回长度默认为50,导致返回结果不完全
原因:completion
字段索引时允许存储的文本长度受 max_input_length
参数控制(默认为 50 字符)。可以在 mapping 中调整这个值
解决:“max_input_length”: 100,不仅可以实现返回数据长度100,同时也可以在用户输入100字以内的检索词进行联想
"title": {
"analyzer": "standard",
"type": "text",
"copy_to": "info",
"fields": {
"suggest": {
"type": "completion",
"max_input_length": 100
},
"raw": {
"type": "keyword",
"ignore_above": 8190
},
"sort": {
"ignore_above": 8190,
"type": "keyword",
"normalizer": "sort_normalizer"
}
}
}
官网参考:[Suggesters | Elasticsearch Guide 8.15] | Elastic
官网翻译:
Completion Suggester
Completion Suggester 提供自动补全/即时搜索功能。这是一种导航特性,旨在引导用户找到相关结果,从而提高搜索精度。它并不是用于拼写校正或 “你是不是想找” 功能(类似于 term 或 phrase suggesters)。
理想情况下,自动补全功能的响应速度应该跟上用户的输入速度,从而即时提供与用户已输入内容相关的反馈。因此,Completion Suggester 进行了速度优化。该建议器使用的数据结构支持快速查找,但这些结构的构建成本较高,并且存储在内存中。
映射
要使用 Completion Suggester,需将用于生成建议的字段映射为 completion
类型。这会将字段值索引为快速补全。
PUT /music
{
"mappings": {
"properties": {
"suggest": {
"type": "completion"
}
}
}
}
Completion 字段的参数
Completion 字段接受以下参数:
- analyzer
用于索引时的分析器,默认值为simple
。 - search_analyzer
用于搜索时的分析器,默认值为analyzer
的值。 - preserve_separators
是否保留分隔符,默认值为true
。如果禁用此选项,若建议词为 “Foo Fighters”,输入foof
时也能找到它。 - preserve_position_increments
是否启用位置增量,默认值为true
。如果禁用并且使用停用词分析器,输入b
时也可能找到以 “The Beatles” 开头的字段。注意:如果可以丰富数据,也可以通过索引 “Beatles” 和 “The Beatles” 两个输入实现类似效果,而无需更改简单分析器。 - max_input_length
限制单个输入的长度,默认值为 50 个 UTF-16 编码点。该限制仅在索引时使用,目的是减少每个输入字符串的字符总数,从而防止大规模输入导致基础数据结构膨胀。大多数使用场景不会受此默认值影响,因为前缀补全通常不会超过几个字符的长度。