• 【大数据】es Elasticsearch 时间分组聚合查询


    正常业务逻辑中,会出现大量的数据统计,比如说分组聚合查询,根据天进行数据的统计,记录下es分组聚合查询

    {
    “size”: 0,
    “aggs”: {
    “groupDate”: {
    “date_histogram”: {
    “field”: “create_date”,
    “interval”: “day”,
    “format”: “yyyy-MM-dd”
    }
    }
    }
    }

    此处使用按天分组,可用的时间间隔表达式:year, quarter, month, week, day, hour, minute, second(年份、季度、月、周、日、小时、分钟、秒)。

    {
    “size”: 0,
    “aggs”: {
    “groupDate”: {
    “date_histogram”: {
    “field”: “create_date”,
    “interval”: “90m”,
    “format”: “yyyy-MM-dd”
    }
    }
    }
    }

    此处也可以根据小时分组,1.5h则用分钟来表示(90m)
    上面是官方提供的方法,size属性可以控制是否返回聚合的数据结果集,因为我们设置了 size 参数,所以不会有 hits 搜索结果返回。

    {
    “aggregations”:{
    “groupDate”:{
    “buckets”:[
    {
    “key_as_string”:“2018-08-28”,
    “key”:1535430600000,
    “doc_count”:590000
    },
    {
    “key_as_string”:“2018-08-28”,
    “key”:1535436000000,
    “doc_count”:470000
    }
    ]
    }
    }
    }

    groupDate 聚合是作为 aggregations 字段的一部分被返回的,每一个 key 都与分组条件对应,我这里是根据1.5小时分组,key 将会显示分组的时间,doc_count 字段,将会告诉我们包含此项的文档数量。
    下面是根据官方文档给出的api调用方式:

    // 声明where 条件
    BoolQueryBuilder qbs = QueryBuilders.boolQuery();

    AggregationBuilder aggregation = AggregationBuilders.dateHistogram(“agg”).field(“create_time”)
    .interval(DateHistogramInterval.DAY).format(“yyyy-MM-dd”);

    SearchRequestBuilder requestBuilder = client.prepareSearch(“user_login_detail”)
    .setTypes(“login_detail”);
    requestBuilder.setQuery(qbs);
    requestBuilder.addAggregation(aggregation);
    SearchResponse response = requestBuilder.execute().actionGet();
    Histogram agg = response.getAggregations().get(“agg”);

    // For each entry
    for (Histogram.Bucket entry : agg.getBuckets()) {
    String key = StringUtil.nullBlank(entry.getKey());
    String keyAsString = entry.getKeyAsString();
    long docCount = entry.getDocCount();

    System.out.println(“key [{” + keyAsString + “}]”);
    System.out.println(“date [{” + key + “}]”);
    System.out.println(“doc_count [{” + docCount + “}]”);
    }

    DateHistogramInterval.DAY 方法提供根据天分组或者是根据时间间隔分组
    ————————————————
    版权声明:本文为CSDN博主「不要忘记当初的目标」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/jianshaoguang8886/article/details/82178817

  • 相关阅读:
    理想之光不灭
    css预处理是什么?作用是什么?
    数据库练习题
    C# 取消一个不带CancellationToken的任务?
    机器学习笔记之线性分类——线性判别分析(一)模型构建思路
    在Postman中调用JShaman免费JS混淆加密接口,实现JS代码加密
    SaaSBase:什么是快鲸SCRM?
    【Java基础】字节缓冲流构造方法、字节流复制视频、字符流及编码表介绍
    港科夜闻|香港科大近百名创新企业家回归母校庆祝大学首个「独角兽日」
    ssh-keygen(linux 命令) 创建 private key(私钥) , public key (公钥),实现ssh,scp,sftp命令无密码连接
  • 原文地址:https://blog.csdn.net/m0_67391683/article/details/126553360