如何在elascticsearch中使用日期直方图聚合来显示日期名称

Sim*_*imi 6 elasticsearch

我一直在尝试在elasticsearch中使用日期直方图聚合,它将日期作为纪元或yy-mm-dd-mm-ss格式返回.但我想要的是每周工作日的文件数,如星期一,星期二等.有什么方法可以做到这一点吗?

Ric*_*chS 8

我可能会遗漏一些东西,但是,这不是比Vineeth的答案更简单的答案吗?

"aggregations": {
    "timeslice": {
        "histogram": {
            "script": "doc['timestamp'].date.getHourOfDay()",
            "interval": 1,
            "min_doc_count": 0,
            "extended_bounds": {
                "min": 0,
                "max": 23
            },
            "order": {
                "_key": "desc"
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

这很好,因为它还包括零结果的任何小时,并且它会将结果扩展到覆盖整个24小时的时间段(由于extended_bounds).

您可以使用'getDayOfWeek','getHourOfDay',...(有关详情,请参阅'Joda time').

这几个小时很棒,但是几天/几个月它会给你一个数字而不是月份名称.要解决此问题,您可以将时间段作为字符串 - 但是,这将不适用于扩展边界方法,因此您可能有空结果(即[Mon,Tues,Fri,Sun]).

如果你想要它,它在这里:

"aggregations": {
    "dayOfWeek": {
        "terms": {
            "script": "doc['timestamp'].date.dayOfWeek().getAsText()",
            "order": {
                "_term": "asc"
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

即使这对你没有帮助,但希望其他人能够找到它并从中受益.

  • 这对我有用,但我不得不在脚本中使用这种格式:``"script":"doc ['timestamp'].date.dayOfWeek"`注意缺少的括号. (3认同)
  • 这很好用。Elastic 6.6 用于获取一天中的小时的新语法是:`doc['timestamp'].value.getHour()`。Elastic 已经知道 `timestamp` 是一个日期,所以你可以使用 `.value` 代替 `date` 函数。 (2认同)

Vin*_*han 4

您需要采取不同的方法。使用脚本,您可以将日期时间转换为工作日。在此值上,如果您应用术语聚合,它应该可以正常工作。

将日期时间值转换为工作日的脚本

Date date = new Date(doc['created_at'].value) ; 
java.text.SimpleDateFormat format = new java.text.SimpleDateFormat('EEE');
format.format(date)
Run Code Online (Sandbox Code Playgroud)

查询以获取值

{
  "aggs": {
    "perWeekDay": {
      "terms": {
        "script": "Date date = new Date(doc['created_at'].value) ; java.text.SimpleDateFormat format = new java.text.SimpleDateFormat('EEE');format.format(date)"
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

您还可以在此处找到更多有关在聚合中使用脚本的示例。