如何显示日期名称,在弹性搜索中使用日期直方图聚合
How to show day names,using date-histogram aggregation in elascticsearch
我一直在尝试在 elasticsearch 中使用日期直方图聚合,它 returns 日期作为纪元或 yy-mm-dd-mm-ss 格式。但我想要的是每周获取文档计数,例如 monday , tuesday 等。有什么方法可以做到这一点?
您需要采用不同的方法。
使用脚本,您可以将日期时间转换为工作日。
在此值上,如果您应用 terms aggregation ,它应该可以正常工作。
将日期时间值转换为工作日的脚本
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。
我可能遗漏了一些东西,但是,答案不是比 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 , 周五, 周日]).
如果你想要它,它就在这里:
"aggregations": {
"dayOfWeek": {
"terms": {
"script": "doc['timestamp'].date.dayOfWeek().getAsText()",
"order": {
"_term": "asc"
}
}
}
即使这对您没有帮助,也希望其他人能找到它并从中受益。
对于使用 painless 的 ES5,这有效:
"aggs": {
"dayOfWeek": {
"terms": {
"script": {
"inline": "doc['date_utc'].date.dayOfWeek",
"lang": "painless"
}
}
}
}
我一直在尝试在 elasticsearch 中使用日期直方图聚合,它 returns 日期作为纪元或 yy-mm-dd-mm-ss 格式。但我想要的是每周获取文档计数,例如 monday , tuesday 等。有什么方法可以做到这一点?
您需要采用不同的方法。 使用脚本,您可以将日期时间转换为工作日。 在此值上,如果您应用 terms aggregation ,它应该可以正常工作。
将日期时间值转换为工作日的脚本
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。
我可能遗漏了一些东西,但是,答案不是比 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 , 周五, 周日]).
如果你想要它,它就在这里:
"aggregations": {
"dayOfWeek": {
"terms": {
"script": "doc['timestamp'].date.dayOfWeek().getAsText()",
"order": {
"_term": "asc"
}
}
}
即使这对您没有帮助,也希望其他人能找到它并从中受益。
对于使用 painless 的 ES5,这有效:
"aggs": {
"dayOfWeek": {
"terms": {
"script": {
"inline": "doc['date_utc'].date.dayOfWeek",
"lang": "painless"
}
}
}
}