Elasticsearch - 将普通字段过滤器添加到嵌套字段聚合

Posted

技术标签:

【中文标题】Elasticsearch - 将普通字段过滤器添加到嵌套字段聚合【英文标题】:Elasticsearch - add normal field filter to nested field aggregation 【发布时间】:2021-11-06 21:16:45 【问题描述】:

我在 ES 中有如下文档结构:


  customer_id: 1,
  is_member: true,
  purchases: [
    
      pur_id: 1,
      pur_channel_id: 1,
      pur_amount: 100.00,
      pur_date: '2021-08-01'
    ,
    
      pur_id: 2,
      pur_channel_id: 2,
      pur_amount: 100.00,
      pur_date: '2021-08-02'
    
  ]
,

  customer_id: 2,
  is_member: false,
  purchases: [
    
      pur_id: 3,
      pur_channel_id: 1,
      pur_amount: 200.00,
      pur_date: '2021-07-01'
    ,
    
      pur_id: 4,
      pur_channel_id: 3,
      pur_amount: 300.00,
      pur_date: '2021-07-02'
    
  ]

我想通过 purchase.pur_channel_id 聚合总和,并且对于每个子聚合,我想在包含“is_member=false”的文档上添加子聚合聚合,因此,我编写了以下查询:

 
  "size": 0,
  "query": 
     "match_all": 
   
 ,
"aggs": 
  "purchases": 
    "nested": 
      "path": "purchases"
    ,
    "aggs": 
       "pur_channel_id": 
         "terms": 
           "field": "purchases.pur_channel_id",
           "size": 10
         ,
         "aggs": 
           "none_member": 
             "filter": 
               "term": 
                 "is_member": false
               
             ,
             "aggs": 
               "none_member_amount": 
                 "sum": 
                   "field": "purchases.pur_amount"
                 
               
             
           ,
           "aggs": 
             "pur_channel_amount": 
               "sum": 
                   "field": "purchases.pur_amount"
                   
             
           
         
       
    
  

查询运行成功,而我为所有“none_member_amount”得到 0。我想知道可能无法在嵌套聚合中添加普通字段。

请帮忙!谢谢。

【问题讨论】:

【参考方案1】:

嵌套聚合在嵌套块级别运行,因此您的查询是在嵌套文档中搜索 is_member 字段。要重新加入父文档,您需要使用 reverse nested aggregation 或者您可以使用过滤聚合在嵌套聚合之前移动 is_member 检查。

【讨论】:

以上是关于Elasticsearch - 将普通字段过滤器添加到嵌套字段聚合的主要内容,如果未能解决你的问题,请参考以下文章

Elasticsearch:Keep words token 过滤器

elasticsearch中不同字段中的两个过滤器(RANGE)

elasticsearch基本查询笔记(三)-- es查询总结

Elasticsearch7.8.0版本入门——JavaAPI操作(查询并字段过滤文档)

Elasticsearch7.8.0版本高级查询—— 过滤字段查询文档

Elasticsearch:过滤具有空geo_point值的文档