Elasticsearch v6.4聚合:能否返回未匹配文档的空桶?
Elasticsearch聚合查询:实现无匹配文档时返回指定空桶
需求说明
统计指定主部门(leadingDivisionId为554)下各部门的以下文档数量:
- 文档类型ID为72(
documentType.id=72) - 存在
registrationNumber字段
原查询语句
{ "query": { "bool": { "must": [ { "term": { "division.leadingDivisionId": "554" } }, { "terms": { "documentType.id": [ "72" ] } }, { "exists": { "field": "registrationNumber" } } ] } }, "aggs": { "body": { "terms": { "field": "division.leadingDivisionId", "size": 1500, "order": { "_count": "desc" }, "min_doc_count": 1 }, "aggs": { "body": { "terms": { "field": "division.id", "size": 1500, "order": { "_count": "desc" }, "min_doc_count": 1 }, "aggs": { "body": { "terms": { "field": "documentType.id", "size": 1500, "order": { "_term": "asc" }, "min_doc_count": 0 } } } } } } } }
当前问题
原查询无法在部门无指定类型文档时返回如下结构的空桶:
{ "key": "72", "doc_count": 0, "key_as_string": null }
仅当部门存在文档但不符合registrationNumber存在条件时,才会生成该空桶。需要实现:无论部门是否有对应文档,都返回指定类型的空桶,保证每个部门的桶数量与顺序一致。
解决方案及修改后查询
要实现该需求,需调整聚合逻辑,绕开外层query的过滤限制,强制生成指定类型的空桶:
{ "size": 0, "aggs": { "global_docs": { "global": {}, "aggs": { "filter_main_division": { "filter": { "term": { "division.leadingDivisionId": "554" } }, "aggs": { "group_by_division": { "terms": { "field": "division.id", "size": 1500, "order": { "_count": "desc" }, "min_doc_count": 0 }, "aggs": { "target_doc_type": { "terms": { "field": "documentType.id", "include": ["72"], "size": 1, "order": { "_term": "asc" }, "min_doc_count": 0 }, "aggs": { "has_registration_number": { "filter": { "exists": { "field": "registrationNumber" } } } } } } } } } } } } }
关键修改点
- 使用
global聚合作为顶层聚合,脱离外层query的限制,确保主部门下所有部门都能被聚合到 group_by_division的terms聚合设置min_doc_count:0,强制生成所有主部门下部门的桶,无论该部门是否有文档target_doc_type的terms聚合通过include: ["72"]指定只返回目标文档类型的桶,同时设置min_doc_count:0,确保无该类型文档时也生成doc_count=0的空桶- 内层
has_registration_number聚合用于统计符合registrationNumber存在条件的文档数量,可直接从结果中获取有效统计数
内容的提问来源于stack exchange,提问作者vr552
相关产品推荐
相关产品推荐

