目前我有类似的东西
aggs: {
categories: {
terms: {
field: 'category'
}
}
}
这给了我每个类别的产品数量。但我有额外的条件。我需要获得每个类别中尚未销售的产品数量,因此我需要以某种方式对terms
进行过滤。
使用聚合框架是否有一些优雅的方法,或者我需要编写过滤查询?
谢谢
答案 0 :(得分:13)
您可以在Terms Aggregation和Filter Aggregation之间进行合并,这就是它的外观:(已测试)
aggs: {
categories: {
filter: {term: {sold: true}},
aggs: {
names: {
terms: {field: 'category'}
}
}
}
}
您可以向过滤器添加更多条件,我希望这会有所帮助。
答案 1 :(得分:0)
只需添加到其他答案中,您还可以使用嵌套查询。这类似于我必须要做的。我正在使用Elasticsearch 5.2。
在文档中,以下是基本语法:
"aggregations" : {
"<aggregation_name>" : {
"<aggregation_type>" : {
<aggregation_body>
}
[,"aggregations" : { [<sub_aggregation>]+ } ]?
}
[,"<aggregation_name_2>" : { ... } ]*
}
这是我的实现方式:
GET <path> core_data/_search
{
"aggs": {
"NAME": {
"nested": {
"path": "ATTRIBUTES"
},
"aggs": {
"NAME": {
"filter": {
"term": {
"ATTRIBUTES.ATTR_TYPE": "EDUCATION_DEGREE"
}
},
"aggs": {
"NAME": {
"terms": {
"field": "ATTRIBUTES.DESCRIPTION",
"size": 100
}
}
}
}
}
}
}
}
这将数据过滤到一个存储桶中,这正是我所需要的。