如何使用Elasticsearch进行年度汇总?

nas*_*sto 5 elasticsearch

假设我在文档上有一个日期字段,我知道使用date_histogram聚合可以按天,月,年等获得文档计数。

我想要做的是获取给定年份中一月,二月,三月等的平均文档数。在给定的几周内,星期一,星期二,星期三等也是如此。是否有一种方法可以使日期字段具有相同的值,或者用Elasticsearch做到这一点的最佳方法是什么?


假设我们有三年多的订单:

  • 2012年-1月(10个订单),2月(5个订单),3月(7个订单),4月(11个订单)等
  • 2013年-1月(13个订单),2月(7个订单),3月(12个订单),4月(15个订单)等
  • 2014年-1月(10个订单),2月(7个订单),3月(6个订单),4月(13个订单)等

我想要的是给定年份中每个月的平均值,因此输出将是:

1月(10 + 13 + 10/3 = 11个订单),2月(6.33个订单),3月(8.33个订单),4月(13个订单)等

最好将其推广N年(或N 1月等),以便我们搜索任何日期范围。

Ric*_*chS 4

您可以像这样使用“monthOfYear”:

"aggregations": {
    "timeslice": {
        "histogram": {
            "script": "doc['timestamp'].date.getMonthOfYear()",
            "interval": 1,
            "min_doc_count": 0,
            "extended_bounds": {
                "min": 1,
                "max": 12
            },
            "order": {
                "_key": "desc"
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

扩展的界限将确保您获得每个月的值(即使它为零)。

如果您想要月份名称,您可以在自己的代码中执行此操作,或者执行此操作(结果是您不会获得没有数据的月份的值):

"aggregations": {
    "monthOfYear": {
        "terms": {
            "script": "doc['timestamp'].date.monthOfYear().getAsText()",
            "order": {
                "_term": "asc"
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

获得此信息后,您可以将统计数据聚合嵌套在其中:

"aggregations: {
    "monthOfYear": {
        "terms": {
            ...
        },
        "aggregations": {
            "stats": ...
        }
    }
 }
Run Code Online (Sandbox Code Playgroud)

这个问题现在已经很老了,但是,希望这对某人有帮助。