如何获取使用Java API Client(7.16)构建的ElasticSearch查询/请求的json表示?

uidvcgyl  于 2023-04-05  发布在  ElasticSearch
关注(0)|答案(4)|浏览(196)

在ES的7.16版本中发布了一个新的Java API客户端,Java Rest客户端被弃用。在弃用的客户端中可以将查询转换为JSON。这便于在Kibana中调试/调优/分析查询。
不幸的是,我在新客户端文档中没有看到任何提及这一点的内容。所以我的问题是:
是否可以通过Java API客户端获得查询的JSON表示?它可以是打印传出请求的客户端的一些实用程序类或日志配置。

ttp71kqs

ttp71kqs1#

看起来此功能将在即将推出的版本中直接支持:https://discuss.elastic.co/t/elaticsearch-java-client-output-dsl/300952
在此期间,上面的讨论中给出了一个解决方案,但它并不完全有效。下面是一个适用于我的片段:

StringWriter writer = new StringWriter();
JsonGenerator generator = JacksonJsonProvider.provider().createGenerator(writer);
request.serialize(generator, new JacksonJsonpMapper());
generator.flush();
return writer.toString();
g6ll5ycj

g6ll5ycj2#

到目前为止,我发现的唯一方法是在elasticsearch-java-7.16.2.jar中的co/elastic/clients/transport/rest_client/RestClientTransport.java:215中放置一个条件断点,并检查baos变量的值。

sr4lhrrt

sr4lhrrt3#

作为下面提到的等待pull request的临时方法,我使用了

// TODO delete when https://github.com/elastic/elasticsearch-java/pull/213
public static String serializeToString(Query q) {
    return q._get().toString();
}

它没有打印任何漂亮的东西,但它涵盖了我的测试字符串比较用例。

d5vmydt9

d5vmydt94#

在我的例子中,@卡梅隆answer不起作用,因为只返回了查询的一部分。除此之外,我还需要序列化日期。
所以我最后想到了下一个解决方案:

String extractQuery(SearchRequest searchRequest) {
    // jsonpMapper can be extracted to static field
    JacksonJsonpMapper jsonpMapper = new JacksonJsonpMapper()
    jsonpMapper.objectMapper().registerModule(new JavaTimeModule())
    jsonpMapper.objectMapper().setDateFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"))

    StringWriter writer = new StringWriter()
    JacksonJsonpGenerator generator = new JacksonJsonpGenerator(new JsonFactory().createGenerator(writer))
    searchRequest.serialize(generator, jsonpMapper)
    generator.flush()
    return writer.toString()
}

相关问题