我们正尝试使用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 percentile
为2.2
秒
我们使用以下查询来获得百分位数。
GET /hist/t/_search
{
"aggs": {
"avgs": {
"percentiles": {
"field": "avg"
}
}
}
}
我如何在弹性搜索中做到这一点?
答案 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"
}
}
}
}
}
}