千家信息网

Elasticsearch聚合的方法怎么用

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,本篇内容介绍了"Elasticsearch聚合的方法怎么用"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所
千家信息网最后更新 2026年11月02日Elasticsearch聚合的方法怎么用

本篇内容介绍了"Elasticsearch聚合的方法怎么用"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

聚合是一种基于搜索的数据汇总,通过组合可以完成复杂的操作。聚合可以对文档进行汇总、分组等。通过聚合,我们会得到一个数据的概览,是分析和总结一律的数据,而不是寻觅单个文档。

  • Bucket Aggregation:少量列满足特定条件的文档的集合,相似MySQL的"group by"

  • Metric Aggregation:少量数学运算,可以对文档字段进行统计分析,比方max、min、sum等。

  • Pipeline Aggregation:对其余的聚合结果进行二次聚合

  • Matrix Aggregation:支持对多个字段的操作并提供一个结果矩阵,7.x版本合并到Metric Aggregation中了。

{    "size": 0,     ["query": {}, ]?    "aggs" : {        "${my_name}" : {            "${aggregation_type}" : {                            }            [,"meta" : {  [] } ]?            [,"aggs" : { []+ } ]?        }        [,"${my_name}" : { ... } ]*    }}
  • 聚合可以进行嵌套,比方上面的"aggs"内部又嵌套了一个"aggs"

  • "aggs"是简写,也可以写完整"aggregations"

  • 最上面的"size"一般设置为0,聚合操作用于统计数据,无需输出文档

  • query 查询,可选

  • my_name 自己设置名字

使用kibana导入"kibana_sample_data_flights",这个是飞机的航班信息,有地区、价格、天气等信息。

操作路径:Home --> 增加数据 --> 样例数据 --> Sample flight data

1、子聚合

根据目的地(DestCountry)进行分组,查看航班的数量

GET kibana_sample_data_flights/_search{  "size": 0,  "aggs": {    "dest_count": {      "terms": {        "field": "DestCountry"      }    }  }}

2、数字区间分组

根据价格区间进行分组,比方0到100元多少个,100到200元多少个

GET kibana_sample_data_flights/_search{  "size": 0,  "aggs": {    "price_stat": {     // 自己设置名字      "histogram": {        "field": "AvgTicketPrice",        "interval": 100     // 指定区间      }    }  }}

输出的结果中,key为"100.0"代表0到100.0的数据,计算公式如下

bucket_key = Math.floor(value / interval) * interval

3、日期区间分组

GET kibana_sample_data_flights/_search{  "size": 0,  "aggs": {    "price_stat": {      "date_histogram": {        "field": "timestamp",        "calendar_interval": "month"      }    }  }}

注意:日期间隔设置,7.x版本用"calendar_interval",老版本用"interval"。

支持的时间间隔表达式

  • 分钟:minute, 1m

  • 小时:hour, 1h

  • 天:day, 1d

  • 星期:week, 1w

  • 月:month, 1M

  • 季度:quarter, 1q

  • 年:year, 1y

计算度量这类的聚合操作是以使用一种方式或者者从文档中提取需要聚合的值为基础的。这些数据不但可以从文档(使用数据属性)的属性中提取出来,也可以使用脚本生成。

支持max、min、count、sum、avg、stats(各种统计信息)、cardinality(去重后数量)、percentiles(百分位)、geo_bounds(地理边界)

1、最值

输出航班的最大价格,最小价格

GET kibana_sample_data_flights/_search{  "size": 0,  "aggs": {    "max_price": {      "max": {        "field": "AvgTicketPrice"      }    },    "mix_price": {      "min": {        "field": "AvgTicketPrice"      }    }  }}

2、嵌套操作

输出各个目的地航班的最大价格,最小价格

GET kibana_sample_data_flights/_search{  "size": 0,   "aggs": {    "dest_count":{      "terms": {        "field": "DestCountry"      },      "aggs": {        "max_price": {          "max": {            "field": "AvgTicketPrice"          }        },        "min_price": {          "min": {            "field": "AvgTicketPrice"          }        }      }    }  }}

3、stats

一次性输出各种统计结果,包括count、min、max、sum、avg

GET kibana_sample_data_flights/_search{  "size": 0,   "aggs": {    "my_stats":{      "stats": {        "field": "AvgTicketPrice"      }    }  }}

4、cardinality

去重后数量统计

GET kibana_sample_data_flights/_search{  "size": 0,   "aggs": {    "my_cardinality":{      "cardinality": {        "field": "DestCountry"      }    }  }}

5、top_hits

top_hits 操作,最开头的几个文档。
获取去每个国家的航班的最小价格,下面的""size": 5"代表获取5个国家的航班,""size": 2"代表最低的2个价格。

GET kibana_sample_data_flights/_search{  "size": 0,  "aggs": {    "my_count": {      "terms": {        "field": "DestCountry",        "size": 5      },      "aggs": {        "my_min_price": {          "top_hits": {            "size": 2,            "sort": [              {                "AvgTicketPrice": {                  "order": "asc"                }              }            ]          }        }      }    }  }}

6、ranges 自己设置范围分组

比方下面,小于200一个分组,200到500一个分组,大于500个分组,可以指定输出的key。

GET kibana_sample_data_flights/_search{  "size": 0,  "aggs": {    "my_price_range":{      "range": {        "field": "AvgTicketPrice",        "ranges": [          {            "to": 200          },          {            "from": 200,            "to": 500          },          {            "key": ">500",             "from": 500          }        ]      }    }  }}

7、百分位聚合

百分位聚合,可以利用百分位聚合的结果评估数据分布,判断数据能否扭曲,判断数据能否双峰分布等。压测的时候经常使用,比方95百分位对应的值表示这个值大于95%的所有值。假设结果是"10%:12ms ,..., 70%:55ms, 99%:100ms",说明通常情况下(70%),网页的响应时间在12ms~55ms,99%的网页在100ms内加载完成。

GET kibana_sample_data_flights/_search{  "size": 0,   "aggs": {    "my_price_percentiles":{      "percentiles": {        "field": "AvgTicketPrice",        "percents": [          1,          5,          25,          50,          75,          95,          99        ]      }    }  }}

8、地理边界聚合

GET kibana_sample_data_flights/_search{  "size": 0,  "aggs": {    "my_geo_bounds": {      "geo_bounds": {        "field": "DestLocation",        "wrap_longitude": true      }    }  }}

9、优化 Terms 聚合的性能

设置 eager_global_ordinals 为true,会在内存中预先加载这些数据。

对聚合分析的结果再次做聚合分析。

分两类

  • Sibling:结果和现有分析结果同级。有min_bucket、max_bucket、avg_bucket、sum_bucket、stats_bucket、percentiles_bucket

  • Parent:结果内嵌到现有的聚合分析结果之中。有derivative(差值,与前一个的差值,用于看趋势)、cumulative_sum(累计求和)、moving_avg(移动平均,数据在一个固定大小窗口里的平均值)

说明,bucket_path参数,指定路径,假如是二级路径,注意有一个">"。

1、Sibling的例子

根据不同的目的地获取平均票据,并对这些平均票价做分析。
注意,my_distance,my_avg_price,my_result这三个是自己设置的变量名,buckets_path指定路径。

GET kibana_sample_data_flights/_search{  "size": 0,  "aggs": {    "my_distance": {      "terms": {        "field": "DestCountry"      },      "aggs": {        "my_avg_price": {          "avg": {            "field": "AvgTicketPrice"          }        }      }    },    "my_result": {      "stats_bucket": {        "buckets_path": "my_distance>my_avg_price"      }    }  }}

2、Parent的例子

统计每50km的平均票价,并查看其波动

GET kibana_sample_data_flights/_search{  "size": 0,  "aggs": {    "my_distance": {      "histogram": {        "field": "DistanceKilometers",        "interval": 50      },      "aggs": {        "my_avg_price": {          "avg": {            "field": "AvgTicketPrice"          }        },        "my_result": {          "derivative": {            "buckets_path": "my_avg_price"          }        }      }    }  }}

根据数量(_count)进行排序,数量相同根据返回的key进行排序

GET kibana_sample_data_flights/_search{  "size": 0,  "aggs": {    "dest_count": {      "terms": {        "field": "DestCountry",        "order": [          {            "_count": "asc"          },          {            "_key": "desc"          }        ]      }    }  }}

根据最终返回的结果进行排序,比方下面的my_stats

GET kibana_sample_data_flights/_search{  "size": 0,  "aggs": {    "my_distance": {      "terms": {        "field": "DestCountry",        "order": {          "my_stats.min": "asc"        }      },      "aggs": {        "my_stats": {          "stats": {            "field": "AvgTicketPrice"          }        }      }    }  }}

聚合分析

Terms 聚合分析不准的起因,数据分散在多个分片上,Coordinating Node 无法获取数据全貌。

打开 show_term_doc_count_error,可以多看到两个返回值。

  • doc_count_error_upper_bound:被遗漏的term 分桶,包含的文档,有可能的最大值

  • sum_other_doc_count:除了返回结果 bucket的 terms 以外,其余 terms 的文档总数(总数-返回的总数)

Trems 不正确的案例

那么如何处理呢?

  • 处理方案 1:当数据量不大时,设置 Primary Shard 为 1;实现精确性。

  • 处理方案 2:在分布式数据上,设置 shard_size 参数,提高准确度。原理:每次从 Shard 上额外多获取数据,提升精确率,但会降低响应时间。

shard_size 的默认大小 "shard_size = size * 1.5 * 10",可以根据自己的需要进行设置。

"Elasticsearch聚合的方法怎么用"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

数据 结果 文档 分析 分组 价格 输出 航班 统计 数量 百分 区间 路径 面的 最大 最小 代表 信息 总数 时间 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 科技平台互联网 互联网 科技创新 丰台科技园 互联网 易通互联网络科技有限公司 碳银互联网科技有限公司 上海亿帐通互联网科技 互联网科技素材视频竖屏 博兴的互联网电子科技公司 互联网校园科技培训 深圳市优智互联网科技有限公司 高科技互联网发展前景如何 恒生互联网科技业指数调整周期 山东子淼互联网科技有限公司 广州百诚互联网科技有限公司官网 广州互联网高科技取餐柜 广州燕处互联网科技有限公司 互联网时代高科技布局 互联网科技博主张洲 互联网金融金融科技 互联网科技创业计划的风险分析 互联网科技行业发展 与互联网科技公司 互联网科技美容 富国互联网科技创新基金 世界互联网科技公司市值排名 新兴科技互联网创新大赛颁奖典礼 互联网科技和医药行业 互联网科技的前景 杭州科技互联网公司有哪些 广州全民伙伴互联网科技有限公司
0