ElasticSearch 6.x跨多索引实现Completion Suggester自动补全可行吗?
跨多索引使用Elasticsearch 6.x Completion Suggester完全可行!
绝对可行!Elasticsearch 6.x虽然不支持单索引多类型,但完全可以在多个独立索引上配置Completion Suggester,然后通过跨索引查询实现统一的自动补全效果。你之前遇到的结果不符合预期问题,大概率是查询配置或者索引映射的细节没做好,下面给你一步步说明正确的操作方式:
1. 确保两个索引都配置了Completion字段映射
首先,location和postcode两个索引都需要单独定义用于自动补全的completion类型字段。假设我们给每个索引的补全字段起相同的名字(比如suggest),这样后续查询更方便:
配置location索引的映射
PUT /location { "mappings": { "_doc": { "properties": { "suggest": { "type": "completion", "preserve_separators": true, "preserve_position_increments": true }, // 这里添加你的其他业务字段,比如location_name、address等 "location_name": { "type": "text" } } } } }
配置postcode索引的映射
PUT /postcode { "mappings": { "_doc": { "properties": { "suggest": { "type": "completion", "preserve_separators": true, "preserve_position_increments": true }, // 你的postcode相关业务字段 "postcode": { "type": "keyword" } } } } }
如果两个索引的补全字段名不同(比如location_suggest和postcode_suggest)也没关系,后续查询时分别指定即可。
2. 正确的跨索引Completion查询方式
要同时查询两个索引并获取补全建议,你需要明确指定目标索引(用逗号分隔),并在suggest部分正确配置目标字段:
场景1:两个索引的补全字段名相同
这种情况下可以用单个suggest条目,一次性获取两个索引的结果:
GET /location,postcode/_search { "suggest": { "global_autocomplete": { "prefix": "star", "completion": { "field": "suggest", "skip_duplicates": true, // 可选:自动去重重复的补全建议 "size": 10 // 可选:指定返回的建议数量 } } } }
场景2:两个索引的补全字段名不同
如果字段名不一样,你可以分别定义两个suggest条目,分别获取对应索引的结果:
GET /location,postcode/_search { "suggest": { "location_autocomplete": { "prefix": "star", "completion": { "field": "location_suggest" } }, "postcode_autocomplete": { "prefix": "star", "completion": { "field": "postcode_suggest" } } } }
返回结果会分别包含location_autocomplete和postcode_autocomplete两个部分的建议,你可以在客户端合并展示。
3. 排查之前结果不符合预期的常见原因
你之前搜索“star...”结果不对,可能是以下几个问题导致的:
- 字段不匹配:查询时指定的补全字段在其中一个索引里不存在,导致该索引的结果没有被正确返回
- 数据未正确索引:某个索引中没有以“star”开头的补全条目,或者
completion字段没有被正确填充数据 - 未启用去重:两个索引存在重复的补全建议,导致结果看起来混乱,加上
skip_duplicates: true即可解决 - 参数配置问题:比如
prefix拼写错误,或者没有根据需求调整fuzzy参数(如果需要模糊匹配的话)
只要按照上面的步骤配置和查询,跨多索引的Completion Suggester就能正常工作,给你提供符合预期的自动补全结果。
内容的提问来源于stack exchange,提问作者Neshta
相关产品推荐
相关产品推荐

