如何过滤 ElasticSearch 中的热门术语聚合?

How to filter top terms aggregation in ElasticSearch?

我有 orders 个这样的文档:

{
   "customer":{
      "id":1,
      "Name":"Foobar"
   },
   "products":[
      {
         "id":1,
         "name":"Television",
         "category": 11
      },
      {
         "id":2,
         "name":"Smartphone",
         "category": 12
      }
   ]
}

我正在执行top_terms_aggregation以了解最畅销的产品。要在全球范围内进行,我使用:

{
   "size":0,
   "aggs":{
      "products":{
         "nested":{
            "path":"products"
         },
         "aggs":{
            "top_terms_aggregation":{
               "terms":{
                  "field":"products.id",
                  "size":10
               }
            }
         }
      }
   }
}

但是,如果给定 category_id,我将如何筛选产品?我尝试添加此过滤器:

  "query":{
      "bool":{
         "must":[
            {
               "match":{
                  "products.category":11
               }
            }
         ]
      }
   }

但这会过滤包含 一些 给定类别产品的订单本身,并且聚合会损坏。

我想获取属于给定类别的畅销产品。

您可以使用filter aggregation

GET _search
{
   "size":0,
   "aggs":{
      "products":{
         "nested":{
            "path":"products"
         },
         "filter": {
           "term": {
             "category": 11
           }
         }, 
         "aggs":{
            "top_terms_aggregation":{
               "terms":{
                  "field":"products.id",
                  "size":10
               }
            }
         }
      }
   }
}

这样解决的:

{
   "size":0,
   "aggs":{
      "products":{
         "nested":{
            "path":"products"
         },
         "aggs":{
            "first_filter":{
               "filter":{
                  "term":{
                     "products.category":11
                  }
               },
               "aggs":{
                  "top_terms_aggregation":{
                     "terms":{
                        "field":"products.id",
                        "size":10
                     }
                  }
               }
            }
         }
      }
   }
}

一定是 aggs 或 "stranger things" 的确切顺序发生了。