声明:本站文章均为作者个人原创,图片均为实际截图。如有需要请收藏网站,禁止转载,谢谢配合!!!

Aggregations

  • 聚合,提供了一种基于查询条件来对数据进行分桶、计算的方法。有点类似于 SQL 中的 group by 再加一些函数方法的操作
  • 聚合可以嵌套,由此可以组成复杂的操作(Bucketing聚合可以包含sub-aggregation)

聚合可以实现对文档数据的统计 分析 运算,常见聚合有三类

  • 桶bucket聚合:用来对文档做分组
    • TermAggregation 按照文档字段分组
    • Date Histogram 按照日期阶梯分组,比如一周为一组 或者 一月为一组
  • 度量metric聚合: 用来计算一些值
    • Avg 平均值
    • Max 求最大值
    • Avg 求最小值
    • Stats 同时求 max min avg sum等
  • 管道pipeline聚合: 其他聚合的结果为基础做聚合

参与聚合的字段类型必须是

  • keyword
  • 数值
  • 日期
  • 布尔

聚合提供了分组并统计数据的能力。理解聚合的最简单的方式是将其粗略地等同为SQL的GROUP BY和SQL聚合函数。在Elasticsearch中,你可以在一个响应中同时返回命中的数据和聚合结果。你可以使用简单的API同时运行查询和多个聚合,并以一次返回,这避免了来回的网络通信,这是非常强大和高效的。

桶聚合 Bucket

GET /hotel/_search
{
    "query": {
        "range": {
            "price": {
                "lte": 200 //限定聚合范围
            }
        }
    }
    "size": 0,
    "aggs": {
        "brandAgg": {
            "terms": {
                "field": "brand",
                "order":{
                    //"_count": "asc" //默认按照文档数量倒序排序,可以设置为升序排序
                }
                "size": 10
            }
        }
    }
}

得到结果为

{
    aggregations:{
        brandAgg: {
            buckets:[
                {
                    "key": "如家",
                    "doc_count": 859,
                },
                {
                    "key": "汉庭",
                    "doc_count": 652,
                }
            ] 

        }
    }
}

嵌套聚合 Metric

分别计算出每个

GET /hotel/_search
{
    "query": {
        "range": {
            "price": {
                "lte": 200 //限定聚合范围
            }
        }
    }
    "size": 0,
    "aggs": {
        "brandAgg": {
            "terms": {
                "field": "brand",
                "size": 10,
                "order":{
                    "scoreAgg.avg": "desc" //按照分值平均值倒序排序
                }
            },
            "aggs": {
                "scoreAgg": {
                    "stats": {  // stats 同时求 max min avg sum等
                        "field": "score",
                    }
                }
            }
        }
    }
}

得到结果为

{
    aggregations:{
        brandAgg: {
            buckets:[
                {
                    "key": "如家",
                    "doc_count": 100,
                    "scoreAgg":{
                        "count": 100,
                        "min": 1,
                        "max": 5,
                        "avg": 4, //平均得分
                        "sum": 400
                    }
                },
                {
                    "key": "汉庭",
                    "doc_count": 200,
                    "scoreAgg":{
                        "count": 200,
                        "min": 1,
                        "max": 5,
                        "avg": 3, //平均得分
                        "sum": 600
                    }
                }
            ] 

        }
    }
}