elasticsearch - 如何在 ElasticSearch 中获取带有计数的直方图

标签 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"
      }
    }
  }
}

如何在 Elasticsearch 中执行此操作?

最佳答案

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

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

关于elasticsearch - 如何在 ElasticSearch 中获取带有计数的直方图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40386933/

相关文章:

elasticsearch - Elasticsearch查询以一个月的最新日期形式获得不同的结果

sorting - 查询为空时如何对结果排序?

elasticsearch - 如何在Elasticsearch中按小时无天分组文档?

datetime - 插入日期为epoch_seconds,输出为格式化日期

python - Elasticsearch python 库,如果存在则更新

ruby-on-rails - 加载夹具后运行代码

elasticsearch - Elasticsearch-如何为搜索和索引指定相同的分析器

c# - ElasticSearch不会通过带有动态类的嵌套调用返回数据

elasticsearch - 如何通过 <field> 获取最旧的条目

java - 将Rescore JSON查询转换为Java