es 聚合方式
ES支持灵活的聚合方式,它不仅支持聚合和查询相结合,而且还可以使聚合的过滤条件不影响搜索条件,并且还支持在聚合后的结果中进行过滤筛选。
直接聚合
直接聚合指的是聚合时的DSL没有query子句,是直接对索引内的所有文档进行聚合。
GET /hotel/_search
{
"size": 0,
"aggs": {
"my_agg": { //聚合名称
"avg": {
"field": "price" //计算文档的平均价格
}
}
}
}
先查询再聚合
与直接聚合相对应,这种查询方式需要增加query子句,query子句和普通的query查询没有区别,参加聚合的文档必须匹配query查询。
{
// "size": 0,
"query": { //指定查询query逻辑
"term": {
"city": {
"value": "北京"
}
}
},
"aggs": { //指定聚合逻辑
"my_agg": {
"avg": {
"field": "price"
}
}
}
}
前过滤器
有时需要对聚合条件进一步地过滤,但是又不能影响当前的查询条件。
{
"size": 0,
"query": { //指定查询的query逻辑
"term": {
"city": {
"value": "青岛"
}
}
},
"aggs": {
"my_agg": {
"filter": { //指定过滤器逻辑
"term": {
"full_room": true
}
},
"aggs": { //指定聚合逻辑
"my_avg": {
"avg": {
"field": "price"
}
}
}
}
}
}
后过滤器
该过滤器是在查询和聚合之后进行过滤的,因此它的过滤条件对聚合没有影响。
{
//"size": 0,
"query": { //指定查询的query逻辑
"match": {
"title": "酒店"
}
},
"aggs": { //指定聚合逻辑
"my_agg": {
"avg": {
"field": "price",
"missing": 200
}
}
},
"post_filter": { //指定后过滤器逻辑
"term": {
"city": "北京"
}
}
}