ElasticSearch 聚合结果排序
ElasticSearch 聚合结果排序
简单的指标聚合结果并根据聚合结果排序如下
以接口id聚合,以平均响应时间排序
{
"size": 0,
"aggs": {
"api": {
"terms": {
"field": "api.id",
"order": {
"reponseTime": "asc"
},
"size": 10
},
"aggs": {
"reponseTime": {
"sum": {
"field": "response.time"
}
},
"requestTime": {
"sum": {
"field": "requestTime.time"
}
},
"complexTime": {
"bucket_script": {
"buckets_path": {
"requestTime": "requestTime",
"reponseTime": "reponseTime"
},
"script": "params.requestTime / params.reponseTime"
}
}
}
}
}
}
复杂的指标聚合结果计算后再根据计算结果进行排序如下
想当然写法,其实不行,会报以下错误
The provided aggregation [complexTime] either does not exist, or is a pipeline aggregation and cannot be used to sort the buckets.
{
"size": 0,
"aggs": {
"api": {
"terms": {
"field": "api.id",
"order": {
"complexTime": "asc"
},
"size": 10
},
"aggs": {
"reponseTime": {
"sum": {
"field": "response.time"
}
},
"requestTime": {
"sum": {
"field": "requestTime.time"
}
},
"complexTime": {
"bucket_script": {
"buckets_path": {
"requestTime": "requestTime",
"reponseTime": "reponseTime"
},
"script": "params.requestTime / params.reponseTime"
}
}
}
}
}
}
参考以下页面得到,解决方案
https://github.com/elastic/elasticsearch/issues/8486
https://github.com/elastic/elasticsearch/issues/32153
{
"size": 0,
"aggs": {
"api": {
"terms": {
"field": "api.id"
},
"aggs": {
"reponseTime": {
"sum": {
"field": "response.time"
}
},
"requestTime": {
"sum": {
"field": "requestTime.time"
}
},
"complexTime": {
"bucket_script": {
"buckets_path": {
"requestTime": "requestTime",
"reponseTime": "reponseTime"
},
"script": "params.requestTime / params.reponseTime"
}
},
"sort": {
"bucket_sort": {
"sort": [
{
"complexTime": {
"order": "asc"
},
"requestTime.total": {
"order": "asc"
}
}
],
"size": 10
}
}
}
}
}
}

浙公网安备 33010602011771号