Elasticsearch自定义小写Keyword分析器的Completion Suggester未按预期工作
Elasticsearch Completion Suggester 异常问题解决
问题根源
你的问题出在namesuggest字段配置的max_input_length: 50参数上。Completion Suggester的这个参数会限制输入字符串的最大长度,超过阈值的部分会被自动截断。你索引的目标字符串"PRAXIS CONSULTING AND INFORMATION SERVICES PRIVATE LIMITED."字符数已超过50,导致实际被索引的内容是截断后的版本。当你用完整前缀搜索时,前缀长度超过了截断后的内容长度,自然无法匹配;而短前缀长度在50以内,所以能正常返回结果。
验证方式
可以通过_analyze接口确认输入被截断的情况:
curl -X GET "localhost:9200/com.tmp.index/_analyze?pretty" -H 'Content-Type: application/json' -d'{ "analyzer": "keyword_lowercase_analyzer", "text": "PRAXIS CONSULTING AND INFORMATION SERVICES PRIVATE LIMITED." }'
查看返回的token长度,就能明确截断问题。
解决方案
调整max_input_length为足够容纳最长输入的数值(比如100),注意需要重建索引才能修改该参数,步骤如下:
- 删除原索引
curl -X DELETE "localhost:9200/com.tmp.index?pretty"
- 重建索引,修改
max_input_length值
curl -X PUT "localhost:9200/com.tmp.index?pretty" -H 'Content-Type: application/json' -d'{ "mappings": { "dynamic": "false", "properties": { "namesuggest": { "type": "completion", "analyzer": "keyword_lowercase_analyzer", "preserve_separators": true, "preserve_position_increments": true, "max_input_length": 100, "contexts": [ { "name": "searchable", "type": "CATEGORY" } ] } } }, "settings": { "index": { "mapping": { "ignore_malformed": "true" }, "refresh_interval": "5s", "analysis": { "analyzer": { "keyword_lowercase_analyzer": { "filter": [ "lowercase" ], "type": "custom", "tokenizer": "keyword" } } }, "number_of_replicas": "0", "number_of_shards": "1" } } }'
- 重新导入文档
curl -X PUT "localhost:9200/com.tmp.index/_doc/123?pretty" -H 'Content-Type: application/json' -d'{ "namesuggest": { "input": [ "PRAXIS CONSULTING AND INFORMATION SERVICES PRIVATE LIMITED." ], "contexts": { "searchable": [ "*" ] } } } '
- 再次执行搜索请求,即可得到预期结果
curl -X GET "localhost:9200/com.tmp.index/_search?pretty" -H 'Content-Type: application/json' -d'{ "suggest": { "legalEntity": { "prefix": "PRAXIS CONSULTING AND INFORMATION SERVICES PRIVATE LIMITED.", "completion": { "field": "namesuggest", "size": 10, "contexts": { "searchable": [ { "context": "*", "boost": 1, "prefix": false } ] } } } } }'
补充提示
max_input_length默认值为50,用于避免过长输入影响Suggester性能,但如果业务需要支持长前缀搜索,必须调整该参数。- 修改映射后务必重新索引所有相关文档,确保新配置生效。
内容的提问来源于stack exchange,提问作者Mahesh Hegde
相关产品推荐
相关产品推荐

