如何在ElasticSearch中获得带有计数的直方图

时间:2016-11-02 18:12:04

标签: elasticsearch

我们正尝试使用ElasticSearch

Histogram 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 /login运行直方图时,间隔为1 second,我得

 1-2 seconds - 1
 2-3 seconds - 1
 3-4 seconds - 1
 5-6 seconds - 1

但是,我们正在做的是,我们只存储带有计数的平均值(以节省空间而不重复记录)。但实际上,我们希望获得的是

 1-2 seconds - 3
 2-3 seconds - 5
 3-4 seconds - 1
 5-6 seconds - 1

映射我们当前的hist索引

PUT hist/_mapping/t
{
  "properties": {
    "name": {
      "type": "string"
    },
    "avg": {
      "type": "long"
    },
    "count": {
      "type": "long"
    }
  }
}

我们使用以下查询来获得直方图。

GET /hist/t/_search
{
  "aggs": {
    "avgs": {
      "histogram": {
        "field": "avg",
        "interval": 1
      }
    }
  }
}

百分位问题

同样的问题也出现在百分位数上。

1.5, 2.2, 3.1, 6.9 - 75th percentile报告为3.1秒。 1.5, 1.5, 1.5, 2.2, 2.2, 2.2, 2.2, 2.2, 3.1, 6.9 - 真实75th percentile2.2

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

GET /hist/t/_search
{
  "aggs": {
    "avgs": {
      "percentiles": {
        "field": "avg"
      }
    }
  }
}

我如何在弹性搜索中做到这一点?

1 个答案:

答案 0 :(得分:2)

您现在获得的是每个直方图桶的文档计数。您可以在sum字段上添加一个count子聚合,您应该得到您期望的结果。试试这个:

POST /hist/t/_search
{
  "aggs": {
    "avgs": {
      "histogram": {
        "field": "avg",
        "interval": 1
      },
      "aggs": {
        "sum_of_count": {
          "sum": {
            "field": "count"
          }
        },
        "perc_of_count": {
          "percentiles": {
            "field": "count"
          }
        }
      }
    }
  }
}
相关问题