我们的项目数据源是es,需要对数据进行按月,按周,按天,按小时聚合
后来需求扩展,聚合方式,聚合字段都要做成可选,于是花了点时间读了一遍es官网API,由于矩阵和管道用不到,没有花时间去阅读API
最常用的还是桶(bucket)和指标(metric)的聚合,这两个概念,对比关系型数据库做了一些类比(注意不是等价),
es的聚合方式可以组合,甚至可以组合成非常复杂的聚合(复杂聚合一般专门用于分析,不会用于报表这样的需求)
一般来讲,桶聚合分单桶和多桶,以及动态桶聚合三类,可以拿group by类比来理解(但不是仅仅group by)
指标聚合,分单值和多值2类(特殊的不考虑,用的少)
学习过程,应该先理解概念,类比下已有的知识,比如sql里面的count,sum,group by
然后按照最常用的几种,比如桶聚合中的histogram3小类,range,复杂一点的composite(项目里面要用正是这个,复合聚合)
指标聚合类型比较零散,看聚合类型名就能大概理解是做什么的
下图是我整理的分类和关键点图:
理解了概念和用处后,需要知道怎么用
第一步,理解DSL聚合查询的结构
"aggregations" : { "<aggregation_name>" : { "<aggregation_type>" : { <aggregation_body> } [,"meta" : { [<meta_data_body>] } ]? [,"aggregations" : { [<sub_aggregation>]+ } ]? } [,"<aggregation_name_2>" : { ... } ]* }
DSL语句都是json格式的
1、最外层的aggregations可以理解成关键字,就像es普通查询的query关键字一样,这里用aggregations或者aggs,es均支持
2、aggregation_name是需要指定的聚合名,比如price_count,price_avg,visit_agg等等
3、aggregation_type,是要指定的具体的聚合类型,就是上图中的date_histogram,avg等等聚合
4、aggregation_body,聚合的具体逻辑
5、aggregations,子聚合,一个聚合类型下可以嵌套若干个子聚合
6、aggregation_name2,第二个聚合,和第一个聚合并列
第二步:理解每种聚合特有的属性意义和用法
例如date_histogram有很多需要用到的属性,format,interval等等
第三步:学会使用API,我用的java API,四个关键的类:
1、 RestHighLevelClient
2、 SearchRequest
3、 SearchSourceBuilder
4、 AggregationBuilder和QueryBuilder(聚合条件)
官网有很多例子,几乎都可以现用,具体的聚合类型的用法,会在其他的博文中记录