如何在elasticsearch中使用日期直方图聚合来显示日期名称

时间:2015-03-12 04:57:42

标签: elasticsearch

我一直在尝试在elasticsearch中使用日期直方图聚合,它将日期作为纪元或yy-mm-dd-mm-ss格式返回。但我想要的是每周工作日的文件数,如星期一,星期二等。有什么方法可以做到这一点吗?

3 个答案:

答案 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"
            }
        }
    }
}