格式:
GET /index/_search
{
"size": 0,
"aggs": {
"aggregation_name": {
"aggregation_type": {
"aggregation_field": "field_name"
// 可选参数
}
}
// 可以添加更多的聚合
}
}
# 解析
-index:要执行聚合查询的索引名称。
-size: 设置为 0 来仅返回聚合结果,而不返回实际的搜索结果,这里将hits改为0表示返回的原始数据变为0
-aggs:指定聚合操作的容器。
-aggregation_name:聚合名称,可以自定义(名字随便起,无所谓)。
-aggregation_type:聚合操作的类型,例如 terms、avg、sum 等。
-aggregation_field:聚合操作的目标字段,对哪些字段进行聚合
格式:
GET /index/_search
{
"size": 0,
"aggs": {
"aggregation_name": {
"bucket_type": {
"bucket_options": {
"bucket_option_name": "bucket_option_value",
...
},
"aggs": {
"sub_aggregation_name": {
"sub_aggregation_type": {
"sub_aggregation_options": {
"sub_aggregation_option_name": "sub_aggregation_option_value",
...
}
}
}
}
}
}
}
}
#解析
-index: 替换为要执行聚合查询的索引名称。
-aggregation_name: 替换为自定义的聚合名称(名字随便起)。
-bucket_type: 替换为特定的桶聚合类型(如 terms、date_histogram、range 等)。
-bucket_option_name 和 bucket_option_value: 替换为特定桶聚合选项的名称和值。
-sub_aggregation_name: 替换为子聚合的名称。
-sub_aggregation_type: 替换为特定的子聚合类型(如 sum、avg、max、min 等)。
-sub_aggregation_option_name 和 sub_aggregation_option_value: 替换为特定子聚合选项的名称和值
-两个aggs,表示有两个聚合,第一个外层aggs表示桶聚合, 第二层aggs表示指标聚合,在每个分组桶内进行数据指标聚合,指标聚合范围就是一个桶内的数据。
指标聚合(Aggregation Metrics):
(1). Avg Aggregation:计算文档字段的平均值。
(2). Sum Aggregation:计算文档字段的总和。
(3). Min Aggregation:找到文档字段的最小值。
(4). Max Aggregation:找到文档字段的最大值。
聚合桶(Aggregation Buckets):
(1). Terms Aggregation:基于字段值将文档分组到不同的桶中。
(2). Date Histogram Aggregation:按日期/时间字段创建时间间隔的桶。
(3). Range Aggregation:根据字段值的范围创建桶。
DEMO原始数据:
# 批量插入数据
POST /sales/_bulk
{"index": {}}
{"product": "iPhone", "sales": 4, "date": "2021-04-21"}
{"index": {}}
{"product": "Samsung", "sales": 60, "date": "2022-04-21"}
{"index": {}}
{"product": "iPhone", "sales": 100, "date": "2021-05-21"}
{"index": {}}
{"product": "Samsung", "sales": 80, "date": "2021-05-21"}
{"index": {}}
{"product": "华为手机", "sales": 50, "date": "2021-06-21"}
{"index": {}}
{"product": "华为手机", "sales": 5000, "date": "2021-06-21"}
{"index": {}}
{"product": "华为手机", "sales": 200, "date": "2021-06-21"}
案例1: 分别按照商品名称(product)进行分组
GET /sales/_search
{
"aggs":{//聚合操作
"product_group":{//名称,随意起名
"terms":{//分组
"field":"product"//分组字段
}
}
}
}
案例2:查询结果将返回每个产品的名称和销售总量
GET /sales/_search
{
"size": 0,
"aggs": {
"product_sales": {
"terms": {
"field": "product"
},
"aggs": {
"total_sales": {
"sum": {
"field": "sales"
}
}
}
}
}
}
解析: 限根据产品名称进行分组,外层的aggs下的terms中根据字段product进行分组。 然后进行二次指标聚合,每个桶中进行指标聚合,每个桶根据sales字段求sum总和
案例3: 获取最大值
GET /sales/_search
{
"size": 0,
"aggs": {
"max_sales": {
"max": {
"field": "sales"
}
}
}
}
size: 0 表示只返回最大值的那个值,去掉size属性,会把【参与统计】最大值的所有数据都返回
max_price: 随便起名
max: 固定的关键字,表示最大值
案例4: 获取最小值max
GET /sales/_search
{
"size": 0,
"aggs": {
"min_sales": {
"min": {
"field": "sales"
}
}
}
}
size: 0 表示只返回最大值的那个值,去掉size属性,会把【参与统计】最小值的所有数据都返回
min_price: 随便起名
min: 固定的关键字,表示最小值
案例5: 获取平均值avg
GET /sales/_search
{
"size": 0,
"aggs": {
"avg_sales": {
"avg": {
"field": "sales"
}
}
}
}
size: 0 表示只返回最大值的那个值,去掉size属性,会把【参与统计】平均值的所有数据都返回
avg_sales: 随便起名
avg: 固定的关键字,表示平均值
案例6: 获取总和sum
GET /sales/_search
{
"size": 0,
"aggs": {
"total_sales": {
"sum": {
"field": "sales"
}
}
}
}
size: 0 表示只返回最大值的那个值,去掉size属性,会把【参与统计】总和的所有数据都返回
total_sales: 随便起名
sum: 固定的关键字,表示求总值
案例7: 桶聚合 term实战
根据book_title字段分组,并统计每个组内sales_count的总值
GET /book_sales/_search
{
"size": 0,
"aggs": {
"book_buckets": {
"terms": {
"field": "book_title",
"size": 10
},
"aggs": {
"total_sales": {
"sum": {
"field": "sales_count"
}
}
}
}
}
}
book_buckets: 名字随便起
terms: 表示桶聚合,即分组,根据book_title字段进行分组
book_title: 聚合统计的字段, 该字段必须时term精准匹配类型,不能是text模糊匹配
内层aggs: 在每个组中在进行内部二次聚合
total_sales: 二次聚合名称,随便起
sum: 对每个组内数据根据sales_count字段进行求总和
案例8:Date Histogram分组
将日期类型的字段按照固定的时间间隔进行分桶,并对每个时间间隔内的文档进行进一步的操作和计算
GET /order_history/_search
{
"size": 0,
"aggs": {
"sales_per_month": {
"date_histogram": {
"field": "order_date",
"calendar_interval": "month",
"format": "yyyy-MM"
},
"aggs": {
"total_sales": {
"sum": {
"field": "amount"
}
}
}
}
}
}
size: 返回参与统计的数据 ,size = 0表示不返回参与统计的数据,只返回统计结果数据
sales_per_month:名字,自定义,随便取
date_histogram:关键字,必须这么写,这个关键字就表示要按照日期字段进行分组
field:根据哪个字段进行分组统计
calendar_interval: 指定用于分桶的时间间隔。时间间隔可以是一个有效的日期格式(如 1d、1w、1M),也可以是一个数字加上一个时间单位的组合(如 7d 表示 7 天,1h 表示 1 小时)。month表示按 每个月分组, 2h 表示每2个小时为一组
format:输出的日期格式
案例9:分桶聚合-Range 范围聚合
GET /product_v4/_search
{
"size": 0,
"aggs": {
"price_ranges": {
"range": {
"field": "price",
"ranges": [
{ "to": 100 },
{ "from": 100, "to": 200 },
{ "key": "safaf" , "from": 200 }
]
}
}
}
}
price_ranges: 名字随便起, 自定义
range: 固定关键字,表示范围聚合
field: 要聚合的字段
ranges: 指定范围组,每个范围使用 key、from 和 to 参数进行定义。
key: 每个组唯一标识, 当然可以不写,不写系统会默认起名, 如果要写,名一定要用key, 并且不能重复
from:从哪里开始, 不写就表示从0开始 到 to的值
to: 到哪里结束,不写就表示从from 到 无穷大