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

ElasticSearch Java API如何仅获取原始JSON文档?

直接获取Elasticsearch搜索的原始JSON响应

要绕过自动反序列化获取原始JSON字符串,不能直接用String.class——客户端默认会尝试把响应内容映射为String类型的POJO,这不符合它的序列化逻辑,因此会抛出MappingException。可以通过以下两种方式实现需求:

方法一:获取完整响应的原始JSON

利用客户端的JsonpMapper解析响应的原始字节流,拿到包含所有元数据和结果的完整JSON字符串:

// 执行搜索,用Void.class跳过POJO反序列化
SearchResponse<Void> response = client.search(searchRequest, Void.class);

// 通过JsonpMapper将响应转换为JSON字符串
JsonpMapper mapper = client._transport().jsonpMapper();
String rawFullJson = mapper.writeValueAsString(response);

方法二:单独提取命中文档的原始_source JSON

如果只需要每个文档的_source原始内容,可在请求中指定返回_source,再通过Hit对象结合JsonpMapper提取:

// 构建搜索请求(确保返回_source)
SearchRequest searchRequest = new SearchRequest.Builder()
    .index("your-index-name")
    .query(q -> q.matchAll(m -> m))
    .build();

// 执行搜索,跳过POJO反序列化
SearchResponse<Void> response = client.search(searchRequest, Void.class);

// 遍历结果,提取每个文档的原始_source JSON
for (Hit<Void> hit : response.hits().hits()) {
    JsonValue sourceJson = hit.source();
    String rawSourceJson = client._transport().jsonpMapper().writeValueAsString(sourceJson);
    // 自行处理rawSourceJson
}

关键说明

  • 使用Void.class作为泛型参数,是告诉客户端无需将响应内容反序列化为具体POJO,保留原始JSON结构。
  • 两种方式都避免了大量POJO反序列化的开销,能有效提升大数据量场景下的处理速度。

内容的提问来源于stack exchange,提问作者piet

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 01:05:59