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

Elasticsearch 8.x:如何用ElasticsearchClient获取List<Map<String,Object>>

问题解决:ElasticsearchClient 获取 List<Map<String, Object>>结果

你可以通过两种方式在新的ElasticsearchClient中拿到和RestHighLevelClient一致的List<Map<String, Object>>结果:

方法一:直接指定Map.class作为泛型参数

直接将search方法的第二个参数改为Map.class,客户端会自动将文档源反序列化为Map<String, Object>类型,代码示例:

SearchResponse<Map<String, Object>> response = elasticSearchClient.search(searchRequest, Map.class);
List<Hit<Map<String, Object>>> hits = response.hits().hits();
List<Map<String, Object>> resultList = new ArrayList<>(hits.size());

for (Hit<Map<String, Object>> hit : hits) {
    Map<String, Object> sourceMap = hit.source();
    if (sourceMap != null) {
        resultList.add(sourceMap);
    }
}
return resultList;

方法二:借助JsonData转换(更灵活)

如果需要处理复杂的JSON结构或额外的序列化控制,可以使用JsonData作为中间类型,再转换为Map:

SearchResponse<JsonData> response = elasticSearchClient.search(searchRequest, JsonData.class);
List<Hit<JsonData>> hits = response.hits().hits();
List<Map<String, Object>> resultList = new ArrayList<>(hits.size());

for (Hit<JsonData> hit : hits) {
    JsonData jsonData = hit.source();
    if (jsonData != null) {
        Map<String, Object> sourceMap = jsonData.to(Map.class);
        resultList.add(sourceMap);
    }
}
return resultList;

为什么用Object.class不行?

当传入Object.class时,客户端会将JSON反序列化为默认的内部类型(如LinkedHashMap),但返回的是Object类型,需要强制转换才能转为Map,这种方式既不安全也不直观,直接指定Map.class是更规范的做法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 09:05:09