一尘不染

按星期几和小时数的Elasticsearch聚合

elasticsearch

我有以下类型的文件:

[{"msg":"hello", date: "some-date"},{"msg":"hi!", date: "some-date"}, ...

我想按星期几计算文件数。例如,x消息在星期一发送,y消息在星期二发送,依此类推。

我已经使用date_histogram进行汇总,但是它会按日向我返回文档。它确实返回了当天,但是说“ 22周三”和“ 29周三”作为单独的汇总文档返回。

这在某种程度上与Elasticsearch有关-按星期和小时的天分组,但是该问题没有答案,因此我将其重新发布。根据那里的建议,它要求我对key_as_string进行术语聚合,但是我需要为每个对象添加doc_count而不是仅对术语进行计数。我也不知道如何在嵌套聚合中使用key_as_string。

这是我尝试过的:

"aggs" : {
                "posts_over_days" : {
                    "date_histogram" : { 
                        "field" : "created_time", 
                        "interval": "day",
                        "format": "E" 
                    }
                }

阅读 455

收藏
2020-06-22

共1个答案

一尘不染

在该线程中已经解决了同类问题。

为使解决方案适应您的问题,我们需要编写一个脚本以将日期转换为一天中的小时和一周中的某天:

Date date = new Date(doc['created_time'].value) ; 
java.text.SimpleDateFormat format = new java.text.SimpleDateFormat('EEE, HH');
format.format(date)

并在查询中使用它:

{
    "aggs": {
        "perWeekDay": {
            "terms": {
                "script": "Date date = new Date(doc['created_time'].value) ;java.text.SimpleDateFormat format = new java.text.SimpleDateFormat('EEE, HH');format.format(date)"
            }
        }
    }
}
2020-06-22