一 聚合的分类

1.1    分组聚合(bucket)

分组聚合,就是指依据哪一个字段进行分组,然后该字段相同的值的文档都在一个bucket中

GET /索引/类型/_search

{

"size" : 0,

"aggs" : {

"bucket聚合名称" : {

"terms" : {

"field" : "分组字段"

}

}

}

}

1.2    度量聚合(metric)

度量聚合,一般是指根据分组后结果,进行分组的计算,比如统计求和,求平均数,以及什么最大值或者最小值之类

"aggs": {

"metric聚合名称": {

"metric类型(avg,max之类)": {

"field": "统计字段"

}

}

}

1.3 管道聚合(pipeline)

这一类聚合的数据源是其他聚合的输出,然后进行相关指标的计算

二 分组聚合

就是根据指定字段,创建文档分组。

3.1 子聚合(Children Aggregation)

子聚合是一个特殊的单分组聚合,可以通过父类型文档的分组聚合产生子类型文档分组。这种聚合依赖于映射中的_parent字段,只有一个选项:type表示父空间的分组应该被映射哪一种子类型

PUT child_example

{

"mappings": {

"answer" : {

"_parent" : {

"type" :"question"

}

}

}

}

PUT child_example/question/1

{

"body":"<p>I have Windows 2003 server and i bought a new Windows 2008server...",

"title": "Whatsthe best way to file transfer my site from server to a newer one?",

"tags": [

"windows-server-2003",

"windows-server-2008",

"file-transfer"

]

}

PUT child_example/answer/1?parent=1&refresh

{

"owner": {

"location":"Norfolk, United Kingdom",

"display_name":"Sam",

"id": 48

},

"body":"<p>Unfortunately you're pretty much limited to FTP...",

"creation_date":"2009-05-04T13:45:37.030"

}

PUT child_example/answer/2?parent=1&refresh

{

"owner": {

"location":"Norfolk, United Kingdom",

"display_name":"Troll",

"id": 49

},

"body":"<p>Use Linux...",

"creation_date":"2009-05-05T13:45:37.030"

}

POST child_example/_search?size=0

{

"aggs":{

"top-tags":{

"terms":{

"field":"tags.keyword",

"size": 10

},

"aggs": {

"to-answers": {

"children":{

"type":"answer"

},

"aggs":{

"top-names":{

"terms":{

"field":"owner.display_name.keyword",

"size": 10

}

}

}

}

}

}

}

}

2.2 直方图聚合(histogram aggregation)

它主要是根据某一个字段,按照这个field的值的各个范围区间,进行bucket分组操作,比如我们将价格分组,0~1000,1000~2000,2000

~3000之类的

"histogram":{

"field":"分组字段",

"interval":间隔

}

POST /ecommerce/music/_search

{

"size":0,

"aggs":{

"prices":{

"histogram":{

"field":"price",

"interval":1000

}

}

}

}

最后讲价格划分成0-1000,1000-2000,2000-3000,3000-4000四个范围

"aggregations":{

"prices": {

"buckets": [

{

"key": 0,

"doc_count": 5

},

{

"key": 1000,

"doc_count": 2

},

{

"key": 2000,

"doc_count": 0

},

{

"key": 3000,

"doc_count": 2

},

{

"key": 4000,

"doc_count": 2

}

]

}

}

2.3 日期直方图(date histogram)

POST/ecommerce/music/_search

{

"size" : 0,

"aggs": {

"sales": {

"date_histogram": {

"field":"c_date",

"interval":"month",

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

"min_doc_count" : 0,

"extended_bounds" : {

"min" :"2016-01-01",

"max" :"2017-01-01"

}

}

}

}

}

aggs.sales:表示聚合名字

aggs.sales.date_histogram:表示使用的bucket策略

aggs.sales.date_histogram.field:哪一个字段用于分组

aggs.sales.date_histogram.format:格式化

aggs.sales.date_histogram.interval:时间间隔[interval字段支持多种关键字:`year`, `quarter`, `month`, `week`, `day`, `hour`,`minute`, `second`]

aggs.sales.date_histogram.min_doc_count:0,表示即使没有数据,也要把分组显示出来,文档个数为0

aggs.sales.date_histogram.extended_bounds.min:指定时间下限

aggs.sales.date_histogram.extended_bounds.max:指定时间上限

"aggregations":{

"sales": {

"buckets": [

{

"key_as_string":"2016-01-01",

"key": 1451606400000,

"doc_count": 1

},

......

]

}

}

aggregations.sales:表示该组合聚合名字

aggregations.sales.buckets:分组信息

aggregations.sales.buckets.key_as_string: 组名

aggregations.sales.buckets.key:代表了日期时间戳

aggregations.sales.buckets.doc_count:该组内的文档数

2.4 日期范围聚合(date range)

POST/ecommerce/music/_search

{

"size":0,

"aggs":{

"music_ranage":{

"date_range":{

"field":"c_date",

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

"ranges":{

"from":"2016-01-01",

"to":"2017-01-01"

}

}

}

}

}

aggs.music_range:该时间范围分组聚合的名字

aggs.music_range.date_range:  指定聚合策略为时间范围

aggs.music_range.date_range.field: 聚合使用字段

aggs.music_range.date_range.format:字符串格式化

aggs.music_range.date_range.ranges: 一个时间范围的数组,里面可以是一个{"to"},{"from","to"},{"from"}

"aggregations":{

"music_ranage": {

"buckets": [

{

"key":"*-2015-12-31",

"to": 1451520000000,

"to_as_string":"2015-12-31",

"doc_count": 4

},

{

"key":"2016-01-01-2016-12-31",

"from": 1451606400000,

"from_as_string":"2016-01-01",

"to": 1483142400000,

"to_as_string":"2016-12-31",

"doc_count": 3

},

{

"key":"2017-01-01-*",

"from": 1483228800000,

"from_as_string":"2017-01-01",

"doc_count": 4

}

]

}

}

2.5 过滤聚合(filteraggregation & filters aggregation)

过滤聚合,言外之意就是针对某字段进行过滤

POST /ecommerce/music/_search

{

"size":0,

"aggs":{

"music_filter":{

"filter":{

"term":{"color": "红"}

}

}

}

}

POST /ecommerce/music/_search

{

"size":0,

"aggs":{

"color_filter":{ "filters":{

"filters":{

"吉他":{"match":{"desc":"吉他"}},

"贝斯":{"match":{"desc":"贝斯"}},

"古筝":{"match":{"desc":"古筝"}},

"电子琴":{"match":{"desc":"电子琴"}}

}}

}

}

}

2.6 全局聚合(global aggregation)

如果我执行一个查询后,然后做一个聚合,那么聚合结果是针对查询 的,但是此时如果我想做一个全局的数据的聚合,该怎么办呢?

Global聚合可以解决这个问题,我们既可以针对搜索结果进行聚合,还可以针对全局数据聚合,所以聚合出来的结果有2个:

POST /ecommerce/music/_search

{

"size":0,

"query":{

"match":{"desc":"吉他"}

},

"aggs":{

"origin_aggs":{

"terms":{"field":"origin.keyword"},

"aggs":{

"avg_price":{

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

}

}

},

"all":{

"global":{},

"aggs":{

"origin_avg_price":{

"terms":{"field":"origin.keyword"},

"aggs":{

"avg_price":{

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

}

}

}

}

}

}

}

aggs.all.global: 是一个空的

aggs.all.aggs: 这个子聚合指定全局聚合,并注册给global聚合

2.7 直方图聚合(histogram aggregation)

POST /ecommerce/music/_search

{

"size":0,

"aggs":{

"prices":{

"histogram":{

"field":"price",

"interval":1000,

"order":{"_count":"asc"},

"extended_bounds":{

"min":2000,

"max":4000

}

}

}

}

}

aggs.prices: 指定直方图聚合名字

aggs.price.histogram: 指定聚合策略

aggs.price.histogram.field: 聚合字段

aggs.price.histogram.interval: 聚合间隔

aggs.price.histogram.extended_bounds: 指定上下范围

2.8 范围聚合 (rangeaggregation)

{

"aggs" : {

"price_ranges" : {

"range" : {

"field" : "price",

"ranges" : [

{ "to" : 50 },

{ "from" : 50, "to" : 100 },

{ "from" : 100 }

]

}

}

}

}

2.9 词条聚合(term aggregation)

就是根据那些不分词的字段进行聚合

POST /ecommerce/music/_search

{

"size":0,

"aggs":{

"origin_aggs":{

"terms":{"field":"origin.keyword","size":2}

}

}

}

Size在这里表示只返回几个bucket

三 度量聚合

3.1 求平均(AVG)/最小(min)/最大(max)

POST /ecommerce/music/_search

{

"size":0,

"query":{

"match_all":{}

},

"aggs":{

"prices_avg":{

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

},

"prices_sum":{

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

},

"prices_min":{

"min":{"field":"price"}

},

"prices_max":{

"max":{"field":"price"}

}

}

}

3.2 去重复统计(cartinality metric)

cartinality metric,对每个bucket中的指定的field进行去重,取去重后的count,类似于count(distcint)

按照时间分组,然后统计每一个分组下不同的颜色有多少

POST /ecommerce/music/_search

{

"aggs":{

"years":{

"date_histogram":{

"field":"c_date",

"interval":"year",

"format":"yyyy"

},

"aggs":{

"distinct_colors":{

"cardinality":{

"field" :"color.keyword"

}

}

}

}

}

}

aggs.years:指定bucket聚合名字

aggs.years.date_histogram: 指定bucket聚合策略

aggs.years.date_histogram.fields: 聚合字段名字

aggs.years.date_histogram.intevral: 时间间隔

aggs.years.date_histogram.format: 时间格式化

aggs.years.aggs.distinct_colors: 指定每一个分组下metric聚合的名字

aggs.years.aggs.distinct_colors.cardinality:metric聚合策略

aggs.years.aggs.distinct_colors.cardinality:metric去重字段

3.3 百分比统计(percentilesmetric)

在百分比达到多少的时候,数据情况,比如如下,在百分比50的时候,80和90的时候的销售数据情况

POST /ecommerce/music/_search

{

"size":0,

"aggs":{

"brands":{

"terms":{"field":"brand.keyword"},

"aggs":{

"sales_percentiles":{

"percentiles":{

"field":"sales",

"percents":[50,80,95]

}

},

"sales_avg":{

"avg":{

"field":"sales"

}

}

}

}

}

}

3.4 Percentile Ranks Aggregation

表示在某个范围内,大概有多少百分比,比如在100-300范围内,各个品牌下的比例

POST /ecommerce/music/_search

{

"size":0,

"aggs":{

"brands":{

"terms":{"field":"brand.keyword"},

"aggs":{

"sales_percentiles":{

"percentile_ranks":{

"field":"sales",

"values":[1500,2500]

}

}

}

}

}

}

POST /ecommerce/music/_search

{

"size":0,

"aggs":{

"sales_percentiles":{

"percentile_ranks":{

"field":"sales",

"values":[100,300]

}

}

}

}

3.5最大、最小、和、平均值。一起求出来(StatsAggregation)

POST /ecommerce/music/_search

{

"size":0,

"aggs":{

"stats_aggs":{

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

}

}

}

3.6 最大值、最小值、和、平均值、标准差、方差等

POST /ecommerce/music/_search

{

"size":0,

"aggs":{

"stats_aggs":{

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

}

}

}

3.7获取到每组前N条数据(Top Hits Aggregation)

获取前N条数据,通过term分组聚合,我们也可以做到,但是不能排序或者限制返回哪些字段

POST /ecommerce/music/_search

{

"size":0,

"aggs":{

"date_aggs":{

"date_histogram":{

"field":"c_date",

"interval":"year",

"format":"yyyy"

},

"aggs":{

"top_tag_hits":{

"top_hits":{

"sort":[

{"review":"desc"}

],

"_source": {

"includes": [

"brand","color","review"

]

},

"size" : 2

}

}

}

}

}

}

3.8 统计字段有多少不一样的值(value_count)

比如统计每一年下有多少不同的颜色

POST /ecommerce/music/_search

{

"size":0,

"aggs":{

"date_aggs":{

"date_histogram":{

"field":"c_date",

"interval":"year",

"format":"yyyy"

},

"aggs" : {

"colors_count" : { "value_count" : {"field" : "color.keyword" } }

}

}

}

}

四 了解聚合返回结果的元数据

我们看一下聚合返回了些什么东西?

"hits": {

"total": 11,

"max_score": 0,

"hits": []

}

hits:表示命中信息

hits.total: 有多少条记录命中

hits.hits: 哪些数据命中了,但是如果在聚合的时候,我们加上了size=0的参数,那么就不会显示这些数据

"aggregations": {

"group_colors": {

"doc_count_error_upper_bound": 0,

"sum_other_doc_count": 0,

"buckets": [

{

"key": "黑",

"doc_count": 5,

"avg_metric": {

"value": 1379.6

}

}

]

}

}

aggregations:表示聚合信息

aggregations.group_colors:是针对当前聚合的名字

aggregations.buckets:表示分组聚合信息

aggregations.buckets.key: 表示分组的名字

aggregations.buckets.doc_count: 表示该分组下有几个文档

aggregations.buckets. avg_metric: 针对该bucket分组聚合下的metric度量聚合名字

aggregations .buckets. avg_metric.value: 度量聚合的结果值

另外如果我们只想返回聚合结果,可以设置size=0

五 多层下钻聚合

比如我先按照品牌时间聚合,然后每一年再按照品牌聚合,然后每一个品牌再按照价格聚合

POST/ecommerce/music/_search

{

"size":0,

"aggs":{

"date_aggs":{

"date_histogram":{

"field":"c_date",

"interval":"year",

"format":"yyyy"

},

"aggs":{

"brands":{

"terms":{"field":"color.keyword"},

"aggs":{

"prices":{

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

}

}

}

}

}

}

}

ElasticSearch核心基础之聚合相关推荐

  1. ElasticSearch核心基础之映射

    一  mapping相关的概念 1.1 映射类型 映射类型也就是我们所谓的type,一个索引可以一个或者多个类型.每一个映射类型包括: # 元数据字段:用来定义如何处理文档的元数据.元数据字段包括文档 ...

  2. ElasticSearch核心基础之索引管理

    一 索引管理 1.1 创建索引 # 建立索引的时候,我们可以设置主分片和备份分片的数量通过setting字段number_of_shards和number_of_replicas字段设置 # 对于ES ...

  3. ElasticSearch核心基础之入门篇

    一 什么是全文检索 指的是计算机搜索程序扫面整篇文档,对每一个单词建立索引,并记录该词出现的位置次数.这样当用户查询的时候,搜索程序就根据事先监理的索引进行查找,并将查找结果返回用户. 正排索引和倒排 ...

  4. python大数据课程_Python课程(大数据系列)ElasticSearch从基础与实战视频课程

    lasticsearch,是目前行业中非常热门的一个技术,除了提供准时时的布式式海量数据搜索之外,还可以用于对海量的数据进行近实时的数据分析.它的海量数据量级下的近实时(秒级)性能支持,以及无比强大的 ...

  5. ELK系列(十五)、Elasticsearch核心原理一篇全搞定

    目录 Lucene 介绍 核心术语 如何理解倒排索引? 检索方式 分段存储 段合并策略 Elasticsearch 核心概念 节点类型 集群状态 3C和脑裂 1.共识性(Consensus) 2.并发 ...

  6. 深入浅出Yolo系列之Yolov3amp;Yolov4核心基础知识完整讲解

    Datawhale干货 作者:知乎-江大白  编辑:AI算法与图像处理 本文来源:https://zhuanlan.zhihu.com/p/143747206 已授权转载,如需转载请联系原作者,禁止二 ...

  7. Yolov3Yolov4核心基础知识完整讲解

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者:江大白 知乎链接:https://zhuanlan.zhih ...

  8. ElasticSearch 2 (38) - 信息聚合系列之结束与思考

    ElasticSearch 2 (38) - 信息聚合系列之结束与思考 摘要 版本 elasticsearch版本: elasticsearch-2.x 内容 本小节涵盖了许多基本理论以及很多深入的技 ...

  9. Elasticsearch核心知识图谱

    本文记录下Elasticsearch核心知识图谱. 文章目录 Elasticsearch核心知识图谱 Elasticsearch核心知识图谱 总图 原理 索引 搜索 聚合 运维 扩展

最新文章

  1. 代码改变世界_改变世界,一次只写一行代码
  2. VC++ 查看C++代码的汇编代码列表
  3. 「MySQL」 - SQL设计规范
  4. orcle10忘记密码
  5. mysql 常用命令与备份恢复 整理
  6. 如何在graphpad表示出正负误差_Graphpad Prism:SCI科研论文中误差连线图怎么做
  7. android 保存图片出现2张_OriCell第三届细胞培养图片大赛来啦~ - 实验动物
  8. HDU 5351 MZL's Border (规律,大数)
  9. 游戏开发流程-微信小游戏(含源码)
  10. 简图记录-番茄时间管理
  11. IT管理员喜欢OpManager的十大原因
  12. Linux下安装支持h264的opencv
  13. 车载中控桌面布局android,安卓车载导航桌面主题
  14. 一场来自腾讯的自我革命,已然来临!
  15. CSS布局的三种方式
  16. [Oracle] 几本重要的电子图书下载
  17. c语言标准字库,用C语言自造1602中文字库
  18. 《笨办法学》 学习笔记一
  19. 程序员必备的云服务器,你知道它的用途有哪些吗?
  20. linux下VMware安装出现的问题解决

热门文章

  1. python描述符详解_Python描述符 (descriptor) 详解
  2. kali ip查询_UDP/IP硬件协议栈设计(一):缘起
  3. css3切角文本框_CSS3:linear-gradient切角画册
  4. 无迹卡尔曼滤波(UKF)详解
  5. php7 configure 参数,PHP编译参数configure配置详解
  6. 计算机需要会那些英语翻译,计算机专业英语翻译
  7. 百度关键词点击ios_百度推广关键词点击价格高,如何处理?
  8. linux鼠标回到桌面图标,Ubuntu16_18建立返回桌面、显示桌面的快捷图标的特殊方法...
  9. 怎么在地图上画圆 php,SOSO地图API使用(一)在地图上画圆实现思路与代码
  10. Linux终端嵌套桌面里,linux下终端分屏使用的两种方法(screen和tmux)