ElasticSearch:统计MATCHES空嵌套数组的文档数量求助
统计MATCHES嵌套数组为空的文档数量
问题描述
需要统计MATCHES嵌套数组为空(即"MATCHES": [])的文档数量。
文档结构
简化后的两条记录示例:
{ "hits": [ { "_type": "_doc", "_id": "ef0a2c44179a513476b080cc2a585d95", "_source": { "DIVISION_NUMBER": 44, "MATCHES": [ { "MATCH_STATUS": "APPROVED", "UPDATED_ON": 1599171303000 } ] } }, { "_type": "_doc", "_id": "ef0a2c44179a513476b080cc2a585d95", "_source": { "DIVISION_NUMBER": 44, "MATCHES": [ ] } } }
已尝试的聚合方案
以下聚合方法均未得到正确结果:
"aggs": { "sku": { "nested": { "path": "MATCHES" }, "aggs": { "empty-match-agg1": { "missing": { "field": "MATCHES" } }, "empty-match-agg2": { "terms": { "field": "MATCHES", "missing": "N/A" } }, "empty-match-agg3": { "sum": { "script": { "lang": "painless", "source": "params['_source'].MATCHES" } } }, "empty-match-agg4": { "filter": { "bool": { "must_not": { "nested": { "query": { "match_all": {} }, "path": "MATCHES" } } } } }, "empty-match-agg5": { "terms": { "field": "MATCHES" } } } } }
正确解决方案
方法一:脚本判断数组长度
通过Painless脚本直接判断MATCHES数组长度是否为0,结合filter聚合统计数量:
{ "size": 0, "aggs": { "empty_matches_count": { "filter": { "script": { "source": "doc['MATCHES'].length == 0" } } } } }
方法二:反向匹配嵌套元素
空数组文档中不存在任何MATCHES嵌套元素,通过must_not排除所有包含MATCHES元素的文档,即可统计空数组数量:
{ "size": 0, "aggs": { "empty_matches_count": { "filter": { "bool": { "must_not": { "nested": { "path": "MATCHES", "query": { "match_all": {} } } } } } } } }
错误原因说明
- 所有尝试的聚合都嵌套在
nested聚合下,但nested聚合仅处理包含MATCHES元素的文档,空数组文档不会进入该聚合范围,无法被统计。 empty-match-agg1的missing字段用法错误,MATCHES是嵌套数组类型,missing无法直接判断数组是否为空。empty-match-agg2和empty-match-agg5用terms聚合MATCHES字段,该字段为嵌套对象类型,不能直接作为聚合字段使用。empty-match-agg3的脚本返回数组对象,sum聚合无法对数组进行计算,会引发错误。empty-match-agg4的filter放在nested聚合内部,此时已限定为有MATCHES元素的文档,must_not嵌套查询不会命中任何结果。
内容的提问来源于stack exchange,提问作者Kunwar Shukla
相关产品推荐
相关产品推荐

