【发布时间】:2017-01-27 06:23:18
【问题描述】:
我一直在尝试在 elasticsearch 中使用日期直方图聚合,它以纪元或 yy-mm-dd-mm-ss 格式返回日期。但我想要的是获取每周的文件数量,比如星期一、星期二等。有什么办法可以做到这一点吗?
【问题讨论】:
标签: elasticsearch
我一直在尝试在 elasticsearch 中使用日期直方图聚合,它以纪元或 yy-mm-dd-mm-ss 格式返回日期。但我想要的是获取每周的文件数量,比如星期一、星期二等。有什么办法可以做到这一点吗?
【问题讨论】:
标签: elasticsearch
我可能遗漏了一些东西,但是,答案不是比 Vineeth 的答案简单吗?
"aggregations": {
"timeslice": {
"histogram": {
"script": "doc['timestamp'].date.getHourOfDay()",
"interval": 1,
"min_doc_count": 0,
"extended_bounds": {
"min": 0,
"max": 23
},
"order": {
"_key": "desc"
}
}
}
这很好,因为它还包括结果为零的任何小时,并且它将结果扩展到整个 24 小时期间(由于 extended_bounds)。
您可以使用 'getDayOfWeek'、'getHourOfDay'、...(有关更多信息,请参阅 'Joda time')。
这对于几个小时来说非常有用,但对于几天/几个月,它会给你一个数字而不是月份名称。要解决此问题,您可以将时间段作为字符串获取 - 但是,这不适用于扩展边界方法,因此您可能会得到空结果(即 [Mon, Tues, Fri,太阳])。
如果你想要的话,它就在这里:
"aggregations": {
"dayOfWeek": {
"terms": {
"script": "doc['timestamp'].date.dayOfWeek().getAsText()",
"order": {
"_term": "asc"
}
}
}
即使这对您没有帮助,但希望其他人会发现它并从中受益。
【讨论】:
"script": "doc['timestamp'].date.dayOfWeek" 注意缺少括号。
doc['timestamp'].value.getHour()。 Elastic 已经知道timestamp 是一个日期,因此您可以使用.value 代替date 函数。
您需要采用不同的方法。 使用脚本,您可以将日期时间转换为工作日。 如果您在此值上应用术语聚合,它应该可以正常工作。
将日期时间值转换为工作日的脚本
Date date = new Date(doc['created_at'].value) ;
java.text.SimpleDateFormat format = new java.text.SimpleDateFormat('EEE');
format.format(date)
查询以获取值
{
"aggs": {
"perWeekDay": {
"terms": {
"script": "Date date = new Date(doc['created_at'].value) ; java.text.SimpleDateFormat format = new java.text.SimpleDateFormat('EEE');format.format(date)"
}
}
}
}
您还可以找到更多关于在聚合here 中使用脚本的示例。
【讨论】:
对于使用无痛的 ES5,这是可行的:
"aggs": {
"dayOfWeek": {
"terms": {
"script": {
"inline": "doc['date_utc'].date.dayOfWeek",
"lang": "painless"
}
}
}
}
【讨论】: