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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 01:11:08