首页 > 解决方案 > Elasticsearch 按术语聚合过滤

问题描述

我正在收集一个测试运行时执行,所以我有一个包含这些字段的索引:

现在我想计算, per的平均值但前提是测试运行在最后testDurationSecondstestNamebuildNumber

(为简单起见,假设我有最后一个buildNumber。)

我的聚合现在看起来像这样:

"aggs": {
    "byTestName": {
      "terms": {
        "field": "testName.keyword"
      },
      "aggs": {
        "byBuildNumber": {
          "terms": {
            "field": "buildNumber"
          },
          "aggs": {
            "avg": {
              "avg": {
                "field": "testDurationSeconds"
              }
            }
          }
        }
      }
    }
  }

只有在特定的 s 上运行时,我如何过滤它以最终获得所有saveragetestName>testDurationSecondsbuildNumbertestNamebuildNumbers ?

(最坏的情况,我接受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
    }
]

假设最后一个buildNumber3. 我想获得Test1>testDurationSeconds(应该是20)的平均值,但由于Test2在最后一次运行中没有运行,我想忽略它。

最佳结果将Test1仅返回平均值,但另一个结果可以返回在另一个聚合中的最后一次构建 ( 3) 中运行的测试列表,以便使用该列表获取应用程序级别中唯一相关的平均值。

标签: elasticsearchelasticsearch-aggregation

解决方案


推荐阅读