ElasticSearch日期直方图聚合考虑文档范围内的日期

时间:2016-08-24 10:57:13

标签: elasticsearch

我在Elasticsearch中处理的文档代表警报。这些警报会激活一段时间,看起来像下一个文档。

{
     "id": 189393,
     "sensorId": "1111111",
     "activationTime": 1462569310000,
     "deactivationTime": 1462785524876,
}

我想知道一天内有活动警报的数量。为此,我想执行日期直方图聚合,该聚合考虑警报处于活动状态的日期,因为当我执行简单的日期直方图聚合时,警报仅被视为活动时间。

例如,我想知道上一次警报的活动天数,然后执行此查询。

{
   "query" : {
      ...
   },
   "aggs": {
    "active_alerts": {
      "date_histogram": {
        "field": "timestamp",
        "interval": "day"
      }
    }
  }
}

返回哪个

"aggregations": {
    "active_alerts": {
        "buckets": [
            {
                "key_as_string": "2016-05-06T00:00:00.000Z",
                "key": 1462492800000,
                "doc_count": 1
            }
        ]
    }
}

我想回来

"aggregations": {
    "active_alerts": {
        "buckets": [
            {
                "key_as_string": "2016-05-06T00:00:00.000Z",
                "key": 1462492800000,
                "doc_count": 1
            },
            {
                "key_as_string": "2016-05-07T00:00:00.000Z",
                "key": 1462579200000,
                "doc_count": 1
            },
            {
                "key_as_string": "2016-05-08T00:00:00.000Z",
                "key": 1462665600000,
                "doc_count": 1
            }
        ]
    }
}

感谢。

2 个答案:

答案 0 :(得分:2)

我认为您只能使用脚本dateHistogram来执行此操作,您可以通过编程方式添加“缺少”天数:

  "aggs": {
    "active_alerts": {
      "date_histogram": {
        "interval": "day",
        "script": "counter=0;combinedDates=[];currentDate=doc.activationTime.date;while(currentDate.isBefore(doc.deactivationTime.date.getMillis())){combinedDates[counter++]=currentDate.getMillis();currentDate.addDays(1)};combinedDates[counter]=doc.deactivationTime.date.getMillis();return combinedDates"
      }
    }
  }

答案 1 :(得分:2)

最后,我通过脚本找到了一个解决方案,创建了一个从激活日期到停用日期发出日期数组的解决方案。

"aggs": { 
    "active_alerts": {
      "date_histogram": {
        "interval": "day",
        "script":  "Date d1 = new Date(doc['activationTime'].value); Date d2 = new Date(doc['deactivationTime'].value); List<Date> dates = new ArrayList<Date>(); (d1..d2).each { date-> dates.add(date.toTimestamp().getTime())}; return dates;"
      }
    }
  }

感谢。