2020年9月

Elasticsearch笔记:聚合查询之分页

  • 正常情况下是不支持聚合后分页的,以下的原理是按照某个字段分组(桶),再对组(桶)进行排序或直接截断(分页)

  • 分页后是得不到分组后的组的总个数,目前采用的方法是先去查询组的总个数,然后分页,接着将两个结果合在一起使用

POST /log_*/_search
{
  "size": 0,
  "aggs": {
    "day": {
      "date_histogram": {
        "field": "@timestamp",
        "interval": "day",
        "format": "yyyy-MM-dd"
      },
    "aggs": {
      "bucket_truncate": {
        "bucket_sort": {
          "from": 0,
          "size": 20
        }
      }
    }
    }
  }
}

解释

  • 第一个size
    表示返回0条数据(hits中的数据)

  • 第一个aggs
    表示对@timestamp按照天进行分组,并将结果进行日期格式化

  • 第二个aggs
    对结果进行排序,这里没有排序,只做了截断(分页)

这样就实现了对聚合的结果进行了分页

备注

1

获取分组后,分了几组(总数),可以再次调用接口查询数据,取查询到数据的个数即可(记得去掉第二的aggs),这是目前想到最笨的办法,如果你有更好的办法可以分享一下呦!


官网:
https://www.elastic.co/guide/en/elasticsearch/reference/6.8/search-aggregations-pipeline-bucket-sort-aggregation.html


Elasticsearch笔记:聚合查询

聚合框架有助于根据搜索查询提供聚合数据。聚合查询是数据库中重要的功能特性,ES作为搜索引擎兼数据库,同样提供了强大的聚合分析能力。它基于查询条件来对数据进行分桶、计算的方法。有点类似于 SQL 中的 group by 再加一些函数方法的操作。聚合可以嵌套,由此可以组成复杂的操作(Bucketing聚合可以包含sub-aggregation)。


聚合计算的值可以取字段的值,也可是脚本计算的结果。查询请求体中以aggregations节点的语法定义: 


"aggregations" : {                        //也可简写为 aggs

    "<aggregation_name>" : {      //聚合的名字

        "<aggregation_type>" : {     //聚合的类型

            <aggregation_body>      //聚合体:对哪些字段进行聚合

        }

        [,"meta" : {  [<meta_data_body>] } ]?                 //元

        [,"aggregations" : { [<sub_aggregation>]+ } ]?   //在聚合里面在定义子聚合

    }

    [,"<aggregation_name_2>" : { ... } ]*                      //聚合的名字

}



————————————————

版权声明:本文为CSDN博主「布道」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/alex_xfboy/article/details/86100037