首页 新闻 会员 周边 捐助

求教一个ES查询

0
悬赏园豆:5 [待解决问题]

需求是这样的,数据是请求接口的日志,请求一次会有两个记录,这两个记录的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"
}
}
}
}
}
}
}

拖鞋王子的主页 拖鞋王子 | 初学一级 | 园豆:38
提问于:2024-08-19 15:30
< >
分享
所有回答(2)
0

问chatgpt, 它说这样子做.

{
    "aggs": {
        "sort_by_time_diff": {
            "bucket_sort": {
                "sort": {}
            }
        }
    }
}
czd890 | 园豆:14488 (专家六级) | 2024-08-20 13:49
0

来自AI:

根据您提供的查询语句和需求,您想按某个接口的耗时(即响应日志的timeStamp减去请求日志的timeStamp)进行排序。然而,您遇到了一个错误,指出未知的聚合名称[useTime]。
这个错误是由于您在"order"部分中引用了一个未定义的聚合名称"useTime"。您定义的"bucket_script"聚合创建了一个名为"useTime"的新聚合,但您在"order"部分中引用它时可能出错了。
要按耗时进行排序,您可以尝试以下修改:

  1. 正确引用聚合名称:在"order"部分中,将"useTime"改为"useTime.value",以正确引用聚合结果的值。
  2. 显式指定排序类型:根据您的需求,您可能需要显示指定排序类型,例如在"order"部分中添加"type"选项,如下所示:
    Copy to clipboard
    "order": {
    "useTime.value": "desc",
    "_key": "asc"
    }
    这样可以确保按耗时的降序排序,并使用"_key"(即聚合的bucket键)作为升序的第二排序条件。请根据您的需求适当调整排序条件。
    修改后的查询请求:
    Copy to clipboard
    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.value": "desc",
    "_key": "asc"
    }
    },
    "aggs": {
    "maxTimeStamp": {
    "max": {
    "field": "timeStamp"
    }
    },
    "minTimeStamp": {
    "min": {
    "field": "timeStamp"
    }
    },
    "useTime": {
    "bucket_script": {
    "buckets_path": {
    "tmp1": "maxTimeStamp",
    "tmp2": "minTimeStamp"
    },
    "script": {
    "source": "params.tmp1 - params.tmp2"
    }
    }
    }
    }
    }
    }
    }
    这样,您应该能够正确按照耗时进行排序。请根据您的具体需求和数据结构对查询语句进行适当调整。
Technologyforgood | 园豆:7633 (大侠五级) | 2024-08-21 07:45
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册