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

1.1 bucket

有如下数据

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

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

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

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

1.2 metric

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

比如下面的一个sql语句

  1. select count(*) from book group studymodel

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

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

二、聚合示例

2.1 数据准备

首先创建book索引

  1. PUT /book/
  2. {
  3. "settings": {
  4. "number_of_shards": 1,
  5. "number_of_replicas": 0
  6. },
  7. "mappings": {
  8. "properties": {
  9. "name": {
  10. "type": "text",
  11. "analyzer": "ik_max_word",
  12. "search_analyzer": "ik_smart"
  13. },
  14. "description": {
  15. "type": "text",
  16. "analyzer": "ik_max_word",
  17. "search_analyzer": "ik_smart"
  18. },
  19. "studymodel": {
  20. "type": "keyword"
  21. },
  22. "price": {
  23. "type": "double"
  24. },
  25. "timestamp": {
  26. "type": "date",
  27. "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
  28. },
  29. "pic": {
  30. "type": "text",
  31. "index": false
  32. }
  33. }
  34. }
  35. }

添加测试数据

  1. PUT /book/_doc/1
  2. {
  3. "name": "Bootstrap开发",
  4. "description": "Bootstrap是一个非常流行的开发框架。此开发框架可以帮助不擅长css页面开发的程序人员轻松的实现一个css,不受浏览器限制的精美界面css效果。",
  5. "studymodel": "201002",
  6. "price": 38.6,
  7. "timestamp": "2019-08-25 19:11:35",
  8. "pic": "group1/M00/00/00/wKhlQFs6RCeAY0pHAAJx5ZjNDEM428.jpg",
  9. "tags": [
  10. "bootstrap",
  11. "dev"
  12. ]
  13. }
  14. PUT /book/_doc/2
  15. {
  16. "name": "java编程思想",
  17. "description": "java语言是世界第一编程语言,在软件开发领域使用人数最多。",
  18. "studymodel": "201001",
  19. "price": 68.6,
  20. "timestamp": "2019-08-25 19:11:35",
  21. "pic": "group1/M00/00/00/wKhlQFs6RCeAY0pHAAJx5ZjNDEM428.jpg",
  22. "tags": [
  23. "java",
  24. "dev"
  25. ]
  26. }
  27. PUT /book/_doc/3
  28. {
  29. "name": "spring开发基础",
  30. "description": "spring 在java领域非常流行,java程序员都在用。",
  31. "studymodel": "201001",
  32. "price": 88.6,
  33. "timestamp": "2019-08-24 19:11:35",
  34. "pic": "group1/M00/00/00/wKhlQFs6RCeAY0pHAAJx5ZjNDEM428.jpg",
  35. "tags": [
  36. "spring",
  37. "java"
  38. ]
  39. }

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

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

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

  1. GET /book/_search
  2. {
  3. "size": 0,
  4. "query": {
  5. "match_all": {}
  6. },
  7. "aggs": {
  8. "group_by_model": {
  9. "terms": {
  10. "field": "studymodel"
  11. }
  12. }
  13. }
  14. }

结果:

  1. {
  2. "took" : 2,
  3. "timed_out" : false,
  4. "_shards" : {
  5. "total" : 1,
  6. "successful" : 1,
  7. "skipped" : 0,
  8. "failed" : 0
  9. },
  10. "hits" : {
  11. "total" : {
  12. "value" : 3,
  13. "relation" : "eq"
  14. },
  15. "max_score" : null,
  16. "hits" : [ ]
  17. },
  18. "aggregations" : {
  19. "group_by_model" : {
  20. "doc_count_error_upper_bound" : 0,
  21. "sum_other_doc_count" : 0,
  22. "buckets" : [
  23. {
  24. "key" : "201001",
  25. "doc_count" : 2
  26. },
  27. {
  28. "key" : "201002",
  29. "doc_count" : 1
  30. }
  31. ]
  32. }
  33. }
  34. }

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

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

  1. PUT /book/_mapping/
  2. {
  3. "properties": {
  4. "tags": {
  5. "type": "text",
  6. "fielddata": true
  7. }
  8. }
  9. }

查询

  1. GET /book/_search
  2. {
  3. "size": 0,
  4. "query": {
  5. "match_all": {}
  6. },
  7. "aggs": {
  8. "group_by_tags": {
  9. "terms": { "field": "tags" }
  10. }
  11. }
  12. }

结果:

  1. {
  2. "took" : 2,
  3. "timed_out" : false,
  4. "_shards" : {
  5. "total" : 1,
  6. "successful" : 1,
  7. "skipped" : 0,
  8. "failed" : 0
  9. },
  10. "hits" : {
  11. "total" : {
  12. "value" : 3,
  13. "relation" : "eq"
  14. },
  15. "max_score" : null,
  16. "hits" : [ ]
  17. },
  18. "aggregations" : {
  19. "group_by_tags" : {
  20. "doc_count_error_upper_bound" : 0,
  21. "sum_other_doc_count" : 0,
  22. "buckets" : [
  23. {
  24. "key" : "dev",
  25. "doc_count" : 2
  26. },
  27. {
  28. "key" : "java",
  29. "doc_count" : 2
  30. },
  31. {
  32. "key" : "bootstrap",
  33. "doc_count" : 1
  34. },
  35. {
  36. "key" : "spring",
  37. "doc_count" : 1
  38. }
  39. ]
  40. }
  41. }
  42. }

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

  1. GET /book/_search
  2. {
  3. "size": 0,
  4. "query": {
  5. "match": {
  6. "description": "java程序员"
  7. }
  8. },
  9. "aggs": {
  10. "group_by_tags": {
  11. "terms": { "field": "tags" }
  12. }
  13. }
  14. }

结果:

  1. {
  2. "took" : 70,
  3. "timed_out" : false,
  4. "_shards" : {
  5. "total" : 1,
  6. "successful" : 1,
  7. "skipped" : 0,
  8. "failed" : 0
  9. },
  10. "hits" : {
  11. "total" : {
  12. "value" : 2,
  13. "relation" : "eq"
  14. },
  15. "max_score" : null,
  16. "hits" : [ ]
  17. },
  18. "aggregations" : {
  19. "group_by_tags" : {
  20. "doc_count_error_upper_bound" : 0,
  21. "sum_other_doc_count" : 0,
  22. "buckets" : [
  23. {
  24. "key" : "java",
  25. "doc_count" : 2
  26. },
  27. {
  28. "key" : "dev",
  29. "doc_count" : 1
  30. },
  31. {
  32. "key" : "spring",
  33. "doc_count" : 1
  34. }
  35. ]
  36. }
  37. }
  38. }

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

子聚合

  1. GET /book/_search
  2. {
  3. "size": 0,
  4. "aggs": {
  5. "group_by_tags": {
  6. "terms": {
  7. "field": "tags"
  8. },
  9. "aggs": {
  10. "avg_price": {
  11. "avg": {
  12. "field": "price"
  13. }
  14. }
  15. }
  16. }
  17. }
  18. }

结果:

  1. {
  2. "took" : 0,
  3. "timed_out" : false,
  4. "_shards" : {
  5. "total" : 1,
  6. "successful" : 1,
  7. "skipped" : 0,
  8. "failed" : 0
  9. },
  10. "hits" : {
  11. "total" : {
  12. "value" : 3,
  13. "relation" : "eq"
  14. },
  15. "max_score" : null,
  16. "hits" : [ ]
  17. },
  18. "aggregations" : {
  19. "group_by_tags" : {
  20. "doc_count_error_upper_bound" : 0,
  21. "sum_other_doc_count" : 0,
  22. "buckets" : [
  23. {
  24. "key" : "dev",
  25. "doc_count" : 2,
  26. "avg_price" : {
  27. "value" : 53.599999999999994
  28. }
  29. },
  30. {
  31. "key" : "java",
  32. "doc_count" : 2,
  33. "avg_price" : {
  34. "value" : 78.6
  35. }
  36. },
  37. {
  38. "key" : "bootstrap",
  39. "doc_count" : 1,
  40. "avg_price" : {
  41. "value" : 38.6
  42. }
  43. },
  44. {
  45. "key" : "spring",
  46. "doc_count" : 1,
  47. "avg_price" : {
  48. "value" : 88.6
  49. }
  50. }
  51. ]
  52. }
  53. }
  54. }

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

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

  1. GET /book/_search
  2. {
  3. "size": 0,
  4. "aggs": {
  5. "group_by_tags": {
  6. "terms": {
  7. "field": "tags",
  8. "order": {
  9. "avg_price": "desc"
  10. }
  11. },
  12. "aggs": {
  13. "avg_price": {
  14. "avg": {
  15. "field": "price"
  16. }
  17. }
  18. }
  19. }
  20. }
  21. }

结果:

  1. {
  2. "took" : 4,
  3. "timed_out" : false,
  4. "_shards" : {
  5. "total" : 1,
  6. "successful" : 1,
  7. "skipped" : 0,
  8. "failed" : 0
  9. },
  10. "hits" : {
  11. "total" : {
  12. "value" : 3,
  13. "relation" : "eq"
  14. },
  15. "max_score" : null,
  16. "hits" : [ ]
  17. },
  18. "aggregations" : {
  19. "group_by_tags" : {
  20. "doc_count_error_upper_bound" : 0,
  21. "sum_other_doc_count" : 0,
  22. "buckets" : [
  23. {
  24. "key" : "spring",
  25. "doc_count" : 1,
  26. "avg_price" : {
  27. "value" : 88.6
  28. }
  29. },
  30. {
  31. "key" : "java",
  32. "doc_count" : 2,
  33. "avg_price" : {
  34. "value" : 78.6
  35. }
  36. },
  37. {
  38. "key" : "dev",
  39. "doc_count" : 2,
  40. "avg_price" : {
  41. "value" : 53.599999999999994
  42. }
  43. },
  44. {
  45. "key" : "bootstrap",
  46. "doc_count" : 1,
  47. "avg_price" : {
  48. "value" : 38.6
  49. }
  50. }
  51. ]
  52. }
  53. }
  54. }

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

  1. GET /book/_search
  2. {
  3. "size": 0,
  4. "aggs": {
  5. "group_by_price": {
  6. "range": {
  7. "field": "price",
  8. "ranges": [
  9. {
  10. "from": 0,
  11. "to": 40
  12. },
  13. {
  14. "from": 40,
  15. "to": 60
  16. },
  17. {
  18. "from": 60,
  19. "to": 80
  20. }
  21. ]
  22. },
  23. "aggs": {
  24. "group_by_tags": {
  25. "terms": {
  26. "field": "tags"
  27. },
  28. "aggs": {
  29. "average_price": {
  30. "avg": {
  31. "field": "price"
  32. }
  33. }
  34. }
  35. }
  36. }
  37. }
  38. }
  39. }

结果:

  1. {
  2. "took" : 5,
  3. "timed_out" : false,
  4. "_shards" : {
  5. "total" : 1,
  6. "successful" : 1,
  7. "skipped" : 0,
  8. "failed" : 0
  9. },
  10. "hits" : {
  11. "total" : {
  12. "value" : 3,
  13. "relation" : "eq"
  14. },
  15. "max_score" : null,
  16. "hits" : [ ]
  17. },
  18. "aggregations" : {
  19. "group_by_price" : {
  20. "buckets" : [
  21. {
  22. "key" : "0.0-40.0",
  23. "from" : 0.0,
  24. "to" : 40.0,
  25. "doc_count" : 1,
  26. "group_by_tags" : {
  27. "doc_count_error_upper_bound" : 0,
  28. "sum_other_doc_count" : 0,
  29. "buckets" : [
  30. {
  31. "key" : "bootstrap",
  32. "doc_count" : 1,
  33. "average_price" : {
  34. "value" : 38.6
  35. }
  36. },
  37. {
  38. "key" : "dev",
  39. "doc_count" : 1,
  40. "average_price" : {
  41. "value" : 38.6
  42. }
  43. }
  44. ]
  45. }
  46. },
  47. {
  48. "key" : "40.0-60.0",
  49. "from" : 40.0,
  50. "to" : 60.0,
  51. "doc_count" : 0,
  52. "group_by_tags" : {
  53. "doc_count_error_upper_bound" : 0,
  54. "sum_other_doc_count" : 0,
  55. "buckets" : [ ]
  56. }
  57. },
  58. {
  59. "key" : "60.0-80.0",
  60. "from" : 60.0,
  61. "to" : 80.0,
  62. "doc_count" : 1,
  63. "group_by_tags" : {
  64. "doc_count_error_upper_bound" : 0,
  65. "sum_other_doc_count" : 0,
  66. "buckets" : [
  67. {
  68. "key" : "dev",
  69. "doc_count" : 1,
  70. "average_price" : {
  71. "value" : 68.6
  72. }
  73. },
  74. {
  75. "key" : "java",
  76. "doc_count" : 1,
  77. "average_price" : {
  78. "value" : 68.6
  79. }
  80. }
  81. ]
  82. }
  83. }
  84. ]
  85. }
  86. }
  87. }

ElasticSearch7.3学习(二十七)----聚合概念(bucket和metric)及其示例的更多相关文章

  1. ElasticSearch7.3学习(二十五)----Doc value、query phase、fetch phase解析

    1.Doc value 搜索的时候,要依靠倒排索引: 排序的时候,需要依靠正排索引,看到每个document的每个field,然后进行排序. 所谓的正排索引,其实就是doc values. 在建立索引 ...

  2. ElasticSearch7.3学习(二十六)----搜索(Search)参数总结、结果跳跃(bouncing results)问题解析

    1.preference 首先引入一个bouncing results问题,两个document排序,field值相同:不同的shard上,可能排序不同:每次请求轮询打到不同的replica shar ...

  3. Java开发学习(二十七)----SpringMVC之Rest风格解析及快速开发

    一.REST简介 REST(Representational State Transfer),表现形式状态转换,它是一种软件架构风格 当我们想表示一个网络资源的时候,可以使用两种方式: 传统风格资源描 ...

  4. ElasticSearch7.3学习(二十九)----聚合实战之使用Java api实现电视案例

    一.数据准备 创建索引及映射 建立价格.颜色.品牌.售卖日期字段 PUT /tvs PUT /tvs/_mapping { "properties": { "price& ...

  5. ElasticSearch7.3学习(二十八)----聚合实战之电视案例

    一.电视案例 1.1 数据准备 创建索引及映射 建立价格.颜色.品牌.售卖日期 字段 PUT /tvs PUT /tvs/_mapping { "properties": { &q ...

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

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

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

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

  8. JavaWeb学习 (二十七)————监听器(Listener)在开发中的应用

    监听器在JavaWeb开发中用得比较多,下面说一下监听器(Listener)在开发中的常见应用 一.统计当前在线人数 在JavaWeb应用开发中,有时候我们需要统计当前在线的用户数,此时就可以使用监听 ...

  9. telegraf 学习二 几个概念

    telegraf 自身包好了自己处理metrics 的数据模型,以及出炉方法 metrics Telegraf指标是用于在处理期间对数据建模的内部表示.这些指标完全基于InfluxDB的数据模型,包含 ...

随机推荐

  1. 手把手教你撸个vue2.0弹窗组件

    手把手教你撸个vue2.0弹窗组件 在开始之前需要了解一下开发vue插件的前置知识,推荐先看一下vue官网的插件介绍 预览地址 http://haogewudi.me/kiko/inde... 源码地 ...

  2. java中异常(Exception)的定义,意义和用法。举例

    1.异常(Exception)的定义,意义和用法 我们先给出一个例子,看看异常有什么用? 例:1.1- public class Test {    public static void main(S ...

  3. 'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte

    问题描述:在使用python爬取斗鱼直播的数据时,使用str(读取到的字节,编码格式)进行解码时报错:'utf-8' codec can't decode byte 0x8b in position ...

  4. 静态变量和成员变量的区别、final修饰特点、创建对象的内存图、静态内存图

    静态变量和成员变量的区别* 静态变量也叫类变量  成员变量也叫对象变量* A:所属不同 * 静态变量属于类,所以也称为为类变量 * 成员变量属于对象,所以也称为实例变量(对象变量)* B:内存中位置不 ...

  5. ABP源码分析 - 约定注册(3)

    入口 //ConfigureServices foreach (var module in Modules) { if (module.Instance is AbpModule abpModule) ...

  6. C++---初识C++

    C和C++的关系 C语言是结构化和模块化的语言, 面向过程. C++是在C语言的基础上, 增加了面向对象的机制, 并对C语言的功能进行了扩充. 变量的定义可以出现在程序中的任何行 提供了标准输入输出流 ...

  7. ubuntu连接不到WiFi

    ubuntu连接不到WiFi 在软件与更新中,进入附加驱动. 搜到对应的无线网卡驱动,安装后在重启电脑.

  8. 服务器的cpu 核心、线程

    此版本有大范围改动,因为cpu作为一个大脑,所以更细致的进行了,相关的分析和阐述. 1.版本1. 2022.1.242.版本2: 2022.3.2 采集数据: ht2机器为物理机,cpu是4颗cpu, ...

  9. 学习HTML第二天

    今日内容: HTML标签:表单标签 CSS HTML标签:表单标签 表单项标签: input:可以通过type属性值,改变元素展示的样式 type属性: text:文本输入框,默认值 placehol ...

  10. Vue使用PostCSS 插件和如何使用sass及常用语法

    为什么要使用PostCss 转换 px 单位的插件有很多,知名的有 postcss-px-to-viewport 和 postcss-pxtorem,前者是将 px 转成 vw,后者是将 px 转成 ...