弹性如何汇总不同日期的小时

时间:2018-11-23 10:43:59

标签: elasticsearch aggregation

我想汇总日期不同的文件的数据,例如仅在星期四从12到18的时间。

我的包含聚合的查询如下:

{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "locationid.raw": "HH-44-6"
            }
        },
        {
          "match": {
            "day.keyword": "THURSDAY"
            }
        },
        {
          "range": {
            "dataHour": {
              "from": "12",
              "to": "18",
              "include_lower": true,
              "include_upper": true
            }
          }
        },
        {
          "range": {
            "dataDate": {
              "gte": "2018-11-08 12:00",
              "include_lower": true
            }
          }
        }
      ]
    }
  },
  "aggs" : {
    "contacts" : {
      "date_histogram" : {
        "field" : "dataDate",
        "interval" : "hour"
      },
      "aggs": {
        "seeing_data": {
          "avg": {
            "field": "seeing"
          }
        }
      }
   }
}

响应之所以如此之大,是因为它提供了从“ 2018-11-08 18:00”开始日期到现在的每天和每小时的时间间隔内的汇总数据,而不是只有三个可用天(因为从直到现在只有三个星期四(2018-11-08)。

我如何才能实现仅在12-18小时范围内以及从2018-11-08 12:00开始的星期四范围内的数据聚合?

2 个答案:

答案 0 :(得分:0)

您可以使用脚本过滤器

"script": {
          "script": "doc['@timestamp'].date.dayOfWeek == 2"
        }

答案 1 :(得分:0)

按照以下步骤操作,可以一天中的小时汇总您的数据:

因此您的文档中有一个日期字段。您无法从那几个小时中解脱出来。因此,您必须在Kibana中创建一个自定义字段。

  1. 转到“管理”部分
  2. 转到“索引模式”
  3. 转到“创建索引模式”
  4. 选择您的收藏
  5. 转到“脚本字段”标签
  6. 点击“添加脚本字段”

现在,我们将添加hour字段:

  1. 在“名称”字段中,输入“小时”。
  2. 将类型设置为“数字”。
  3. 然后在“脚本”字段中输入:doc['myDateField'].date.hourOfDay,其中myDateField是带有文档日期的字段。

有!现在,您可以在“发现”或“可视化”部分中找到您的新字段。 New hour field

在这里,我按小时汇总了我收到的数据数量: Aggregation by hour

在此处查找更多类型的聚合(例如date.dayOfWeek):

https://www.elastic.co/guide/en/elasticsearch/reference/master/modules-scripting-expression.html#_date_field_api