ElasticSearch学习笔记(3)——聚合

前言

ES中的聚合功能类似于数据库中group by语句,但是功能更为强大。


1. 概念

SELECT COUNT(color) //指标

FROM table

GROUP BY color //桶

1.1 桶(Buckets):满足特定条件的文档集合

1.2 指标(Metrics):桶内文档的统计计算


2.基本语法

2.1 例子1

{

   "size" : 0,

  "aggs": { //第一个桶

      "colors": { //指定桶名称

        "terms": { //指定聚合类型

            "field": "color"

        },

        "aggs": { //嵌套桶

            "avg_price": { "avg": { "field": "price" } // 指定聚合类型

            },

            "make" : { // 桶名称

                "terms" : { // 指定聚合类型

                    "field" : "make"

                },

                "aggs" : { //嵌套桶

                    "min_price" : { "min": { "field": "price"} },  // 指定聚合类型

                    "max_price" : { "max": { "field": "price"} }  // 指定聚合类型

                }

            }

        }

      }

  }

}

2.2 例子2:histogram

"aggs":{

      "price":{

        "histogram":{ "field": "price", "interval": 20000 },

        "aggs":{

              "revenue": {

              "sum": {"field" : "price"}

            }

        }

      }

  }

2.3 例子3:date_histogram以及强制返回空桶

"aggs": {

      "sales": {

        "date_histogram": {

            "field": "sold",

            "interval": "month",

            "format": "yyyy-MM-dd",

            "min_doc_count" : 0, //强制返回空buckets

            "extended_bounds" : { //强制返回整年

                "min" : "2014-01-01",

                "max" : "2014-12-31"

            }

        }

      }

  }

2.4 例子4:后过滤器(只过滤搜索结果,不过滤聚合结果)post-filter

{

    "size" : 0,

    "query": {"match": {"make": "ford"}},

    "post_filter": {   

        "term" : { "color" : "green" }

    },

    "aggs" : {

        "all_colors": { "terms" : { "field" : "color" }}

    }

}

2.5 例子5:桶内置排序

"aggs" : {

        "colors" : {

            "terms" : {

              "field" : "color",

              "order": {"_count" : "asc" } //按文档数量排序

            }

        }

    }

2.6 例子6:按度量排序

"aggs" : {

        "colors" : {

            "terms" : {

              "field" : "color",

              "order": { "avg_price" : "asc" }

            },

            "aggs": {

                "avg_price": {"avg": {"field": "price"}

                }

            }

        }

    }

2.7 例子7:基于深度度量排序

"aggs" : {

        "colors" : {

            "histogram" : {

              "field" : "price",

              "interval": 20000,

              "order": {"red_green_cars>stats.variance" : "asc" } // 将度量用>嵌套

            },

            "aggs": {

                "red_green_cars": {

                    "filter": { "terms": {"color": ["red", "green"]}},

                    "aggs": {

                        "stats": {"extended_stats": {"field" : "price"}}

                    }

                }

            }

        }

    }



3.近似聚合

3.1 cardinality(去重)

1)语法

"aggs" : {

        "distinct_colors" : { "cardinality" : { "field" : "color","precision_threshold" : 100}}

//precision_threshold 表示在何种基数下希望得到一个近乎精确的结果

    }

2)原理

使用HyperLogLog(HLL)算法,该算法也应用于redis中,优点是,即使输入元素的数量或者体积非常非常大,计算基数所需的空间总是固定的、并且是很小的,redis中只需要12K内存,在标准误差0.81%的前提下,能够统计2^64个基数。

stream-lib 实现了一个java版本的HHL:https://github.com/addthis/stream-lib/blob/master/src/main/java/com/clearspring/analytics/stream/cardinality/HyperLogLog.java


3.2 percentiles、percentile_ranks(百分位计算)

1)语法

percentiles :默认情况下,percentiles会返回一组预定义的百分位数值[1, 5, 25, 50, 75, 95, 99],体现的是某个百分比以下所有文档的最小值

"aggs" : {

        "zones" : {

            "terms" : { "field" : "zone"},

            "aggs" : {

                "load_times" : {

                    "percentiles" : { 

                      "field" : "latency",

                      "percents" : [50, 95.0, 99.0] //感兴趣的百分比

                    }

                },

                {"avg_load_avg" : { "avg" : { "field" : "latency" } }}

            }

        }

    }

percentile_ranks:体现的是某个具体值属于哪一个百分比等级

"aggs" : {

        "zones" : {

            "terms" : { "field" : "zone"},

            "aggs" : {

                "load_times" : {

                    "percentile_ranks" : {

                      "field" : "latency",

                      "values" : [210, 800]

                    }

                }

            }

        }

    }

2)原理

使用TDigest算法

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,417评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,921评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,850评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,945评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,069评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,188评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,239评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,994评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,409评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,735评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,898评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,578评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,205评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,916评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,156评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,722评论 2 363
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,781评论 2 351

推荐阅读更多精彩内容