如何过滤ElasticSearch中的顶级术语聚合?

时间:2017-03-20 18:38:34

标签: elasticsearch nosql-aggregation nosql

我有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
               }
            }
         ]
      }
   }

但是这会过滤具有给定类别的某些产品的订单本身,并且聚合会损坏。

我希望将属于的畅销产品推荐给特定类别。

2 个答案:

答案 0 :(得分:1)

您可以使用filter aggregation

<dependency>
<groupId>com.github.hibernate-redis</groupId>
<artifactId>hibernate-redis</artifactId>
<version>1.6.8</version>
</dependency>

答案 1 :(得分:1)

解决这个问题:

{
   "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或&#34;陌生事物的确切序列&#34;发生的情况。