聚合的作用范圍
- ElasticSearch 聚合分析的默認(rèn)作用范圍是 Query 的查詢結(jié)果集;
- 同時 ElasticSearch 還支持以下方式改變聚合的作用范圍:
- Filter
- Post Filter
- Global
聚合的作用范圍 | 舉幾個栗子
query 的作用范圍
- 年齡大于 40 歲員工的分桶;
POST employees/_search
{
"size": 0,
"query": {
"range": {
"age": {
"gte": 20
}
}
},
"aggs": {
"jobs": {
"terms": {
"field":"job.keyword"
}
}
}
}
filter 的作用范圍
- 在具體的聚合當(dāng)中,做范圍的限制,比如在聚合
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"的桶的數(shù)據(jù)展示出來;
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 字段,可以對聚合的結(jié)果排序;默認(rèn)桶的排序是按桶里文檔數(shù)由大到小排序的;
聚合中的排序 | 舉個栗子
- 按桶的 _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 字段的平均值;
- 按桶內(nèi)文檔 salary 的平均值降序給桶排序;
POST employees/_search
{
"size": 0,
"aggs": {
"jobs": {
"terms": {
"field":"job.keyword",
"order":[{
"avg_salary":"desc"
}]
},
"aggs": {
"avg_salary": {
"avg": {
"field":"salary"
}
}
}
}
}
}
- 按 job.keyword 分桶;
- 對桶內(nèi)的文檔做 stat 統(tǒng)計分析;
- 桶的結(jié)果按桶內(nèi) salary 字段的最小值給桶排序;
POST employees/_search
{
"size": 0,
"aggs": {
"jobs": {
"terms": {
"field":"job.keyword",
"order":[ {
"stats_salary.min":"desc"
}]
},
"aggs": {
"stats_salary": {
"stats": {
"field":"salary"
}
}
}
}
}
}