我有一个简单的聚合,我有一个计时代码文档,如下所示:
{
"task_start": "2020-06-03T21:19:07.908821Z",
"task_end": "2020-06-03T21:27:00.323790Z",
"sub_tasks": [
{
"key": "sub-task1-time-milliseconds",
"value": 3310
},
{
"key": "sub-task2-time-milliseconds",
"value": 2410
},
...
]
}
其中sub_tasks是嵌套的。我想得到的是每个子任务的时间与整个任务时间的中值比率。整个任务时间将是end_time - start_time
。我知道如何分别聚合中值子任务时间和总任务时间。但我想聚合每个文档的比率。
问题是在嵌套聚合中,我只能访问带有嵌套数据的数据,而在反向嵌套聚合中,我只能访问根级别的数据,但不能同时访问这两个数据。我知道有一种方法可以访问copy_to,这样我就可以在嵌套路径中获得任务时间,但我无法修改索引结构,也不希望有额外的存储空间。
下面是我尝试的方法。对于嵌套聚合:
{
"aggs": {
"task_metrics": {
"nested": {
"path": "sub_tasks"
},
"aggs": {
"sub_task_metrics": {
"filter": {
"term": {
"sub_tasks.key": "sub-task1-time-milliseconds"
}
},
"aggs": {
"median_time": {
"percentiles": {
"script": {
"lang": "painless",
"source": """
double task_time = (doc['task_end'].value.millis - doc['task_start'].value.millis);
return doc['sub_tasks.value'].value / task_time;
"""
},
"percents": 50
}
}
}
}
}
}
}
}
但是在那个聚合中,doc['task_start']
和doc['task_end']
只返回零,因为我没有访问它们的权限。为了获得访问权限,我还尝试了添加另一个子聚合的reverse_nested
。这使我获得了对doc['task_start']
和doc['task_end']
的访问权限,但是doc['sub_tasks.value'].value
只返回0
。
我只是感觉这应该是可能的,但是当我阅读管道聚合和其他脚本聚合时,我不相信它们中的任何一个能达到我的目的。非常感谢任何帮助,谢谢!
1条答案
按热度按时间kx7yvsdv1#
这个问题比较棘手--已经讨论过here了。
我认为您必须求助于一些
scripted_metric
和一些方法模拟,因为公开的无痛API是somewhat limited: