弹性如何在不同的日子汇总小时数

Elastic how to aggregate hour on different days

我想汇总具有不同日期的文档的数据,例如仅在星期四从 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?

您可以使用脚本过滤器

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

通过这些步骤能够按一天中的几个小时汇总您的数据

所以您的文档中有一个日期字段。你不能从那个提取时间。所以你必须在 Kibana 中创建一个自定义字段。

  1. 转到 "Management" 部分
  2. 转到"Index patterns"
  3. 转到"Create index pattern"
  4. 选择你的collection
  5. 转到 "Script fields" 选项卡
  6. 点击"Add scripted field"

现在我们将添加 hour 字段:

  1. 在 "name" 字段中,输入 "hour"。
  2. 设置类型为"number"。
  3. 并在 "script" 字段中输入:doc['myDateField'].date.hourOfDay,其中 myDateField 是包含文档日期的字段。

就是它!您现在可以在“发现”或“可视化”部分找到您的新字段。

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

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

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