如何在Elasticsearch中获取存储桶的最新值?

时间:2015-02-02 14:55:16

标签: elasticsearch

我有一堆只有count字段的文档。

我正在尝试获取按日期汇总的该字段的最新值:

{
  "query": {
    "match_all": {}
  },
  "sort": "_timestamp",
  "aggs": {
    "result": {
      "date_histogram": {
        "field": "_timestamp",
        "interval": "day",
        "min_doc_count": 0
      },
      "aggs": {
        "last_value": {
          "scripted_metric": {

            "params": {
              "_agg": {
                "last_value": 0
              }
            },
            "map_script": "_agg.last_value = doc['count'].value",
            "reduce_script": "return _aggs.last().last_value"
          }
        }
      }
    }
  }
}

但问题是文档属于last_value聚合而未按_timestamp排序,因此我无法保证最后一个值确实是最后一个值。

所以,我的问题:

  1. 执行_timestamp聚合时,是否可以按last_value对数据进行排序?
  2. 有没有更好的方法来获取最后一天聚合的值?

1 个答案:

答案 0 :(得分:0)

看起来可以稍微调整scripted_metric聚合来解决问题的第一部分(按_timestamp排序):

"last_value": {
  "scripted_metric": {
    "params": {
      "_agg": {
        "value": 0,
        "timestamp": 0
      }
    },
    "map_script": "_agg.value = doc['count'].value; _agg.timestamp = doc['_timestamp'].value",
    "reduce_script": "value = 0; timestamp=0; for (a in _aggs) { if(a.timestamp > timestamp){ value = a.value; timestamp = a.timestamp} }; return value;"
  }
}

但我仍然怀疑这是解决这个问题的最佳方式。