聚合的作用范围
- ElasticSearch 聚合分析的默认作用范围是 Query 的查询结果集;
- 同时 ElasticSearch 还支持以下方式改变聚合的作用范围:
- Filter
- Post Filter
- Global
聚合的作用范围 | 举几个栗子
query 的作用范围
- 年龄大于 40 岁员工的分桶;
POST employees/_search
{
"size": 0,
"query": {
"range": {
"age": {
"gte": 20
}
}
},
"aggs": {
"jobs": {
"terms": {
"field":"job.keyword"
}
}
}
}
filter 的作用范围
- 在具体的聚合当中,做范围的限制,比如在聚合
older_person
中,限定年龄大于 35;
POST employees/_search
{
"size": 0,
"aggs": {
"older_person": {
"filter":{
"range":{
"age":{
"from":35
}
}
},
"aggs":{
"jobs":{
"terms": {
"field":"job.keyword"
}
}
}
},
"all_jobs": {
"terms": {
"field":"job.keyword"
}
}
}
}
post_filter 的作用范围
- 先分桶,按 job.keyword;
- 完了把
"job.keyword": "Dev Manager"
的桶的数据展示出来;
POST employees/_search
{
"aggs": {
"jobs": {
"terms": {
"field": "job.keyword"
}
}
},
"post_filter": {
"match": {
"job.keyword": "Dev Manager"
}
}
}
global 的作用范围
-
"global":{}
的意思是,在聚合all
中,会忽略掉query
中限定的条件,对索引 employees 中的所有的文档的 salary 字段做平均值;
POST employees/_search
{
"size": 0,
"query": {
"range": {
"age": {
"gte": 40
}
}
},
"aggs": {
"jobs": {
"terms": {
"field":"job.keyword"
}
},
"all":{
"global":{},
"aggs":{
"salary_avg":{
"avg":{
"field":"salary"
}
}
}
}
}
}
聚合中的排序
通过 order 字段,可以对聚合的结果排序;默认桶的排序是按桶里文档数由大到小排序的;
聚合中的排序 | 举个栗子
- 按桶的 _count 升序排序;
- 在桶的 _count 相等的情况下,按 _key 降序排序;
POST employees/_search
{
"size": 0,
"query": {
"range": {
"age": {
"gte": 20
}
}
},
"aggs": {
"jobs": {
"terms": {
"field":"job.keyword",
"order":[
{"_count":"asc"},
{"_key":"desc"}
]
}
}
}
}
- 先按 job.keyword 分桶;
- 计算每个桶中 salary 字段的平均值;
- 按桶内文档 salary 的平均值降序给桶排序;
POST employees/_search
{
"size": 0,
"aggs": {
"jobs": {
"terms": {
"field":"job.keyword",
"order":[{
"avg_salary":"desc"
}]
},
"aggs": {
"avg_salary": {
"avg": {
"field":"salary"
}
}
}
}
}
}
- 按 job.keyword 分桶;
- 对桶内的文档做 stat 统计分析;
- 桶的结果按桶内 salary 字段的最小值给桶排序;
POST employees/_search
{
"size": 0,
"aggs": {
"jobs": {
"terms": {
"field":"job.keyword",
"order":[ {
"stats_salary.min":"desc"
}]
},
"aggs": {
"stats_salary": {
"stats": {
"field":"salary"
}
}
}
}
}
}