查询获得平均速度

时间:2017-09-24 18:42:12

标签: elasticsearch elasticsearch-5

我在Elasticsearch中有以下映射:

PUT my_index
{
    "mappings": {
      "my_entry": {
      "_all": {
        "enabled": false
      },
        "properties": {
          "RouteId": {
            "type":"keyword"
          },
          "Date": {
            "type":"date"
          },
          "Velocity": {
            "type":"double"
          }
        }
      }
    }
}

我想知道RouteId等于1的路线的平均速度。平均速度不应计算为平均值或中位数,因为我可能有以下速度值分布:

enter image description here

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

}

1 个答案:

答案 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"
                    }
                }
            }
        }
    }
}