我一直在尝试在elasticsearch中使用日期直方图聚合,它将日期作为纪元或yy-mm-dd-mm-ss格式返回。但我想要的是每周工作日的文件数,如星期一,星期二等。有什么方法可以做到这一点吗?
答案 0 :(得分: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"
}
}
}
这很不错,因为它还包括零结果的任何小时,并且它会将结果扩展到整个24小时(由于extended_bounds)。
您可以使用'getDayOfWeek','getHourOfDay',...(有关详情,请参阅'Joda time')。
这个好几个小时,但是几天/几个月它会给你一个数字而不是月份名称。要解决此问题,您可以将时间段作为字符串 - 但,这将不适用于扩展边界方法,因此您可能有空结果(即[Mon,Tues,Fri,太阳])。
如果你想要的话,就在这里:
"aggregations": {
"dayOfWeek": {
"terms": {
"script": "doc['timestamp'].date.dayOfWeek().getAsText()",
"order": {
"_term": "asc"
}
}
}
即使这对您没有帮助,但希望其他人能够找到它并从中受益。
答案 1 :(得分:4)
你需要采取不同的方法。 使用脚本,您可以将日期时间转换为工作日。 在此值上,如果您应用术语聚合,它应该可以正常工作。
将日期时间值转换为工作日的脚本
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中找到更多使用脚本编写的示例。
答案 2 :(得分:2)
对于使用无痛的ES5,这有效:
"aggs": {
"dayOfWeek": {
"terms": {
"script": {
"inline": "doc['date_utc'].date.dayOfWeek",
"lang": "painless"
}
}
}
}