Elasticsearch 8.1.1新Java客户端如何打印生成的JSON查询?
在Elasticsearch 8.1.1 Java客户端中打印请求JSON的方法
在Elasticsearch 8.x的新Java API Client中,旧版本的searchRequest.source()方法已经不再用来获取完整的请求JSON结构——新版本里的source()仅对应请求的文档源字段,未设置时自然返回null。要打印生成的查询JSON,需要通过客户端的JsonpMapper来序列化请求对象。
具体实现方式
方式一:借助已创建的ElasticsearchClient实例
如果你的代码中已经初始化了ElasticsearchClient,可以直接用它自带的JsonpMapper来序列化:
// 你的原有查询构建代码 final Query range_query = new Query.Builder().range(r -> r.field("pixel_x") .from(String.valueOf(lookupDto.getPixel_x_min())).to(String.valueOf(lookupDto.getPixel_x_max()))) .build(); final Query bool_query = new Query.Builder().bool(t -> t.must(range_query)).build(); SearchRequest sc = SearchRequest.of(s -> s.query(bool_query).index(INDEX).size(100)); // 序列化请求为JSON并打印 String requestJson = client._transport().jsonpMapper().writeValueAsString(sc); System.out.println(requestJson);
方式二:直接使用JacksonJsonpMapper
如果没有客户端实例,可以手动创建JacksonJsonpMapper来完成序列化:
import com.fasterxml.jackson.databind.json.JsonMapper; import jakarta.json.spi.JsonProvider; import org.elasticsearch.client.json.jackson.JacksonJsonpMapper; // ... // 你的原有查询构建代码 final Query range_query = new Query.Builder().range(r -> r.field("pixel_x") .from(String.valueOf(lookupDto.getPixel_x_min())).to(String.valueOf(lookupDto.getPixel_x_max()))) .build(); final Query bool_query = new Query.Builder().bool(t -> t.must(range_query)).build(); SearchRequest sc = SearchRequest.of(s -> s.query(bool_query).index(INDEX).size(100)); // 创建Mapper并序列化 JacksonJsonpMapper mapper = new JacksonJsonpMapper(JsonMapper.builder().build(), JsonProvider.provider()); String requestJson = mapper.writeValueAsString(sc); System.out.println(requestJson);
关键说明
新版本客户端的API设计和旧版High Level Rest Client完全不同:旧版的source()方法返回的是查询的JSON结构,而新版的source()仅对应_source参数(用于指定返回的文档字段),两者功能无关,这就是你调用source()返回null的原因。
内容的提问来源于stack exchange,提问作者piet
相关产品推荐
相关产品推荐

