elasticsearch聚合查询

什么是聚合,就是目的不是查询具体的文档,而是查询文档的相关性,此外还可以对聚合的文档在按照其他维度再聚合。

包含以下四种聚合

  • Bucket Aggregation 一些列满足特定条件的文档的集合

    • terms 对某个字段统计每个不同的内容,以及出现文档的个数
    • range 某个范围内文档的个数
  • Metric Aggregation 一些数学运算,可以对文档字段进行统计分析
    • 输出一个值,min/max/sum/avg/cardinality
    • 输出多个值,stats/percentiles/percentile_ranks
  • Pipeline Aggregation 对其他的聚合结果进行二次聚合(不是对文档进行聚合)
  • Matrix Aggregation 支持对多个字段的操作并提供一个结果矩阵
  1. #按照目的地进行分桶统计 Bucket Aggregation
  2. GET kibana_sample_data_flights/_search
  3. {
  4. "size": 0,
  5. "aggs":{
  6. "flight_dest":{
  7. "terms":{
  8. "field":"DestCountry"
  9. }
  10. }
  11. }
  12. }
  13. #查看航班目的地的统计信息,增加平均,最高最低价格 Metric Aggregation
  14. GET kibana_sample_data_flights/_search
  15. {
  16. "size": 0,
  17. "aggs":{
  18. "flight_dest":{
  19. "terms":{
  20. "field":"DestCountry"
  21. },
  22. "aggs":{
  23. "avg_price":{
  24. "avg":{
  25. "field":"AvgTicketPrice"
  26. }
  27. },
  28. "max_price":{
  29. "max":{
  30. "field":"AvgTicketPrice"
  31. }
  32. },
  33. "min_price":{
  34. "min":{
  35. "field":"AvgTicketPrice"
  36. }
  37. }
  38. }
  39. }
  40. }
  41. }
  42. #价格统计信息+天气信息 Metric Aggregation
  43. GET kibana_sample_data_flights/_search
  44. {
  45. "size": 0,
  46. "aggs":{
  47. "flight_dest":{
  48. "terms":{
  49. "field":"DestCountry"
  50. },
  51. "aggs":{
  52. "stats_price":{
  53. "stats":{
  54. "field":"AvgTicketPrice"
  55. }
  56. },
  57. "wather":{
  58. "terms": {
  59. "field": "DestWeather",
  60. "size": 5
  61. }
  62. }
  63. }
  64. }
  65. }
  66. }
  67. # 平均工资最低的工作类型
  68. GET employees/_search
  69. {
  70. "size": 0,
  71. "aggs": {
  72. "jobs": {
  73. "terms": {
  74. "field": "job.keyword",
  75. "size": 10
  76. },
  77. "aggs": {
  78. "avg_salary": {
  79. "avg": {
  80. "field": "salary"
  81. }
  82. }
  83. }
  84. },
  85. "min_salary_by_job":{
  86. "min_bucket": {
  87. "buckets_path": "jobs>avg_salary"
  88. }
  89. }
  90. }
  91. }

聚合的作用范围

默认聚合范围是全文,但是如果有query查询,那么聚合的范围就是query查询的结果

  1. # Query
  2. GET employees/_search
  3. {
  4. "size": 0,
  5. "query": {
  6. "range": {
  7. "age": {
  8. "gte": 20
  9. }
  10. }
  11. },
  12. "aggs": {
  13. "jobs": {
  14. "terms": {
  15. "field":"job.keyword"
  16. }
  17. }
  18. }
  19. }

如果有聚合中有filter过滤,那么其子聚合的作用范围是filter过滤的文档,但是和此聚合并列的聚合,不受filter影响

  1. #Filter
  2. GET employees/_search
  3. {
  4. "size": 0,
  5. "aggs": {
  6. "older_person": {
  7. "filter":{
  8. "range":{
  9. "age":{
  10. "from":35
  11. }
  12. }
  13. },
  14. "aggs":{
  15. "jobs":{
  16. "terms": {
  17. "field":"job.keyword"
  18. }
  19. }
  20. }},
  21. "all_jobs": {
  22. "terms": {
  23. "field":"job.keyword"
  24. }
  25. }
  26. }
  27. }

我们可以指定一些作用范围,关键字是 post_filter、global

  1. #Post field. 一条语句,找出所有的job类型。还能找到聚合后符合条件的结果
  2. GET employees/_search
  3. {
  4. "aggs": {
  5. "jobs": {
  6. "terms": {
  7. "field": "job.keyword"
  8. }
  9. }
  10. },
  11. "post_filter": {
  12. "match": {
  13. "job.keyword": "Dev Manager"
  14. }
  15. }
  16. }
  17. #global global会无视query条件,对全部文档进行统计
  18. GET employees/_search
  19. {
  20. "size": 0,
  21. "query": {
  22. "range": {
  23. "age": {
  24. "gte": 40
  25. }
  26. }
  27. },
  28. "aggs": {
  29. "jobs": {
  30. "terms": {
  31. "field":"job.keyword"
  32. }
  33. },
  34. "all":{
  35. "global":{},
  36. "aggs":{
  37. "salary_avg":{
  38. "avg":{
  39. "field":"salary"
  40. }
  41. }
  42. }
  43. }
  44. }
  45. }

聚合的排序

默认聚合是按照buckets的文档数进行排序的,我们也可以自己指定排序字段

  1. #按照返回结果中bucket里的字段排序
  2. #count and key
  3. GET employees/_search
  4. {
  5. "size": 0,
  6. "query": {
  7. "range": {
  8. "age": {
  9. "gte": 20
  10. }
  11. }
  12. },
  13. "aggs": {
  14. "jobs": {
  15. "terms": {
  16. "field":"job.keyword",
  17. "order":[
  18. {"_count":"asc"},
  19. {"_key":"desc"}
  20. ]
  21. }
  22. }
  23. }
  24. }
  25. #按照子聚合结果排序,如果单值输出,不用指定子聚合的字段
  26. #count and key
  27. GET employees/_search
  28. {
  29. "size": 0,
  30. "aggs": {
  31. "jobs": {
  32. "terms": {
  33. "field":"job.keyword",
  34. "order":[ {
  35. "avg_salary":"desc"
  36. }]
  37. },
  38. "aggs": {
  39. "avg_salary": {
  40. "avg": {
  41. "field":"salary"
  42. }
  43. }
  44. }
  45. }
  46. }
  47. }
  48. #按照子聚合的字段排序,如果多值输出,需指定子聚合结果的字段
  49. #count and key
  50. GET employees/_search
  51. {
  52. "size": 0,
  53. "aggs": {
  54. "jobs": {
  55. "terms": {
  56. "field":"job.keyword",
  57. "order":[ {
  58. "stats_salary.min":"desc"
  59. }]
  60. },
  61. "aggs": {
  62. "stats_salary": {
  63. "stats": {
  64. "field":"salary"
  65. }
  66. }
  67. }
  68. }
  69. }
  70. }

聚合的精准度问题

我们需要关注返回结果的两个字段

  • doc_count_error_upper_bound

    • 被遗漏的term分桶,包含的文档,有可能的最大值
  • sum_other_doc_count
    • 除了返回结果bucket的terms以外,其他terms的文档总数(总数-返回的总数)

doc_count_error_upper_bound:例如,在取分桶后的前三个时,这里的值就是每个分片最后一个的文档数的和

sum_other_doc_count:所有文档数-分桶展示出来的文档总数

如何解决terms不准的问题

  • terms聚合分析不准的原因,数据分散在多个分片上,coordinating node无法获取数据全貌,
  • 解决方案一、当数据量不大时,设置primary shard为1,实现准确性
  • 解决方案二、在分布式数据上,设置shard_size参数,提高精准度
    • 就是每次从shard上获取的比你size指定的更多的数据,提升准确率,你让我取前三,我分别取前6个,然后在组合起来取前三。
    • shard size大小设定 size*1.5+10
  1. GET my_flights/_search
  2. {
  3. "size": 0,
  4. "aggs": {
  5. "weather": {
  6. "terms": {
  7. "field":"OriginWeather",
  8. "size":1,
  9. "shard_size":10,
  10. "show_term_doc_count_error":true//在返回结果中显示doc_count_error_upper_bound
  11. }
  12. }
  13. }
  14. }

4.elasticsearch中聚合查询的更多相关文章

  1. Elasticsearch(9) --- 聚合查询(Bucket聚合)

    Elasticsearch(9) --- 聚合查询(Bucket聚合) 上一篇讲了Elasticsearch聚合查询中的Metric聚合:Elasticsearch(8) --- 聚合查询(Metri ...

  2. Elasticsearch系列---聚合查询原理

    概要 本篇主要介绍聚合查询的内部原理,正排索引是如何建立的和优化的,fielddata的使用,最后简单介绍了聚合分析时如何选用深度优先和广度优先. 正排索引 聚合查询的内部原理是什么,Elastich ...

  3. Elasticsearch(8) --- 聚合查询(Metric聚合)

    Elasticsearch(8) --- 聚合查询(Metric聚合) 在Mysql中,我们可以获取一组数据的 最大值(Max).最小值(Min).同样我们能够对这组数据进行 分组(Group).那么 ...

  4. ElasticSearch实战系列五: ElasticSearch的聚合查询基础使用教程之度量(Metric)聚合

    Title:ElasticSearch实战系列四: ElasticSearch的聚合查询基础使用教程之度量(Metric)聚合 前言 在上上一篇中介绍了ElasticSearch实战系列三: Elas ...

  5. java操作elasticsearch实现聚合查询

    1.max 最大值 //max 求最大值 @Test public void test30() throws UnknownHostException{ //1.指定es集群 cluster.name ...

  6. elasticsearch 简单聚合查询示例

    因为懒癌犯了,查询语句使用的截图而不是文字,导致了发布随笔的时候提示少于150字的随笔不能发布. 我就很郁闷了. 下面的查询都是前段时间工作中使用过的查询语句. 开始的时候是使用nodejs构建es查 ...

  7. elasticsearch相关聚合查询示例

    索引(index):logstash-nginx-*,type:nginx_access 请求路径: 1.按照某个字段进行分组统计访问量 { "query": { "bo ...

  8. java使用elasticsearch分组进行聚合查询(group by)-项目中实际应用

    java连接elasticsearch 进行聚合查询进行相应操作 一:对单个字段进行分组求和 1.表结构图片: 根据任务id分组,分别统计出每个任务id下有多少个文字标题 .SQL:select id ...

  9. java操作elasticsearch实现前缀查询、wildcard、fuzzy模糊查询、ids查询

    1.前缀查询(prefix) //prefix前缀查询 @Test public void test15() throws UnknownHostException { //1.指定es集群 clus ...

  10. Elasticsearch 常用基本查询

    安装启动很简单,参考官网步骤:https://www.elastic.co/downloads/elasticsearch 为了介绍Elasticsearch中的不同查询类型,我们将对带有下列字段的文 ...

随机推荐

  1. 关于.Net 6.0 在Linux ,Docker容器中,不安装任何依赖就生成图形验证码!!!!!!!!!!!

    在.Net Framework时代,我们生成验证码大多都是用System.Drawing. 在.Net 6中使用也是没有问题的. 但是,System.Drawing却依赖于Windows GDI+. ...

  2. qiankun微前端实践

    为什么要使用微前端 微前端架构具备以下几个核心价值: 技术栈无关 主框架不限制接入应用的技术栈,微应用具备完全自主权 独立开发.独立部署 微应用仓库独立,前后端可独立开发,部署完成后主框架自动完成同步 ...

  3. vue 甘特图(三):甘特图右侧内容拖动展示

    vue3 甘特图(三):甘特图右侧内容拖动展示内容 解决因多个项目周期跨度不同,在一页屏幕里展示不完全,需要通过拖动甘特图下方的滚动条,去查看对应时间段内的内容 拖拽滚动视图,展示对应时间甘特图 构思 ...

  4. 使用playwright爬取魔笔小说网站并下载轻小说资源

    一.安装python 官网 下载python3.9及以上版本 二.安装playwright playwright是微软公司2020年初发布的新一代自动化测试工具,相较于目前最常用的Selenium,它 ...

  5. 【matplotlib 实战】--百分比柱状图

    百分比堆叠式柱状图是一种特殊的柱状图,它的每根柱子是等长的,总额为100%.柱子内部被分割为多个部分,高度由该部分占总体的百分比决定. 百分比堆叠式柱状图不显示数据的"绝对数值", ...

  6. 01-spfile和pfile的区别,生成,加载和修复

    oracle数据库的配置文件指的是系统在启动到"nomount"阶段需要加载的文件,也叫做pfile或者spfile,但是其实pfile和spfile是不同的文件. 不同的数据库配 ...

  7. 栩栩如生,音色克隆,Bert-vits2文字转语音打造鬼畜视频实践(Python3.10)

    诸公可知目前最牛逼的TTS免费开源项目是哪一个?没错,是Bert-vits2,没有之一.它是在本来已经极其强大的Vits项目中融入了Bert大模型,基本上解决了VITS的语气韵律问题,在效果非常出色的 ...

  8. nginx学习(基本概念、配置和命令、反向代理、负载均衡、动静分离)

    之前都只会照着网上的nginx配置和代码什么的直接拿过来用,但是没系统学习过,所以来系统学习一下nginx内容. 建议服务器不要关闭防火墙,按需开启端口就好,然后云服务器也要设置SSH密钥,安全性高一 ...

  9. 网页全终端h5浏览器视频流解决方案RTSP/FLV/HLS

    背景 项目上需要基于视频巡检,在线勘查填写定制表单,降低巡检成本. 本文着重讲前端部分视频流展示解决方案. 调研 流媒体(streaming media)是指将一连串的媒体数据压缩后,经过网上分段发送 ...

  10. 【scipy 基础】--图像处理

    SciPy库本身是针对科学计算而不是图像处理的,只是图像处理也包含了很多数学计算,所以Scipy也提供了一个专门的模块ndimage用于图像处理. ndimage模块提供的功能包括输入/输出图像.显示 ...