Elasticsearch 7升级至8:如何让CompletionSuggester返回建议词而非完整记录?
Elasticsearch 8 中 CompletionSuggester 仅返回候选搜索词的实现方案
问题背景
将代码从Elasticsearch 7升级至8时,CompletionSuggestion相关逻辑出现适配问题。索引中suggest字段的映射定义如下:
"suggest" : { "type" : "completion", "analyzer" : "simple", "preserve_separators" : true, "preserve_position_increments" : true, "max_input_length" : 50 }
业务需求为:用户在搜索框输入内容时,仅返回基于suggest字段生成的候选搜索词列表,而非完整的文档记录。原ES7代码可正常实现该逻辑,但升级到ES8后,按现有教程实现会返回完整文档,无法得到预期的候选词列表。
解决方案
Elasticsearch 8的Java客户端API采用了Lambda风格的DSL,但核心逻辑仍是从suggest结果的选项中提取候选词文本,而非获取文档源。以下是适配ES8的完整实现代码:
List<String> result = new ArrayList<>(); // 构建Completion Suggester请求 CompletionSuggester suggester = CompletionSuggester.of(s -> s .name("Suggestion") .field("suggest") .prefix(query) // 对应ES7中的text()方法,传入用户搜索文本 .size(100) ); // 组装搜索请求 SearchRequest searchRequest = SearchRequest.of(sr -> sr .index(index) .suggest(Suggest.of(s -> s .suggesters("Suggestion", suggester) )) ); // 执行搜索请求 SearchResponse<Object> searchResponse = rhlClient.search(searchRequest, Object.class); // 解析结果,提取候选搜索词 searchResponse.suggest().ifPresent(suggest -> { suggest.get("Suggestion").ifPresent(suggestion -> { for (CompletionSuggesterResult.Entry entry : suggestion) { for (CompletionSuggesterResult.Entry.Option option : entry.options()) { // 直接提取候选词文本 result.add(option.text()); } } }); }); return result;
核心要点
- ES8使用
CompletionSuggester替代原ES7的CompletionSuggestionBuilder,通过Lambda DSL构建请求更简洁 - 解析结果时,直接调用
CompletionSuggesterResult.Entry.Option的text()方法即可获取候选搜索词,无需处理文档源数据 - 无需额外配置
fetchSource或相关参数,默认不会返回完整文档记录,仅返回suggest相关结果
内容的提问来源于stack exchange,提问作者Edgar Lopez
相关产品推荐
相关产品推荐

