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

如何在ElasticSearch Rest High Level Client中使用has_child查询

ElasticSearch HasChild查询Java Rest High Level Client实现

前置说明

  • 需保证Rest High Level Client依赖版本和ES集群版本完全一致,否则可能出现序列化、API不兼容问题
  • 以下示例基于7.x版本编写,8.x版本仅需调整少量类导入路径即可适配
  • 请提前确认example1索引已经配置了join类型的字段,且子文档类型为schedule,否则查询会报错

完整代码示例

import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.join.query.HasChildQueryBuilder;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.InnerHitBuilder;
import org.elasticsearch.search.sort.ScoreMode;

import java.io.IOException;

public class HasChildQueryExample {
    public void searchExample(RestHighLevelClient client) throws IOException {
        // 构造空bool查询,对应DSL中query.bool的空配置
        BoolQueryBuilder childBoolQuery = QueryBuilders.boolQuery();
        
        // 构造HasChild查询,与DSL参数一一对应
        HasChildQueryBuilder hasChildQuery = QueryBuilders.hasChildQuery(
                "schedule", // 子文档类型,对应DSL的type参数
                childBoolQuery, // 子文档查询条件
                ScoreMode.MIN // 得分模式,对应score_mode: "min"
        )
        .maxChildren(10) // 对应max_children: 10
        .minChildren(1) // 对应min_children: 1
        .innerHit(new InnerHitBuilder()); // 开启inner_hits,对应inner_hits: {}
        
        // 组装查询源
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        sourceBuilder.query(hasChildQuery);
        
        // 构造搜索请求,指定查询索引为example1
        SearchRequest searchRequest = new SearchRequest("example1");
        searchRequest.source(sourceBuilder);
        
        // 执行查询
        SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
        
        // 解析返回结果(含inner_hits读取逻辑)
        for (SearchHit parentHit : response.getHits().getHits()) {
            // 父文档原始数据
            String parentSource = parentHit.getSourceAsString();
            // 读取关联的子文档inner_hits结果
            SearchHit[] childHits = parentHit.getInnerHits().get("schedule").getHits();
            for (SearchHit childHit : childHits) {
                String childSource = childHit.getSourceAsString();
                // 自行实现业务处理逻辑
            }
        }
    }
}

关键配置说明

  • 你可以给InnerHitBuilder传入分页、排序、返回字段等参数,自定义inner_hits的返回规则,不传参数即为默认空配置
  • ScoreMode可选值还包括MAX、SUM、AVG、NONE,可根据业务得分需求调整

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 01:51:02