一、两个核心概念:bucket和metric

1.1 bucket

有如下数据

city name 
北京 张三 
北京 李四
天津 王五
天津 赵六
天津 王麻子

划分出来两个bucket,一个是北京bucket,一个是天津bucket

北京bucket:包含了2个人,张三,李四

上海bucket:包含了3个人,王五,赵六,王麻子

1.2 metric

metric,就是对一个bucket执行的某种聚合分析的操作,比如说求平均值,求最大值,求最小值

比如下面的一个sql语句

select count(*) from book group studymodel

bucket:group by studymodel --> 那些studymodel相同的数据,就会被划分到一个bucket中

metric:count(*),对每个bucket中所有的数据,计算一个数量。例如avg(),sum(),max(),min()

二、聚合示例

2.1 数据准备

首先创建book索引

PUT /book/
{"settings": {"number_of_shards": 1,"number_of_replicas": 0},"mappings": {"properties": {"name": {"type": "text","analyzer": "ik_max_word","search_analyzer": "ik_smart"},"description": {"type": "text","analyzer": "ik_max_word","search_analyzer": "ik_smart"},"studymodel": {"type": "keyword"},"price": {"type": "double"},"timestamp": {"type": "date","format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"},"pic": {"type": "text","index": false}}}
}

添加测试数据

PUT /book/_doc/1
{"name": "Bootstrap开发","description": "Bootstrap是一个非常流行的开发框架。此开发框架可以帮助不擅长css页面开发的程序人员轻松的实现一个css,不受浏览器限制的精美界面css效果。","studymodel": "201002","price": 38.6,"timestamp": "2019-08-25 19:11:35","pic": "group1/M00/00/00/wKhlQFs6RCeAY0pHAAJx5ZjNDEM428.jpg","tags": ["bootstrap","dev"]
}PUT /book/_doc/2
{"name": "java编程思想","description": "java语言是世界第一编程语言,在软件开发领域使用人数最多。","studymodel": "201001","price": 68.6,"timestamp": "2019-08-25 19:11:35","pic": "group1/M00/00/00/wKhlQFs6RCeAY0pHAAJx5ZjNDEM428.jpg","tags": ["java","dev"]
}PUT /book/_doc/3
{"name": "spring开发基础","description": "spring 在java领域非常流行,java程序员都在用。","studymodel": "201001","price": 88.6,"timestamp": "2019-08-24 19:11:35","pic": "group1/M00/00/00/wKhlQFs6RCeAY0pHAAJx5ZjNDEM428.jpg","tags": ["spring","java"]
}

2.2 计算每个studymodel下的商品数量

sql语句: select studymodel,count(*) from book group by studymodel

"size": 0,   ==>  作用 :只需要聚合的数据,不需要查询的数据

GET /book/_search
{"size": 0,"query": {"match_all": {}},"aggs": {"group_by_model": {"terms": {"field": "studymodel"}}}
}

结果:

{"took" : 2,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 3,"relation" : "eq"},"max_score" : null,"hits" : [ ]},"aggregations" : {"group_by_model" : {"doc_count_error_upper_bound" : 0,"sum_other_doc_count" : 0,"buckets" : [{"key" : "201001","doc_count" : 2},{"key" : "201002","doc_count" : 1}]}}
}

2.3 计算每个tags下的商品数量

设置字段"fielddata": true,不设置会报错

PUT /book/_mapping/
{"properties": {"tags": {"type": "text","fielddata": true}}
}

查询

GET /book/_search
{"size": 0, "query": {"match_all": {}}, "aggs": {"group_by_tags": {"terms": { "field": "tags" }}}
}

结果:

{"took" : 2,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 3,"relation" : "eq"},"max_score" : null,"hits" : [ ]},"aggregations" : {"group_by_tags" : {"doc_count_error_upper_bound" : 0,"sum_other_doc_count" : 0,"buckets" : [{"key" : "dev","doc_count" : 2},{"key" : "java","doc_count" : 2},{"key" : "bootstrap","doc_count" : 1},{"key" : "spring","doc_count" : 1}]}}
}

2.4 加上搜索条件,计算每个tags下的商品数量

GET /book/_search
{"size": 0, "query": {"match": {"description": "java程序员"}}, "aggs": {"group_by_tags": {"terms": { "field": "tags" }}}
}

结果:

{"took" : 70,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 2,"relation" : "eq"},"max_score" : null,"hits" : [ ]},"aggregations" : {"group_by_tags" : {"doc_count_error_upper_bound" : 0,"sum_other_doc_count" : 0,"buckets" : [{"key" : "java","doc_count" : 2},{"key" : "dev","doc_count" : 1},{"key" : "spring","doc_count" : 1}]}}
}

2.5 计算每个tag下的商品的平均价格

子聚合

GET /book/_search
{"size": 0,"aggs": {"group_by_tags": {"terms": {"field": "tags"},"aggs": {"avg_price": {"avg": {"field": "price"}}}}}
}

结果:

{"took" : 0,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 3,"relation" : "eq"},"max_score" : null,"hits" : [ ]},"aggregations" : {"group_by_tags" : {"doc_count_error_upper_bound" : 0,"sum_other_doc_count" : 0,"buckets" : [{"key" : "dev","doc_count" : 2,"avg_price" : {"value" : 53.599999999999994}},{"key" : "java","doc_count" : 2,"avg_price" : {"value" : 78.6}},{"key" : "bootstrap","doc_count" : 1,"avg_price" : {"value" : 38.6}},{"key" : "spring","doc_count" : 1,"avg_price" : {"value" : 88.6}}]}}
}

2.6 计算每个tag下的商品的平均价格,按照平均价格降序排序

小技巧,如果是查询全部,match_all可省略

GET /book/_search
{"size": 0,"aggs": {"group_by_tags": {"terms": {"field": "tags","order": {"avg_price": "desc"}},"aggs": {"avg_price": {"avg": {"field": "price"}}}}}
}

结果:

{"took" : 4,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 3,"relation" : "eq"},"max_score" : null,"hits" : [ ]},"aggregations" : {"group_by_tags" : {"doc_count_error_upper_bound" : 0,"sum_other_doc_count" : 0,"buckets" : [{"key" : "spring","doc_count" : 1,"avg_price" : {"value" : 88.6}},{"key" : "java","doc_count" : 2,"avg_price" : {"value" : 78.6}},{"key" : "dev","doc_count" : 2,"avg_price" : {"value" : 53.599999999999994}},{"key" : "bootstrap","doc_count" : 1,"avg_price" : {"value" : 38.6}}]}}
}

2.7 按照指定的价格范围区间进行分组,然后在每组内再按照tag进行分组,最后再计算每组的平均价格

GET /book/_search
{"size": 0,"aggs": {"group_by_price": {"range": {"field": "price","ranges": [{"from": 0,"to": 40},{"from": 40,"to": 60},{"from": 60,"to": 80}]},"aggs": {"group_by_tags": {"terms": {"field": "tags"},"aggs": {"average_price": {"avg": {"field": "price"}}}}}}}
}

结果:

{"took" : 5,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 3,"relation" : "eq"},"max_score" : null,"hits" : [ ]},"aggregations" : {"group_by_price" : {"buckets" : [{"key" : "0.0-40.0","from" : 0.0,"to" : 40.0,"doc_count" : 1,"group_by_tags" : {"doc_count_error_upper_bound" : 0,"sum_other_doc_count" : 0,"buckets" : [{"key" : "bootstrap","doc_count" : 1,"average_price" : {"value" : 38.6}},{"key" : "dev","doc_count" : 1,"average_price" : {"value" : 38.6}}]}},{"key" : "40.0-60.0","from" : 40.0,"to" : 60.0,"doc_count" : 0,"group_by_tags" : {"doc_count_error_upper_bound" : 0,"sum_other_doc_count" : 0,"buckets" : [ ]}},{"key" : "60.0-80.0","from" : 60.0,"to" : 80.0,"doc_count" : 1,"group_by_tags" : {"doc_count_error_upper_bound" : 0,"sum_other_doc_count" : 0,"buckets" : [{"key" : "dev","doc_count" : 1,"average_price" : {"value" : 68.6}},{"key" : "java","doc_count" : 1,"average_price" : {"value" : 68.6}}]}}]}}
}

ElasticSearch7.3学习(二十七)----聚合概念(bucket和metric)及其示例相关推荐

  1. JavaScript高级程序设计学习(二)之基本概念

    任何语言的核心都必然会描述这门语言基本的工作原理.而描述的内容通常都要涉及这门语 言的语法.操作符.数据类型.内置功能等用于构建复杂解决方案的基本概念.如前所述, ECMA-262通过叫做 ECMAS ...

  2. Java基础学习(二十七)之IO流

    1. File 1.1 File类概述和构造方法(myFile中的com.itheima_01中的FileDemo01) File:它是文件和目录路径名的抽象表示 文件和目录是可以通过File封装成对 ...

  3. JavaScript基础学习(二)—JavaScript基本概念

    一.语法 1.区分大小写 JavaScript是一种弱类型的脚本语言.它区分大小写,变量名test与Test表示两个完全不同的变量. 2.标识符 所谓标识符就是变量.函数.属性的名字,它有以下规则. ...

  4. Java多线程学习二十七:AtomicInteger 在高并发下性能不好,如何解决?为什么?

    AtomicInteger 在高并发下性能不好,如何解决?以及为什么会出现这种情况? 我们知道在 JDK1.5 中新增了并发情况下使用的 Integer/Long 所对应的原子类 AtomicInte ...

  5. CUPS学习二:CUPS概念介绍。

    距离上一篇博客已经过去差不多半年的时间,虽然这半年一直有其他各种莫名其妙的事打断,但是工作内容始终还是围绕着linux打印系统在开展.虽然进度很慢,里边到现在还是有细节没有太弄懂,但是源码和介绍已经差 ...

  6. ballerina 学习二十七 项目k8s部署 运行

    ballerina k8s 部署和docker 都是同样的简单,编写service 添加注解就可以了 参考项目 https://ballerina.io/learn/by-guide/restful- ...

  7. ElasticSearch7.3学习(二十一)----Filter与Query对比、使用explain关键字分析语法

    1.数据准备 首先创建book索引 PUT /book/ {"settings": {"number_of_shards": 1,"number_of ...

  8. 【Elasticsearch】Elasticsearch中 aggs (桶)聚合查询和进行二次聚合查询

    [Elasticsearch]Elasticsearch中 aggs (桶)聚合查询和进行二次聚合查询 Bucket aggregationsedit Bucket aggregations don' ...

  9. ElasticSearch练习二:聚合语法学习(aggs、bucket、metric、hitogram、date hitogram)

    bucket与metric两个核心概念 初始化数据 city name 北京 小李 北京 小王 上海 小张 上海 小丽 上海 小陈 按照某个字段进行bucket划分,那个字段的值相同的那些数据,就会被 ...

最新文章

  1. Android onMeasure方法介绍
  2. python(matplotlib7)——subplot 一个figure中国显示几个小图 分格显示
  3. ZOJ 3879(大模拟)
  4. dns 320 linux,linux 下 dns服务器(三 配置篇)
  5. 1.13编程基础之综合应用 45 十进制到八进制 python
  6. Node.js入门 - 永恒的Hello World!
  7. Maven - 构建与命令
  8. MTK 驱动---(8)emmc 介绍
  9. php转换excel文件怎么打开方式,用PHP将mysql数据表转换为excel文件格式_php
  10. 0423-mysql查询语句大全
  11. 贺利坚老师汇编课程54笔记:ZF零标志ZERO FLAG
  12. ftp测试工具_Linux网络配置 | FTP 实战-本地用户登录
  13. Linux常用命令汇总 - Linux Shell Cheat Sheet
  14. 计算机操作系统(第四版)课后习题答案(第一章)
  15. HTML5绘制八大行星加入字体,html5中用canvas画八大行星围绕太阳转
  16. CSP—— 登机牌条码(多项式的求解以及多项式的除法)
  17. 苦禅箜mm让我帮她做的作业
  18. 梅特勒托利多xk3124电子秤说明书_梅特勒托利多称重仪表XK3124 B520
  19. 幼儿园观察记录的目的和目标_幼儿园观察目的是什么?
  20. 张小龙的30条产品法则

热门文章

  1. springcloud 学习项目
  2. 【网络通信 -- WebRTC】项目实战记录 -- Chrome 启动参数总结
  3. CSS学习小记1(Dreamweaver CC 创建选择器)
  4. 2021高校毕业生就业薪酬分析:博士、硕士、本科、专科的月起薪算数平均值分别为14823元、10113元、5825元、3910元[图]
  5. 计算机 校级研究生学术会议,通知 | 【研究生评奖评优】关于做好浙江大学2017-2018学年计算机学院研究生学年小结及评奖评优工作的通知...
  6. 转载一篇不错的介绍ORM框架的文章
  7. 种草!.NET开发控件集ComponentOne Studio Enterprise!
  8. 2020 ESRI全球开发者大会 - 回想与总结
  9. 在cmd中输入javac不行_cmd运行java可以javac不行
  10. C#winform实现文本框只能输入数字功能