聚合
聚合表示的是对某个索引(index)下的所有文档进行一些统计之类的操作,如下图1所示,将左边索引中的文档按照作者姓名进行分组,姓名相同的在一个组里,就可以分为下图右边的两个组,从中我们就可以得出名为allen的作者共写了两篇文章,名为smith的作者共写了三篇文章。在ES中,提供了丰富的语法,来进行对文档的统计操作,如对所有文档按照ip地址范围进行分组,对所有文档按照经纬度范围进行分组,对距离进行分组(如图2)等等。
在ES的语法中,分组称之为桶聚合(bucket),对桶内的文档进行一些数值计算,如求和,求最大等称之为指标聚合(metric),还有一些其他聚合如pipeline,matric,在此仅介绍下桶聚合和指标聚合。
桶聚合和指标聚合
根据上面我们桶聚合就是对所有文档按照某些规则进行分组,然后文档满足这些规则放入一个桶,不满足有放入另外一个桶。而指标集合指的是对文档集中的某一个字段进行数值上的操作,如求和,求最大最下等。
ES聚合语法模板(图3)
- 写关键字aggs
- 写聚合的名字
- 写聚合的类型(桶聚合和指标聚合),及在类型里写相应的逻辑
常见桶聚合类型
类型 | 说明 |
---|---|
filter | 筛选满足字段条件的文档 |
terms | 对文档集按照某一字段的不同取值进行分组 |
range | 对文档集按照某一字段的取值范围进行分组 |
注:terms中不能对text 类型进行操作
常见指标聚合类型
类型 | 说明 |
---|---|
avg | 对文档集中指定字段的值求平均值 |
max | 对文档集中指定字段的值求最大值 |
min | 对文档集中指定字段的值求最小值 |
sum | 对文档集中指定字段的值求和 |
stats | 对文档集中指定字段的值求统计信息,最大,最小,平均等 |
例子
以kibana_sample_data_ecommerce样本数据为例子
- 查询所有类别为男装的总税费价格
GET /kibana_sample_data_ecommerce/_search?
{
"size":0,
"aggs": {
"filter_category": {
"filter": {
"term":{
"category.keyword":"Men's Clothing"
}
},
"aggs":{
"sum_tax":{
"sum":{
"field":"taxful_total_price"
}
}
}
}
}
}
# -----------------------------------------------------------------------
"aggregations" : {
"filter_category" : {
"doc_count" : 2024,
"sum_tax" : {
"value" : 149393.91015625
}
}
}
- 查询所有交易的平均税费还有不同类别下不同制造的平均税费
GET /kibana_sample_data_ecommerce/_search?size=0
{
"aggs": {
"all_sum_tax":{
"sum":{
"field":"taxful_total_price"
}
},
"term_category": {
"terms": {
"field":"category.keyword"
},
"aggs":{
"manufactur":{
"terms":{
"field":"manufacturer.keyword"
},
"aggs":{
"avg_tax":{
"avg":{
"field":"taxful_total_price"
}
}
}
}
}
}
}
}
# ------------------------------------------------------------------------------
{
"all_sum_tax" : {
"value" : 350884.12890625
}
"buckets" : [
{
"key" : "Men's Clothing",
"doc_count" : 2024,
"manufactur" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 0,
"buckets" : [
{
"key" : "Elitelligence",
"doc_count" : 1242,
"avg_tax" : {
"value" : 67.25540333132045
}
},
{
"key" : "Low Tide Media",
"doc_count" : 1125,
"avg_tax" : {
"value" : 79.21282638888889
}
},
{
"key" : "Oceanavigations",
"doc_count" : 600,
"avg_tax" : {
"value" : 91.83341145833333
}
},
{
"key" : "Microlutions",
"doc_count" : 308,
"avg_tax" : {
"value" : 70.6087789163961
}
},
...
}
{....},
...,
{....}]
参考
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-filters-aggregation.html