我一直在尝试在elasticsearch中使用日期直方图聚合,它将日期作为纪元或yy-mm-dd-mm-ss格式返回.但我想要的是每周工作日的文件数,如星期一,星期二等.有什么方法可以做到这一点吗?
我可能会遗漏一些东西,但是,这不是比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)
即使这对你没有帮助,但希望其他人能够找到它并从中受益.
您需要采取不同的方法。使用脚本,您可以将日期时间转换为工作日。在此值上,如果您应用术语聚合,它应该可以正常工作。
将日期时间值转换为工作日的脚本
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)
您还可以在此处找到更多有关在聚合中使用脚本的示例。
| 归档时间: |
|
| 查看次数: |
4451 次 |
| 最近记录: |