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

如何将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结果后,按以下步骤处理:

  1. 先将主文档映射为MyClass实例
  2. 提取Inner Hits中的过滤后属性,映射为List<AttributeClass>
  3. 将过滤后的属性列表设置回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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 13:47:44