Elasticsearch 桶聚合 Terms Aggregation

  • 1 准备测试数据
    • 1.1 插入数据DSL
    • 1.2 表格展示
  • 2 Terms Aggregation(根据字段的值分组)
    • 2.1 根据dept分组,求每个部门的数量
      • 2.1.1 SQL
      • 2.1.2 DSL
    • 2.2 根据dept分组,求每个部门的数量,并排序
      • 2.2.1 SQL
      • 2.2.2 DSL
    • 2.3 对统计结果过滤,加having
      • 2.3.1 SQL
      • 2.3.2 SQL转DSL语句
    • 2.4 过滤需统计文档的范围
      • 2.4.1 SQL
      • 2.4.2 DSL

桶聚合的种类很多,一篇短文难以覆盖,这篇先介绍Terms Aggregation(按字段分组),类似MySQL中的Group By,它是最常用的聚合方式。注意用于聚合的字段不能是text类型。

1 准备测试数据

1.1 插入数据DSL

PUT /user/_doc/1
{"id":"1","name":"张一","dept":"web","path":"dept1,man1","birthday": "2008-11-16","status":"1"
}PUT /user/_doc/2
{"id":"2","name":"张二","dept":"web","path":"dept1,man2","birthday": "2008-12-17","status":"1"
}PUT /user/_doc/3
{"id":"3","name":"张三","dept":"web","path":"dept1,man3","birthday": "2009-10-10","status":"1"
}PUT /user/_doc/4
{"id":"4","name":"李四","dept":"java","path":"dept2,man4","birthday": "2012-01-01","status":"1"
}PUT /user/_doc/5
{"id":"5","name":"王五","dept":"java","path":"dept2,man5","birthday": "2012-07-01","status":"0"
}PUT /user/_doc/6
{"id":"6","name":"王六","dept":"data","status":"0","path":"dept3,man6","birthday": "2009-12-12","gender":"man"
}

1.2 表格展示

id name birthday gender dept path status
1 张一 2008-11-16 web dept1,man1 1
2 张二 2008-12-17 web dept1,man2 1
3 张三 2009-10-10 web dept1,man3 1
4 李四 2012-01-01 java dept2,man4 1
5 王五 2012-07-01 java dept2,man5 0
5 王六 2009-12-12 man data dept3,man6 0

2 Terms Aggregation(根据字段的值分组)

Terms聚合用于分组

2.1 根据dept分组,求每个部门的数量

2.1.1 SQL

#=======group by=======
POST /_xpack/sql?format=txt
{"query": "SELECT dept, COUNT(*) num FROM user GROUP BY dept"
}
    dept       |      num
---------------+---------------
data           |1
java           |2
web            |3

2.1.2 DSL

GET /user/_doc/_search
{"size":0,"aggs":{"depts":{"terms":{"field":"dept.keyword"}}}
}
  "aggregations" : {"depts" : {"doc_count_error_upper_bound" : 0,"sum_other_doc_count" : 0,"buckets" : [{"key" : "web","doc_count" : 3},{"key" : "java","doc_count" : 2},{"key" : "data","doc_count" : 1}]}}

2.2 根据dept分组,求每个部门的数量,并排序

2.2.1 SQL

POST /_xpack/sql?format=txt
{"query": "SELECT dept, COUNT(*) num FROM user GROUP BY dept ORDER BY num DESC"
}
     dept      |      num
---------------+---------------
web            |3
java           |2
data           |1

2.2.2 DSL

GET /user/_doc/_search
{"size":0,"aggs":{"depts":{"terms":{"field":"dept.keyword","order" : { "_count" : "desc" }}}}
}

上面按照数量降序,如果将"_count"改成"_key",就是按照key(这里就是指dept)降序

  "aggregations" : {"depts" : {"doc_count_error_upper_bound" : 0,"sum_other_doc_count" : 0,"buckets" : [{"key" : "web","doc_count" : 3},{"key" : "java","doc_count" : 2},{"key" : "data","doc_count" : 1}]}}

2.3 对统计结果过滤,加having

2.3.1 SQL

POST /_xpack/sql?format=txt
{"query": "SELECT dept, COUNT(*) num  FROM user GROUP BY dept HAVING num > 1 ORDER BY num DESC"
}

过滤出数量>1的部门

     dept      |      num
---------------+---------------
web            |3
java           |2              

2.3.2 SQL转DSL语句

POST /_xpack/sql/translate
{"query": "SELECT dept, COUNT(*) num  FROM user GROUP BY dept HAVING num > 1 ORDER BY num DESC"
}

2.4 过滤需统计文档的范围

2.4.1 SQL

POST /_xpack/sql?format=txt
{"query": "SELECT dept, COUNT(*) num  FROM user  WHERE status = 1 GROUP BY dept ORDER BY num DESC"
}

2.4.2 DSL

GET /user/_doc/_search
{"size":0,"query":{"term":{"status":1}},"aggs":{"dept_count":{"terms":{"field":"dept.keyword","order":{"_count":"desc"}}}}
}

Elasticsearch教程(6) ES桶聚合Query DSL-Terms Aggregation相关推荐

  1. Es Bucket聚合(桶聚合) 第二篇-Terms Aggregation与Significant Terms Aggregation

    作者介绍:<RocketMQ技术内幕>作者,中间件兴趣圈微信公众号维护者,文末有对应的二维码,关注后可以与作者更好的互动. 本章将介绍elasticsearch最重要的桶聚合terms a ...

  2. Query DSL - Terms Query

    Terms Query 词组查询 Returns documents that contain one or more exact terms in a provided field. 返回字段中包含 ...

  3. Elasticsearch教程(27) ES拼接查询条件的工具类

    一.前言 在大多数公司产线Elasticsearch还在6.X的时候,ES已经更新到8.X了,这更新速度也太快了. 目前我手上的项目也做到一套工具类兼容ES6.1到ES7.9+.我用的是原生的ES6. ...

  4. 【Elasticsearch教程3】查询文档 term terms terms_set

    版本约定 本系列博客ES版本如下: Elasticsearch 7.17.X Spring Data Elasticsearch 4.4.X Elasticsearch下载地址 Spring Data ...

  5. Query DSL - Terms set Query

    Terms set Query 词条集查询 Returns documents that contain a minimum number of exact terms in a provided f ...

  6. Elasticsearch教程(4) High Level REST Client API 查询 聚合 分组

    ES High Level REST Client API 查询 聚合 1 准备数据 1.1 插入测试数据 2 Maven引入ES 3 创建Client 4 查询API 4.1 根据id查询单条数据 ...

  7. Es Bucket聚合(桶聚合) Terms Aggregation与Significant Terms Aggregation

    本章将介绍elasticsearch最重要的桶聚合terms aggregation. Terms Aggregation 多值聚合,根据库中的文档动态构建桶.基于词根的聚合,如果聚合字段是text的 ...

  8. Es Bucket聚合(桶聚合) 第一篇(常用桶聚合一览)

    本篇将开始介绍Elasticsearch Bucket聚合(桶聚合). Buket Aggregations(桶聚合)不像metrics Aggregations(度量聚合)那样计算字段上的度量,而是 ...

  9. Elastic Search Java API(文档操作API、Query DSL查询API)、es搜索引擎实战demo

    elastic search实战小demo:https://github.com/simonsfan/springboot-quartz-demo,分支:feature_es 之前在 Elastic ...

最新文章

  1. Cpp / checked_delete 原理
  2. Apache Lucene 7.0即将发布!
  3. java 打包后 文件资源文件 jar,JAVA打包成JAR无法找到资源文件
  4. mysql按照日期先去重在分组_【巨杉数据库Sequoiadb】【咨询】【数据操作】【聚集查询】在执行聚集查询时,字符类型的字段能否按照实际内容进行分组去重...
  5. smartSVN 分支与合并
  6. 游戏桌面壁纸|英雄联盟,热爱游戏的朋友看这里
  7. 2021年四川省政府工作报告:促进5G、大数据、区块链等技术与传统产业融合发展
  8. 远程无法连接数据库的问题
  9. brew update:以下未跟踪的工作树文件将被合并覆盖:
  10. 《海量数据库解决方案》读后感
  11. IQ FMEA-失效模式及影响分析
  12. STM32程序下载1:通过keil-ST-Link方式下载
  13. HTML ===> 页面添加数学公式
  14. 机器人开发--技术路线简介
  15. 流媒体服务器分发RTSP视频流并发压力测试
  16. 美瞳微商如何引流?微商卖美瞳怎么宣传?美瞳微商如何引流人脉
  17. Backtrader量化平台教程-跟踪止损单(十)
  18. 魔方(10)金字塔魔方、金字塔二重奏魔方
  19. Pion流媒体服务测试
  20. 编程逻辑入门必备2:归纳推理

热门文章

  1. rhel8编译安装axel
  2. java jdk8 Stream流操作学习
  3. Redis高性能原理:Redis为什么这么快?
  4. 腾讯携手教育部教指委、中国信通院发布犀牛鸟开源人才培养计划
  5. 学习小计(部分摘自cocos官方文档) 2
  6. VC 判断程序是否启动.
  7. 佳能打印机处于错误状态是怎么回事_惠普哪款打印机最稳定 惠普打印机推荐【详解】...
  8. 使用linux shell+sendmail+139邮箱实现定时短信报警
  9. 使用huggingface全家桶(transformers, datasets)实现一条龙BERT训练(trainer)和预测(pipeline)
  10. 云IDE:AWS Cloud 9