【问题标题】:How do I get percentiles with count in ElasticSearch如何在 ElasticSearch 中获得计数的百分位数
【发布时间】:2016-11-08 14:12:47
【问题描述】:

我们正在尝试使用Percentiles aggregationElasticSearch 中生成百分位数

我们正在使用 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 中做到这一点。

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

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

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

    【讨论】:

    • 执行您的代码,将百分位数显示为 ` "aggregations": { "avg_time_percentile": { "values": { "75.0": 7, "95.0": 9.399999999999999, "99.0": 9.879999999999999 } } }` 我想,它乘以avg*count 并将其作为一个值。相反,它应该将 2.2 作为 5 个不同的值。预期的75th 百分位数是 2
    • 然后除而不是乘?
    • 我假设问题是,如果单独添加每条记录,那么百分位输出是不同的。例如从上面的记录来看,如果2.2加5次,1.5加3次,6.9加一次,3.1加一次,那么百分位数不同。以及在不重复记录的情况下是否可能,但有一个计数变量表示应该重复记录的数量。
    • 是的,确实,您已将数据预先聚合到文档中,现在您尝试再次聚合它,但这是行不通的。您应该创建五个文档(每次出现一个),而不是一个计数为 5 的文档,否则您会偏向整个计算。进行这些计算是首先利用 ES 聚合的重点。
    猜你喜欢
    • 2016-04-11
    • 2020-03-19
    • 2015-03-02
    • 1970-01-01
    • 2020-08-08
    • 2013-08-31
    • 2016-04-12
    • 2016-07-12
    • 2015-03-09
    相关资源
    最近更新 更多