首页 > 代码库 > 【ES】学习9-聚合2

【ES】学习9-聚合2

按时间统计:date_histogram

GET /cars/transactions/_search
{
   "size" : 0,
   "aggs": {
      "sales": {
         "date_histogram": {
            "field": "sold",
            "interval": "month", 
            "format": "yyyy-MM-dd" 
         }
      }
   }
}

注意,这种写法在数字字段没有问题,但是在文本字段使用之前必须先把对应字段的fielddata设为true才可以。否则会报错:

"caused_by" : {
      "type" : "illegal_argument_exception",
      "reason" : "Fielddata is disabled on text fields by default. Set fielddata=http://www.mamicode.com/true on [name] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory."
    }

注意,设置了fielddata会消耗大量内存。

 

返回空buckets:设置参数 min_doc_count

限制返回时间范围:设置参数 extended_bounds

GET /cars/transactions/_search
{
   "size" : 0,
   "aggs": {
      "sales": {
         "date_histogram": {
            "field": "sold",
            "interval": "month",
            "format": "yyyy-MM-dd",
            "min_doc_count" : 0, 
            "extended_bounds" : { 
                "min" : "2014-01-01",
                "max" : "2014-12-31"
            }
         }
      }
   }
}

 

扩展例子:

GET /cars/transactions/_search
{
   "size" : 0,
   "aggs": {
      "sales": {
         "date_histogram": {
            "field": "sold",
            "interval": "quarter", 
            "format": "yyyy-MM-dd",
            "min_doc_count" : 0,
            "extended_bounds" : {
                "min" : "2014-01-01",
                "max" : "2014-12-31"
            }
         },
         "aggs": {
            "per_make_sum": {
               "terms": {
                  "field": "make"
               },
               "aggs": {
                  "sum_price": {
                     "sum": { "field": "price" } 
                  }
               }
            },
            "total_sum": {
               "sum": { "field": "price" } 
            }
         }
      }
   }
}

分析一下上面的例子:

先是一个聚合,名为sales,类型是date_histogram,会根据时间生成桶

再看sales桶里,嵌套了一个聚合,包括per_make_sum和total_sum,

      total_sum:用到了sum,这是一个指标,不会产生新的桶,会生成数值。

      per_make_sum:用到了terms,会根据make字段划分子桶

                在per_make_sum桶中,嵌套了sum_price聚合,也是一个sum指标,不会产生新桶。

 

上面的层级结构表示了桶的嵌套关系。关键在于区分哪些是桶,哪些是指标。

 

【ES】学习9-聚合2