如何在弹性搜索中按月分组

时间:2018-08-16 08:08:57

标签: elasticsearch elasticsearch-5 elasticsearch-aggregation elasticsearch-6

我正在使用6.0.0版弹性搜索 对于按月分组,我正在使用日期直方图聚合。 我尝试过的示例:

{  
   "from":0,
   "size":2000,
   "_source":{  
      "includes":[  
         "cost",
         "date"
      ],
      "excludes":[  

      ],
      "aggregations":{  
         "date_hist_agg":{  
            "date_histogram":{  
               "field":"date",
               "interval":"month",
               "format":"M",
               "order":{  
                  "_key":"asc"
               },
               "min_doc_count":1
            },
            "aggregations":{  
               "cost":{  
                  "sum":{  
                     "field":"cost"
                  }
               }
            }
         }
      }
   }
}

因此我多次获得1(一月/一月)。 由于我有2016年1月,2017年1月和2018年1月的数据,因此将返回1月份的3次。但是我只想要一月一次,其中包含一月的所有年份的总和。

1 个答案:

答案 0 :(得分:3)

您可以将date_histogram聚合与从日期中提取月份的脚本一起使用,而不是使用terms聚合。

{
  "from": 0,
  "size": 2000,
  "_source": {"includes": ["cost","date"],"excludes"[]},
  "aggregations": {
    "date_hist_agg": {
      "terms": {
        "script": "doc['date'].date.monthOfYear",
        "order": {
          "_key": "asc"
        },
        "min_doc_count": 1
      },
      "aggregations": {
        "cost": {
          "sum": {
            "field": "cost"
          }
        }
      }
    }
  }
}

请注意,使用脚本并不是最佳选择,如果您知道需要月份信息,则只需使用该信息创建另一个字段,这样就可以在其上使用简单的术语汇总,而不必使用脚本。