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

后端 未结 3 733
生来不讨喜
生来不讨喜 2020-12-09 22:42

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

相关标签:
3条回答
  • 2020-12-09 22:56

    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.

    0 讨论(0)
  • 2020-12-09 23:01

    For ES5 using painless, this works:

    "aggs": {
        "dayOfWeek": {
            "terms": {
                "script": {
                    "inline": "doc['date_utc'].date.dayOfWeek",
                    "lang": "painless"
                }
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-09 23:19

    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.

    0 讨论(0)
提交回复
热议问题