【ElasticSearch】踩坑 对terms的buckets进行bucket_sort排序
1.需求和实现
选出可用性最高的前15个数据展示:
先按照key_id.keyword进行url分组,然后子聚合算出可用性,再用bucket_sort对avail_perc
排序,size取15。
然后我觉得反正只要15个,terms的size也取了15。
以下是实现的es语句
GET /aaa/_search
{
"query": {。。。
},
"aggs": {
"group_by_url": {
"terms": {
"field": "key_id.keyword",
"size": 15
},
"aggs": {
"all_num": {
"value_count": {
"field": "_id"
}
},
"not_exceed": {
"filter": {
"script": {
"script": "doc['result_new.http_request_statusCode.isAlert'].value==false && doc['result_new.http_request_responseTime.isAlert'].value==false"
}
},
"aggs": {
"not_exceed_num": {
"value_count": {
"field": "_id"
}
}
}
},
"avail_perc": {
"bucket_script": {
"buckets_path": {
"all_num_1": "all_num",
"not_exceed_thres_num": "not_exceed>not_exceed_num"
},
"script": "(params.not_exceed_thres_num / params.all_num_1)*100"
}
},
"bucket_sort_temp": {
"bucket_sort": {
"sort": [
{
"avail_perc": {
"order": "asc"
}
}
],
"size": 15
}
}
}
}
}
}
2.问题
发现terms的size和bucket_sort的size取15和5的结果不完全相同。
3.原因
我的语句实际上进行了两次排序,第一次是用terms对默认的doc_count进行排序,第二次才是用bucket_sort对avail_perc
排序。所以如果terms的size取的小,在terms排序那里,想要的结果已经被截掉了。
*官网说明:根据terms分组聚合,如果不指定order属性,默认是按照doc_count
降序排列的
The order of the buckets can be customized by setting the order parameter. By default, the buckets are ordered by their doc_count descending.
4.解决
terms的size取值大一点,尽可能使terms的默认排序 对bucket_sort的排序 不产生影响。
比如我这里,url的数量最多有10000个,terms的size取值要>=10000,就能够不截断任何url。那么bucket_sort就可以对全部数据进行排序了。