如何在Elasticsearch Java API Client中使用Suggest API实现查询?
Elasticsearch Java API Client 7.17.6 带上下文过滤的Completion Suggest查询实现
以下是对应你提供的DSL查询的Java代码片段,适配7.17.6版本的Java API Client:
依赖与导入
确保项目引入Elasticsearch Java API Client相关依赖后,导入必要类:
import co.elastic.clients.elasticsearch.ElasticsearchClient; import co.elastic.clients.elasticsearch.core.SearchRequest; import co.elastic.clients.elasticsearch.core.SearchResponse; import co.elastic.clients.elasticsearch.core.search.CompletionSuggester; import co.elastic.clients.elasticsearch.core.search.Suggester; import co.elastic.clients.json.jackson.JacksonJsonpMapper; import co.elastic.clients.transport.rest_client.RestClientTransport; import org.apache.http.HttpHost; import org.elasticsearch.client.RestClient;
完整代码示例
public class PlaceSuggestQuery { public static void main(String[] args) throws Exception { // 初始化ES客户端 RestClient restClient = RestClient.builder( new HttpHost("localhost", 9200, "http") ).build(); ElasticsearchClient esClient = new ElasticsearchClient( new RestClientTransport(restClient, new JacksonJsonpMapper()) ); // 构建带上下文过滤的Completion Suggest请求 SearchRequest searchRequest = SearchRequest.of(req -> req .index("your_index_name") // 替换为实际索引名称 .suggest(Suggester.of(sug -> sug .name("place_suggestion") .completion(CompletionSuggester.of(comp -> comp .field("name") .prefix("oli") .size(10) .contexts("place_type", ctx -> ctx.add("d2c")) )) )) ); // 执行查询 SearchResponse<Void> response = esClient.search(searchRequest, Void.class); // 解析并输出结果 response.suggest().get("place_suggestion").forEach(suggestEntry -> { suggestEntry.options().forEach(option -> { System.out.println("建议内容: " + option.text()); // 若需获取源文档字段(如entityId),请将Void.class替换为对应实体类,然后通过option.source()获取 // System.out.println("Entity ID: " + option.source().entityId()); }); }); // 关闭客户端资源 restClient.close(); } }
关键说明
- 客户端初始化:根据你的ES集群地址调整
HttpHost参数,若有认证需求需额外配置。 - 查询构建:
- 指定建议器名称为
place_suggestion,与DSL中的名称对应 - 通过
completion方法绑定name字段的completion类型,设置前缀、返回数量 contexts方法传入上下文键place_type和过滤值d2c,实现上下文过滤
- 指定建议器名称为
- 结果解析:若需要获取源文档的
entityId等字段,需定义与索引结构匹配的POJO类,替换代码中的Void.class,即可通过option.source()访问对应字段。
内容的提问来源于stack exchange,提问作者Yatin
相关产品推荐
相关产品推荐

