如何在ElasticSearch中获得带有计数的百分位数

时间:2016-11-07 13:54:29

标签: elasticsearch

我们正尝试使用ElasticSearch

Percentiles aggregation中生成百分位数

我们正在使用ElasticSearch监控我们的API性能。我们存储的一组示例文档

{"name": "GET /login", "avg":2.2, "count": 5}
{"name": "GET /login", "avg":1.5, "count": 3}
{"name": "GET /login", "avg":6.9, "count": 1}
{"name": "GET /login", "avg":3.1, "count": 1}

哪里

  • count是指在特定时间段内到达我们服务器的GET /login个网络请求数。
  • avg是平均响应时间。

我们使用以下查询来获得百分位数。

GET /hist/t/_search
{
  "aggs": {
    "avg_time_percentile": {
      "percentiles": {
        "field": "avg",
         "percents" : [75, 95, 99] 
      }
    }
  }
}

我们得到以下回复

"avg_time_percentile": {
  "values": {
    "75.0": 3.75,
    "95.0": 5.549999999999999,
    "99.0": 5.909999999999999
  }

然而,我们想要的是:

"avg_time_percentile": {
  "values": {
    "75.0": 2,
    "95.0": 4.349999999999998,
    "99.0": 5.670000000000002
  }

值不正确的原因是,它需要例如2.2只在一条记录中。但是计数是5,应该考虑5次。

我如何在ElasticSearch中完成。

1 个答案:

答案 0 :(得分:1)

您可以使用field而不是使用script,以便将多个字段组合在一起并在这些新值上运行百分位数

POST /hist/t/_search
{
  "aggs": {
    "avg_time_percentile": {
      "percentiles": {
         "script": {
            "inline": "doc.avg.value * doc.count.value"
         },
         "percents" : [75, 95, 99] 
      }
    }
  }
}