查询获取平均速度

Query for getting average velocity

我在 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" } }
}

}

由于所有桶的大小都相同,因此您可以使用大小为 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"
                    }
                }
            }
        }
    }
}