如何在OpenSearch的has_child查询中获取子文档总数?
在同一OpenSearch查询中获取父对象和子对象总数的方法
当然可以在同一个查询里同时拿到父对象总数和匹配的子对象总数,不用单独发起第二次查询。核心思路是利用**聚合(Aggregations)**功能,结合has_child聚合来统计子文档数量。
修改后的查询示例
GET index-name/_search { "from": 0, "size": 25, "track_total_hits": true, "query": { "bool": { "filter": [ { // 保留原有的过滤条件 }, { "has_child": { "type": "child", "query": { // 保留原有的子查询条件 }, "inner_hits": { "size": 100 } } } ] } }, "sort": [ { // 保留原有的排序条件 } ], "aggs": { "total_matching_children": { "has_child": { "type": "child", "query": { // 这里要和上面has_child里的子查询条件完全一致,确保统计的是同一批子文档 } }, "aggs": { "child_count": { "value_count": { "field": "_id" } } } } } }
结果解读
- 父对象总数:返回结果的
hits.total.value字段,和原查询的统计逻辑一致。 - 子对象总数:返回结果的
aggregations.total_matching_children.child_count.value字段,对应匹配子查询条件的子文档总数量。
注意事项
- 聚合里的
has_child子查询必须和原查询中has_child的子查询完全相同,否则统计的子文档范围会出现偏差。 - 用
value_count统计_id字段是因为每个文档的_id唯一,能保证统计结果准确;如果你的子文档有其他唯一标识字段,也可以替换成该字段。
内容的提问来源于stack exchange,提问作者Kevin Bourne
相关产品推荐
相关产品推荐

