一. ES的过滤
在实际的应用过程中,我们往往需要对数据过滤之后然后再进行聚合又或者说对过滤之后的数据做筛选。
1.1 局部过滤
局部过滤意思就是只针对某个特定的聚合有用而对其他聚合没有作用。
查询所有的工种的分桶信息;查询年龄大于30岁的员工的分桶信息
GET employee/_search
{
"size": 0,
"aggs": {
"all_jobs": {
"terms": {
"field": "job"
}
},
"filter_jobs": {
"filter": {
"range": {
"age": {
"gte": 25
}
}
},
"aggs": {
"older_emp_aggs": {
"terms": {
"field": "job"
}
}
}
}
}
}
1.2 全局过滤
全局过滤对所有的聚合查询都是有效的,但是也可以通过一定的方式来屏蔽全局过滤。
查询年龄在30岁以上的员工的桶信息;
GET employee/_search
{
"size": 0,
"query": {
"range": {
"age": {
"gte": 30
}
}
},
"aggs": {
"job_agg": {
"terms": {
"field": "job"
}
},
"ignore_global_filter": {
"global": {},
"aggs": {
"sal_avg": {
"avg": {
"field": "sal"
}
}
}
}
}
}
二. 排序
还可以对聚合的结果进行排序。
查询工种的桶信息,并根据各个工种的员工总数的倒序进行排序
GET employee/_search
{
"size": 0,
"aggs": {
"jobs": {
"terms": {
"field": "job",
"order": {
"_count": "desc"
}
}
}
}
}
根据各工种的平均工资的倒序排序
GET employee/_search
{
"size": 0,
"aggs": {
"jobs": {
"terms": {
"field": "job",
"order": [
{
"sal_avg": "desc"
}
]
},
"aggs": {
"sal_avg": {
"avg": {
"field": "sal"
}
}
}
}
}
}