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

