聚合查询
聚合(aggs)查询中,进行聚合的字段必须是exact value,分词字段不可进行聚合,对于text字段如果需要使用聚合,需要开启fielddata,但是通常不建议,因为fielddata是将聚合使用的数据结构由磁盘(doc_values)变为了堆内存(field_data),大数据的聚合操作很容易导致OOM,详细原理会在进阶篇中阐述。
三种聚合分类
分桶聚合(Bucket agregations):类比SQL中的group by的作用,主要用于统计不同类型数据的数量
函数:terms
注意:聚合字段必须是exact value,如keyword
指标聚合(Metrics agregations):主要用于最大值、最小值、平均值、字段之和等指标的统计
函数:平均值:Avg、最大值:Max、最小值:Min、求和:Sum、详细信息:Stats、数量:Value count
管道聚合(Pipeline agregations):用于对聚合的结果进行二次聚合,如要统计绑定数量最多的标签bucket,就是要先按照标签进行分桶,再在分桶的结果上计算最大值。
函数:Min bucket:最小桶、Max bucket:最大桶、Avg bucket:桶平均值、Sum bucket:桶求和、Stats bucket:桶信息
语法
// 桶聚合或指标聚合
GET product/_search
{
"aggs": {
"<aggs_name>": { //聚合函数的名称,自己定义
"<agg_type>": { // 聚合种类,比如是桶聚合(terms)或者是指标聚合(avg、sum、min、max等)
"field": "<field_name>" // 字段名称或者叫域名, 需要group by的字段.
}
}
}
}
// 管道聚合
GET product/_search
{
"size": 0, //hit 记录条数. 聚合不需要显示具体详情.
"aggs": {
"my_aggs": { //聚合的名称,自己定义
"terms": { // 桶聚合,聚合种类
...
},
"aggs": { // 嵌套聚合,标签在 自定义聚合名称下.与聚合种类平级.
"price_bucket": { // 聚合的名称,自己定义.
... // 聚合情况
}
}
},
"my_min_bucket":{ // 自定义管道聚合名称, aggs下,与需要的二级聚合的自定义名称标签同级.
"min_bucket": { // 管道聚合关键字.
"buckets_path": "my_aggs>price_bucket" // 管道聚合路径.从需要二级聚合的自定义标签位置,到需要聚合的自定义标签位置.中间用>连接
}
}
}
}
更多聚合分类
嵌套聚合: 用于在某种聚合的计算结果之上再次聚合,如统计不同类型商品的平均价格,就是在按照商品类型桶聚合之后,在其结果之上计算平均价格
// 嵌套聚合语法 GET product/_search { "size": 0, "aggs": { "<agg_name>": { "<agg_type>": { "field": "<field_name>" }, "aggs": { "<agg_name_child>": { "<agg_type>": { "field": "<field_name>" } } } } } }
基于query或filter的聚合
// 语法 GET product/_search { "query": { ... }, "aggs": { ... } }