You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 18:15:12