elasticsearch - Elasticsearch 按术语聚合过滤
问题描述
我正在收集一个测试运行时执行,所以我有一个包含这些字段的索引:
testName
: 测试名称。有多个测试。testDurationSeconds
: 测试运行的时间,以秒为单位。buildNumber
:例如Jenkins工作编号。
现在我想计算, per的平均值。但前提是测试运行在最后。testDurationSeconds
testName
buildNumber
(为简单起见,假设我有最后一个buildNumber
。)
我的聚合现在看起来像这样:
"aggs": {
"byTestName": {
"terms": {
"field": "testName.keyword"
},
"aggs": {
"byBuildNumber": {
"terms": {
"field": "buildNumber"
},
"aggs": {
"avg": {
"avg": {
"field": "testDurationSeconds"
}
}
}
}
}
}
}
只有在特定的 s 上运行时,我如何过滤它以最终获得所有saverage
的testName>testDurationSeconds
buildNumber
testName
buildNumber
s ?
(最坏的情况,我接受testNames
通过不同的聚合来获取满足上述要求的列表,并以应用方式比较这些列表)。
映射:
{
"mapping": {
"properties": {
"buildNumber": {
"type": "integer"
},
"testDurationSeconds": {
"type": "long"
},
"testName": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
}
例子:
[
{
"testName": "Test1",
"testDurationSeconds": 10,
"buildNumber": 1
},
{
"testName": "Test1",
"testDurationSeconds": 20,
"buildNumber": 2
},
{
"testClass": "Test1",
"testDurationSeconds": 30,
"buildNumber": 3
},
{
"testClass": "Test2",
"testDurationSeconds": 10,
"buildNumber": 1
},
{
"testClass": "Test2",
"testDurationSeconds": 20,
"buildNumber": 2
}
]
假设最后一个buildNumber
是3
. 我想获得Test1>testDurationSeconds
(应该是20
)的平均值,但由于Test2
在最后一次运行中没有运行,我想忽略它。
最佳结果将Test1
仅返回平均值,但另一个结果可以返回在另一个聚合中的最后一次构建 ( 3
) 中运行的测试列表,以便使用该列表获取应用程序级别中唯一相关的平均值。