如何显示日期名称,在弹性搜索中使用日期直方图聚合

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