Elasticsearch实用的聚合操作Aggs

2020-05-22 00:00:00 统计 切面 聚合 直方图 度量

es的aggs可以分为度量聚合和桶聚合,下面就直接实战开发中经常用到的语句。

1、度量聚合:min、max、sum、avg聚合, 度量聚合接收一个输入文档集并生成至少一个统计值sum。

1)sum聚合:统计不同日志类型的总数量sum(log_type)

"aggs": {

"sum_logtype": {

"sum": {

"field": "log_type"

} }}


2)count聚合:就是count(*)

"aggs": {

"sum_logtype": {

"count": {

"field": "log_type"

} }}

3)stats聚合:返回所有度量类型的统计

"stats_year": {
"count": 4,
"min": 1886,
"max": 1961,
"avg": 1928,
"sum": 7712

}

4)avg均值聚合

{

"aggs" : {

"avg_grade" : { "avg" : { "field" : "grade" } }

}}


2、桶聚合

桶聚合返回很多子集,并限定输入数据到一个特殊的叫做桶的子集中。可以把桶聚合想象成

类似前面切面功能的东西。

1、term聚合:词条的聚合

terms聚合为字段中每个词条返回一个桶。这允许你生成字段每个值的统计:例如每年出版多少书。类似于sql语句:count(book) group by year

统计不同日志类型的数量

"aggs": {

"sum_logtype": {

"terms": {

"field": "log_type"

} } }}

结果简单展示如下:

  • "buckets": [
  • {
  • "key": 3,
  • "doc_count": 22}
  • ,
  • {
  • "key": 2,
  • "doc_count": 11}
  • ,
  • {
  • "key": 1,
  • "doc_count": 5}


注意:这里还涉及到两个聚合的属性,一个返回的结果size,一个排序顺序

"size": 40,

"order": { "_term": "asc" }

使用key属性(_team)排序。另一个选择是_count来排序。


2、range聚合和date range聚合

顾名思义,range范围和时间范围聚合,直接上例子

"aggregations": {

"time_range": {

"range": {

"field": "timestamp",

"ranges": [

{

"to": 1487520050000

},

{

"from": 1487520050000,

"to": 1487520150000

},

{

"from": 1487520150000

}

]

}

}

}

如果需要对结果进行备注名称,可以采用参数"keyed": true,如下的语句进行设置key的名称:

"aggregations": {

"time_range": {

"range": {

"field": "timestamp",

"keyed": true,

"ranges": [

{

"key": "small", //可以不用设置,系统会默认制定

"to": 1487520050000

},

{

"key": "middle",

"from": 1487520050000,

"to": 1487520150000

},

{

"key": "big",

"from": 1487520150000

}

]

}

}

}

结果如下:


3)桶嵌套:还可以在聚合的内部再嵌套一个聚合,例如下面再嵌套一个度量的桶,对各个range进行度量统计。

"aggs": {

"time_range": {

"range": {

"field": "timestamp",

"keyed": true,

"ranges": [

{

"key": "small",

"to": 1487520050000

},

{

"key": "middle",

"from": 1487520050000,

"to": 1487520150000

},

{

"key": "big",

"from": 1487520150000

}

]

},

"aggs": {

"time_stat": {

"stats": {

"field": "timestamp"

}

}

} } }

还可以添加排序机制,根据平均值排序,




3)数值和日期直方图切面 Date Histogram Aggregation

数值直方图,这个实际应用中比较经常用到,例如每隔50000ms统计一次数据,用柱形图显示

数值直方图

"aggregations": {

"test": {

"histogram": {

"field": "timestamp",

"interval": 50000

}

}

}

注意有一个参数可以选择设置,小统计值:"min_doc_count" : 640 少满足640才显示

"aggs": {

"test": {

"histogram": {

"field": "timestamp",

"interval": 50000,

"min_doc_count": 640

}

}

}

时间直方图采用date_histogram,原理一样


3、使用过滤器来计算切面,过滤器返回文档数目的切面

谈到性能,filter切面的速度比query切面或包装查询的filter切面更快

一个是查询的过滤,一个是桶里面的过滤,可以看下官方的文档,具体我就不说了

Filter Aggregation | Elasticsearch Reference [6.2] | Elasticwww.elastic.co

例如:

"aggs" : {
"t_shirts" : {
"filter" : { "term": { "type": "t-shirt" } },
"aggs" : {
"avg_price" : { "avg" : { "field" : "price" } }
}
}
}

相关文章