【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就可以對全部數據進行排序了。