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
相关产品推荐
相关产品推荐

