es-aggregations模块学习总结

我们的项目数据源是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(聚合条件)

官网有很多例子,几乎都可以现用,具体的聚合类型的用法,会在其他的博文中记录

原文地址:https://www.cnblogs.com/yb38156/p/13906874.html