从聚合结果中过滤空桶

Posted

技术标签:

【中文标题】从聚合结果中过滤空桶【英文标题】:Filter empty buckets from aggregation results 【发布时间】:2016-10-02 06:42:54 【问题描述】:

因此,我们尝试过滤从 ElasticSearch 检索到的那些空存储桶,但没有成功。

通过聚合,我们可以找到:对于每种车辆颜色,对于每个时间戳,制造时间的总和。

在上一节中,我们编写了一个脚本,发现聚合超过了 1000 小时的制造时间。

它有效。不幸的是,我们收到的是empty buckets,而不是那些低于 1000 的过滤结果。

这是我们的查询:


 "size": 0,
 "aggs": 
  "colors": 
   "terms": 
    "field": "color"
    "min_doc_count": 1
   ,
   "aggs": 
    "timestamps": 
     "terms": 
      "field": "timestamp",
      "min_doc_count": 1
     ,
     "aggs": 
      "sum_manufacturing": 
       "sum": 
        "field": "hours"
       
      ,
      "manufacturing_bucket_filter": 
       "bucket_selector": 
        "buckets_path": 
         "hours": "sum_manufacturing"
        ,
        "script": 
         "inline": "hours > 1000",
         "lang": "expression"
        
       
      
     
    
   
  
 

您会注意到我们在这里和那里添加了“min_doc_count” - 但它不会起到作用。

这是一个作为结果检索到的空桶:


  "key": "Yellow",
  "doc_count": 336,
  "timestamps": 
    "doc_count_error_upper_bound": 0,
    "sum_other_doc_count": 332,
    "buckets": [

    ]
  

还有一个联合国空桶:


  "key": "Blue",
  "doc_count": 336,
  "timestamps": 
    "doc_count_error_upper_bound": 0,
    "sum_other_doc_count": 332,
    "buckets": [
      
        "key": 1464880946000,
        "key_as_string": "2016-06-02T15:22:26.000Z",
        "doc_count": 4,
        "sum_manufacturing": 
          "value": 1049
        
      
    ]
  

如果有办法过滤 out 空桶,那就太好了。 谢谢,任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

 "size": 0,
 "aggs": 
  "colors": 
   "terms": 
    "field": "color"
    "min_doc_count": 1
   ,
   "aggs": 
    "timestamps": 
     "terms": 
      "field": "timestamp",
      "min_doc_count": 1
     ,
     "aggs": 
      "sum_manufacturing": 
       "sum": 
        "field": "hours"
       
      ,
      "manufacturing_bucket_filter": 
       "bucket_selector": 
        "buckets_path": 
         "hours": "sum_manufacturing"
        ,
        "script": 
         "inline": "hours > 1000",
         "lang": "expression"
        
       
      ,
      "min_bucket_selector":
          "bucket_selector": 
            "buckets_path": "count": "sum_manufacturing._bucket_count",
            "script": "inline": "params.count != 0"
          
        
     
    
   
  
 

我认为这可能会解决您的问题。

【讨论】:

以上是关于从聚合结果中过滤空桶的主要内容,如果未能解决你的问题,请参考以下文章

聚合结果的 Elasticsearch 过滤器(用于搜索和聚合)

Elasticsearch 聚合按每个存储桶的前一个结果进行过滤

按列长度过滤结果

Mongoose 聚合:基于 Model.associated_Model.associated_Model.field 过滤返回错误结果

如果给定参数,猫鼬聚合过滤器

在常规过滤查询中使用“COUNT INTO 长度”或聚合函数