How to show day names,using date-histogram aggregation in elascticsearch

匿名 (未验证) 提交于 2019-12-03 01:57:01

问题:

I have been trying to use date histogram aggregation in elasticsearch and it returns the date as epoch or in yy-mm-dd-mm-ss format. But what I want is to get document count per week day like monday , tuesday etc. Is there any way in which I can do that?

回答1:

You need to go for a different approach. Using scripts , you can convert date time into week day. On this value if you apply terms aggregation , it should work fine.

Script to convert date time value into weekday

Date date = new Date(doc['created_at'].value) ;  java.text.SimpleDateFormat format = new java.text.SimpleDateFormat('EEE'); format.format(date)

Query to get the values

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

You can also find some more examples on using scripting in aggregations here.



回答2:

I may be missing something, but, isn't the answer simpler than Vineeth's answer?

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

This is nice, as it'll also include any hours with zero results, and, it'll extend the results to cover the entire 24 hour period (due to the extended_bounds).

You can use 'getDayOfWeek', 'getHourOfDay', ... (see 'Joda time' for more).

This is great for hours, but for days / months it'll give you an number rather than the month name. To work around, you can get the timeslot as a string - but, this'll won't work with the extended bounds approach, so you may have empty results (i.e. [Mon, Tues, Fri, Sun]).

In-case you want that, it is here:

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

Even if this doesn't help you, hopefully someone else will find it and benefit from it.



回答3:

For ES5 using painless, this works:

"aggs": {     "dayOfWeek": {         "terms": {             "script": {                 "inline": "doc['date_utc'].date.dayOfWeek",                 "lang": "painless"             }         }     } }


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!