• 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(聚合条件)

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

  • 相关阅读:
    For-Each循环
    test
    网络学习一
    Struts2的interceptor
    Struts2的action解读
    js 读取<select>标签选项 索引
    java项目打jar包
    图解sendRedirect和forward的区别
    导入外部项目无法识别为Web项目无法部署到tomcat
    项目乱码的分析与解决
  • 原文地址:https://www.cnblogs.com/yb38156/p/13906874.html
Copyright © 2020-2023  润新知