如何将Elasticsearch Inner Hits结果映射到Java类?
解决Inner Hits结果映射回MyClass的方案
针对你用Spring Boot + Elasticsearch 7.17.3遇到的Inner Hits结果映射问题,这里提供两种可行的处理方式:
一、手动提取Inner Hits数据并合并到MyClass
首先假设你的实体类结构如下:
public class MyClass { // 其他业务字段 private List<AttributeClass> attributes; // getter、setter方法 } public class AttributeClass { private String name; private String value; // getter、setter方法 }
当通过RestHighLevelClient执行查询拿到SearchHit结果后,按以下步骤处理:
- 先将主文档映射为MyClass实例
- 提取Inner Hits中的过滤后属性,映射为
List<AttributeClass> - 将过滤后的属性列表设置回MyClass对象
代码示例:
// 获取单个搜索结果 SearchHit hit = searchResponse.getHits().getHits()[0]; // 映射主文档到MyClass MyClass myClass = hit.getSourceAsObject(MyClass.class); // 提取Inner Hits中的attributes数据 InnerHitsResult innerHits = hit.getInnerHits().get("attributes"); List<AttributeClass> filteredAttributes = new ArrayList<>(); for (SearchHit innerHit : innerHits.getHits().getHits()) { AttributeClass attr = innerHit.getSourceAsObject(AttributeClass.class); filteredAttributes.add(attr); } // 将过滤后的属性替换原MyClass中的attributes myClass.setAttributes(filteredAttributes);
二、生成可读JSON
如果需要将合并后的结果转为可读JSON,直接用Jackson序列化即可:
ObjectMapper objectMapper = new ObjectMapper(); // 生成格式化的JSON字符串 String readableJson = objectMapper.writerWithDefaultPrettyPrinter() .writeValueAsString(myClass);
补充说明
Inner Hits的设计就是返回匹配查询条件的嵌套子文档集合,它独立于主文档的_source字段,因此无法自动映射到原MyClass,必须手动提取并合并。如果你的需求只是过滤嵌套字段返回,也可以考虑在查询DSL中通过_source的包含/排除规则配合嵌套查询,但这种方式无法精准返回匹配的嵌套子文档,仅适用于简单过滤场景。
内容的提问来源于stack exchange,提问作者Pompompurin
相关产品推荐
相关产品推荐

