Elasticsearch-按工作日和小时进行的嵌套聚合

时间:2019-11-19 12:34:16

标签: elasticsearch elasticsearch-aggregation

在我们的索引(AWS Elasticsearch,7.1)中,我的文档具有以下简化的结构:

{
  "weekday" : {
     "type" : "long"
   },
  "start_datetime" : {
     "type" : "date",
     "format" : "yyyy/MM/dd'T'HH:mm:ss"
  },
  "count" : {
    "type" : "long"
   }
}

为了进行分析,我想首先在工作日之前进行汇总,然后再进行小时汇总,最后对最终存储桶中所有文档的计数字段进行汇总。我尝试了以下方法:

 "aggs": {
    "WEEKDAY": {
      "terms": {
        "field": "weekday"
      },
      "aggs": {
        "HOUR": {
         "date_histogram": {
            "field": "start_datetime",
            "interval": "hour", 
            "format": "HH:mm:ss"
         },
         "aggs": {
          "SUM": {
            "sum": {
              "field": "count"
            }
          }
        }
      }
    }
  }
}

Elasticsearch返回7个WEEKDAY存储桶,如果在一个星期的日期时间范围内运行它,则工作正常(没有重复的工作日)。如果运行时间超过7天(例如一个月),它还会返回7个WEEKDAY存储桶,但这些存储桶不仅包含该工作日特定文件的小时数,还包含其他所有工作日。有什么建议吗?

1 个答案:

答案 0 :(得分:0)

我通过使用简单的脚本解决了它。如果有人需要为其项目提供解决方案:

"aggs": {
   "WEEKDAY": {
      "terms": {
         "field": "weekday",
         "order" : { "_key" : "asc" }
      },
      "aggs": {
         "HOUR": {
            "histogram": {
               "script": "doc['start_datetime'].value.getHourOfDay()",
               "interval": 1,
               "min_doc_count": 0,
               "extended_bounds": {
                  "min": 0,
                  "max": 23
                },
                "order": {
                    "_key": "asc"
                }
              },
             "aggs": {
                "SUM": {
                  "sum": {
                     "field": "count"
                   }
                 }
               }
             }
           }
         }
       }