ES 提供了三种聚合方式,分别是桶聚合,指标聚合和管道聚合。 类似于SQL:
SELECT COUNT(color)
FROM table
GROUP BY color
ElasticSearch中桶在概念上类似于 SQL 的分组(GROUP BY),而指标则类似于 COUNT() 、 SUM() 、 MAX() 等统计方法。
进而引入了两个概念:
- 桶(Buckets) 满足特定条件的文档的集合
- 指标(Metrics) 对桶内的文档进行统计计算
所以ElasticSearch包含3种聚合(Aggregation)方式
- 桶聚合(Bucket Aggregation)
- 指标聚合(Metric Aggregation)
- 管道聚合(Pipline Aggregation)
- 聚合管道化,简单而言就是上一个聚合的结果成为下个聚合的输入;
注意:桶聚合和指标聚合很多情况下是可以一起使用的,桶聚合是特殊的指标聚合,聚合指标就是数据的条数count。
有用的链接
https://pdai.tech/md/db/nosql-es/elasticsearch-x-agg-bucket.html
ES 聚合理解思路
桶聚合
准备数据
POST /test-agg-cars/_bulk
{ "index": {}}
{ "price" : 10000, "color" : "red", "make" : "honda", "sold" : "2014-10-28" }
{ "index": {}}
{ "price" : 20000, "color" : "red", "make" : "honda", "sold" : "2014-11-05" }
{ "index": {}}
{ "price" : 30000, "color" : "green", "make" : "ford", "sold" : "2014-05-18" }
{ "index": {}}
{ "price" : 15000, "color" : "blue", "make" : "toyota", "sold" : "2014-07-02" }
{ "index": {}}
{ "price" : 12000, "color" : "green", "make" : "toyota", "sold" : "2014-08-19" }
{ "index": {}}
{ "price" : 20000, "color" : "red", "make" : "honda", "sold" : "2014-11-05" }
{ "index": {}}
{ "price" : 80000, "color" : "red", "make" : "bmw", "sold" : "2014-01-01" }
{ "index": {}}
{ "price" : 25000, "color" : "blue", "make" : "ford", "sold" : "2014-02-12" }
标准聚合
GET /test-agg-cars/_search
{
"size" : 0,
"aggs" : {
"popular_colors" : {
"terms" : {
"field" : "color.keyword"
}
}
}
}
聚合参数
- 聚合操作被置于顶层参数 aggs 之下(如果你愿意,完整形式 aggregations 同样有效)。
- 指定聚合名称
- 指定每个桶的类型,即根据哪个字段聚合。(本例中根据color字段聚合)
多聚合
可以同时计算多个桶的结果,即根据多个字段进行聚合,每个聚合结果互不影响。注意和嵌套聚合的区别: ```json GET /test-agg-cars/_search { “size” : 0, “aggs” : {
} }"popular_colors" : {
"terms" : {
"field" : "color.keyword"
}
},
"make_by" : {
"terms" : {
"field" : "make.keyword"
}
}
<a name="ftjdv"></a>
## 嵌套聚合
在聚合桶内进行在聚合,如下面的例子,按照颜色聚合后再计算每个桶内的平均price。
```json
GET /test-agg-cars/_search
{
"size" : 0,
"aggs": {
"colors": {
"terms": {
"field": "color.keyword"
},
"aggs": {
"avg_price": {
"avg": {
"field": "price"
}
}
}
}
}
}
动态脚本的聚合
GET /test-agg-cars/_search
{
"runtime_mappings": {
"make.length": {
"type": "long",
"script": "emit(doc['make.keyword'].value.length())"
}
},
"size" : 0,
"aggs": {
"make_length": {
"histogram": {
"interval": 1,
"field": "make.length"
}
}
}
}