我在Elasticsearch中有以下映射:
PUT my_index
{
"mappings": {
"my_entry": {
"_all": {
"enabled": false
},
"properties": {
"RouteId": {
"type":"keyword"
},
"Date": {
"type":"date"
},
"Velocity": {
"type":"double"
}
}
}
}
}
我想知道RouteId
等于1的路线的平均速度。平均速度不应计算为平均值或中位数,因为我可能有以下速度值分布:
Y轴:绝对频率,X轴:速度值范围。
因此,我想将平均速度计算为具有最高频率的值(Y轴的最高值)。例如,在上面的示例中,范围45-50
具有最高频率。因此,平均速度应为(45 + 50)/ 2 = 47.5。
如何使用Elasticsearch的查询语言?
更新
我编写了以下查询,但它并不符合我的要求。平均速度变得偏斜。但是,我想通过计算桶的频率来获得平均速度,如上图所示。
POST my_index/_search
{
"size": 0,
"query": {
"bool": {
"filter": [
{"term": {"RouteId": "2"}}
]
}
},
"aggs" : {
"AvgVelocity" : { "avg" : { "field" : "Velocity" } }
}
}
答案 0 :(得分:1)
由于您的所有存储桶都具有相同的大小,因此您可以使用大小为5的histogram
存储桶聚合和avg
子聚合。然后,您可以通过降低AverageVelocity
聚合的顺序来排序直方图存储桶,而顶部的第一个存储桶将是您要查找的值。
{
"query": {
"bool": {
"filter": [
{"term": {"RouteId": "2"}}
]
}
},
"aggs" : {
"prices" : {
"histogram" : {
"field" : "Velocity",
"interval" : 5,
"order" : { "AvgVelocity" : "desc" }
},
"aggs": {
"AvgVelocity": {
"avg": {
"field": "Velocity"
}
}
}
}
}
}