需求是这样的,数据是请求接口的日志,请求一次会有两个记录,这两个记录的actionId字段值一样,现在想查询某个接口的耗时,也就是响应日志的timeStamp-请求日志的timeStamp,最后用这个耗时排序,也就是先分组再查询某个字段的最大值和最小值的差值,再用这个差值排序,现在的问题只差最后一步排序不会写,下面的语句加了 "order": {"useTime": "desc"}会报错:Invalid aggregator order path [useTime]. Unknown aggregation [useTime]。
GET /索引名/_search
{
"query": {
"bool": {
"must": [
{
"range": {
"timeStamp": {
"gte": "2024-08-18T00:00:00+08:00",
"lte": "2024-08-19T00:00:00+08:00"
}
}
},
{
"match": {
"actionPath.keyword": "接口地址"
}
}
]
}
},
"size": 0,
"aggs": {
"actionIdGroup": {
"terms": {
"field": "actionId.keyword",
"size": 20,
"order": {
"useTime": "desc"
}
},
"aggs": {
"maxTimeStamp": {
"max": {
"field": "timeStamp"
}
},
"minTimeStamp": {
"min": {
"field": "timeStamp"
}
},
"useTime": {
"bucket_script": {
"buckets_path": {
"tmp1": "maxTimeStamp",
"tmp2": "minTimeStamp"
},
"script": {
"source": "params.tmp1-params.tmp2"
}
}
}
}
}
}
}
问chatgpt, 它说这样子做.
{
"aggs": {
"sort_by_time_diff": {
"bucket_sort": {
"sort": {}
}
}
}
}
来自AI:
根据您提供的查询语句和需求,您想按某个接口的耗时(即响应日志的timeStamp减去请求日志的timeStamp)进行排序。然而,您遇到了一个错误,指出未知的聚合名称[useTime]。
这个错误是由于您在"order"部分中引用了一个未定义的聚合名称"useTime"。您定义的"bucket_script"聚合创建了一个名为"useTime"的新聚合,但您在"order"部分中引用它时可能出错了。
要按耗时进行排序,您可以尝试以下修改: