Elasticsearch Completion Suggester未按预期工作求助
先梳理下你的配置和操作,我帮你拆解几个可能导致Suggester不工作的关键点:
1. 索引文档时suggest字段未正确赋值
你提到执行索引请求时写的是POST index/test { "hostname": "testing-01", "suggest"...,这里的suggest字段看起来没有完整赋值。Completion Suggester是依赖suggest字段的内容来生成提示的,如果你没把需要提示的内容(比如hostname的值)填入suggest字段,自然不会返回任何结果。
正确的索引请求应该是把hostname的值同步到suggest字段,比如:
POST index/test { "hostname": "testing-01", "suggest": "testing-01" }
或者如果需要多输入项,可以用数组形式指定:
POST index/test { "hostname": "testing-01", "suggest": { "input": ["testing-01", "test-01"] } }
2. 检查Completion Suggester的查询语句是否正确
很多时候失效是因为查询写法不对,你需要确保查询是针对suggest字段的completion类型来发起请求的。比如正确的查询示例:
POST index/_search { "suggest": { "hostname_suggest": { "prefix": "test", "completion": { "field": "suggest" } } } }
这里的prefix是你输入的待匹配前缀(比如"test"),field要准确指定为你的suggest字段。
3. 验证分析器是否按预期工作
你的autocomplete分析器用了whitespace分词器+lowercase+edgeNGram过滤器,可以先测试这个分析器的效果,确认它是否正确生成了预期的token:
POST index/_analyze { "analyzer": "autocomplete", "text": "testing-01" }
执行后应该能看到生成类似["t", "te", "tes", "test", "testi", "testin", "testing", "testing-", "testing-0", "testing-01"]这样的edge ngram token。如果没有生成这些,那分析器配置可能有问题,但从你贴的配置来看,分析器的定义是正确的。
4. 确认索引的mapping是否正确生效
有时候可能索引创建时mapping没正确应用,你可以通过以下命令查看当前索引的mapping:
GET index/_mapping
确认test类型下的suggest字段确实是completion类型,并且关联了autocomplete分析器。
先从这几个点排查,最常见的问题就是索引时suggest字段没赋值或者查询语句写错了。
内容的提问来源于stack exchange,提问作者Tech_Lover

