ElasticSearch核心基础之聚合
一 聚合的分类
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核心基础之聚合相关推荐
- ElasticSearch核心基础之映射
一 mapping相关的概念 1.1 映射类型 映射类型也就是我们所谓的type,一个索引可以一个或者多个类型.每一个映射类型包括: # 元数据字段:用来定义如何处理文档的元数据.元数据字段包括文档 ...
- ElasticSearch核心基础之索引管理
一 索引管理 1.1 创建索引 # 建立索引的时候,我们可以设置主分片和备份分片的数量通过setting字段number_of_shards和number_of_replicas字段设置 # 对于ES ...
- ElasticSearch核心基础之入门篇
一 什么是全文检索 指的是计算机搜索程序扫面整篇文档,对每一个单词建立索引,并记录该词出现的位置次数.这样当用户查询的时候,搜索程序就根据事先监理的索引进行查找,并将查找结果返回用户. 正排索引和倒排 ...
- python大数据课程_Python课程(大数据系列)ElasticSearch从基础与实战视频课程
lasticsearch,是目前行业中非常热门的一个技术,除了提供准时时的布式式海量数据搜索之外,还可以用于对海量的数据进行近实时的数据分析.它的海量数据量级下的近实时(秒级)性能支持,以及无比强大的 ...
- ELK系列(十五)、Elasticsearch核心原理一篇全搞定
目录 Lucene 介绍 核心术语 如何理解倒排索引? 检索方式 分段存储 段合并策略 Elasticsearch 核心概念 节点类型 集群状态 3C和脑裂 1.共识性(Consensus) 2.并发 ...
- 深入浅出Yolo系列之Yolov3amp;Yolov4核心基础知识完整讲解
Datawhale干货 作者:知乎-江大白 编辑:AI算法与图像处理 本文来源:https://zhuanlan.zhihu.com/p/143747206 已授权转载,如需转载请联系原作者,禁止二 ...
- Yolov3Yolov4核心基础知识完整讲解
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者:江大白 知乎链接:https://zhuanlan.zhih ...
- ElasticSearch 2 (38) - 信息聚合系列之结束与思考
ElasticSearch 2 (38) - 信息聚合系列之结束与思考 摘要 版本 elasticsearch版本: elasticsearch-2.x 内容 本小节涵盖了许多基本理论以及很多深入的技 ...
- Elasticsearch核心知识图谱
本文记录下Elasticsearch核心知识图谱. 文章目录 Elasticsearch核心知识图谱 Elasticsearch核心知识图谱 总图 原理 索引 搜索 聚合 运维 扩展
最新文章
- 代码改变世界_改变世界,一次只写一行代码
- VC++ 查看C++代码的汇编代码列表
- 「MySQL」 - SQL设计规范
- orcle10忘记密码
- mysql 常用命令与备份恢复 整理
- 如何在graphpad表示出正负误差_Graphpad Prism:SCI科研论文中误差连线图怎么做
- android 保存图片出现2张_OriCell第三届细胞培养图片大赛来啦~ - 实验动物
- HDU 5351 MZL's Border (规律,大数)
- 游戏开发流程-微信小游戏(含源码)
- 简图记录-番茄时间管理
- IT管理员喜欢OpManager的十大原因
- Linux下安装支持h264的opencv
- 车载中控桌面布局android,安卓车载导航桌面主题
- 一场来自腾讯的自我革命,已然来临!
- CSS布局的三种方式
- [Oracle] 几本重要的电子图书下载
- c语言标准字库,用C语言自造1602中文字库
- 《笨办法学》 学习笔记一
- 程序员必备的云服务器,你知道它的用途有哪些吗?
- linux下VMware安装出现的问题解决
热门文章
- python描述符详解_Python描述符 (descriptor) 详解
- kali ip查询_UDP/IP硬件协议栈设计(一):缘起
- css3切角文本框_CSS3:linear-gradient切角画册
- 无迹卡尔曼滤波(UKF)详解
- php7 configure 参数,PHP编译参数configure配置详解
- 计算机需要会那些英语翻译,计算机专业英语翻译
- 百度关键词点击ios_百度推广关键词点击价格高,如何处理?
- linux鼠标回到桌面图标,Ubuntu16_18建立返回桌面、显示桌面的快捷图标的特殊方法...
- 怎么在地图上画圆 php,SOSO地图API使用(一)在地图上画圆实现思路与代码
- Linux终端嵌套桌面里,linux下终端分屏使用的两种方法(screen和tmux)