Bucket Aggregation——Date Range Aggregation

本文详细介绍Elasticsearch中DateRangeAggregation的功能和使用方法,包括如何基于日期数学表达式进行范围划分,处理缺失值,调整时区,以及自定义响应格式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章翻译基于es6.5版本,后续会慢慢一部分,一部分的翻译文档出来。当然,后续会慢慢整理出一本翻译版本,并且有实际java api demo的例子用法和场景。喜欢的就关注看看吧!

Date Range Aggregation
用于日期值的范围聚合。此聚合与普通范围聚合的主要区别在于,from和to值可以用日期数学表达式表示,还可以指定日期格式,以便返回from和to响应字段.
注意,在每个范围聚合都是包含from值,排除to值。
例如:

POST /sales/_search?size=0
{
    "aggs": {
        "range": {
            "date_range": {
                "field": "date",
                "format": "MM-yyy",
                "ranges": [
                    { "to": "now-10M/M" }, //1
                    { "from": "now-10M/M" } //2
                ]
            }
        }
    }
}

1 , < 现在减去10个月,四舍五入到月初。
2, >= 现在减去10个月,四舍五入到月初.

在上面的示例中,我们创建了两个范围存储桶,第一个将“存储”所有早于10个月之前的文档,第二个将“存储”所有自10个月前开始的文档

Response:
{
    ...
    "aggregations": {
        "range": {
            "buckets": [
                {
                    "to": 1.4436576E12,
                    "to_as_string": "10-2015",
                    "doc_count": 7,
                    "key": "*-10-2015"
                },
                {
                    "from": 1.4436576E12,
                    "from_as_string": "10-2015",
                    "doc_count": 0,
                    "key": "10-2015-*"
                }
            ]
        }
    }
}

缺少值(Missing Values)
The missing paramete定义了如何处理缺失值的文档。默认情况下,它们将被忽略,但也可以将它们视为有值。这是通过添加一组fieldname:值映射来指定每个字段的默认值来实现的。

POST /sales/_search?size=0
{
   "aggs": {
       "range": {
           "date_range": {
               "field": "date",
               "missing": "1976/11/30",
               "ranges": [
                  {
                    "key": "Older",
                    "to": "2016/02/01"
                  }, //1
                  {
                    "key": "Newer",
                    "from": "2016/02/01",
                    "to" : "now/d"
                  }
              ]
          }
      }
   }
}

1,在date字段中没有值的文档将被添加到“旧”桶中,就好像它们的日期值是“1899-12-31”一样

Time zone in date range aggregations
通过指定time_zone参数,可以将日期从另一个时区转换为UTC 。
时区可以指定为ISO 8601 UTC偏移量(例如+01:00或-08:00),也可以指定为http://www.joda.org/joda-time/timezones.html [时区ID]之一]来自TZ数据库。
该time_zone参数也适用于日期数学表达式中的舍入。例如,要在CET时区中舍入到一天的开头,您可以执行以下操作:

POST /sales/_search?size=0
{
   "aggs": {
       "range": {
           "date_range": {
               "field": "date",
               "time_zone": "CET",
               "ranges": [
                  { "to": "2016/02/01" },//1
                  { "from": "2016/02/01", "to" : "now/d" //2},
                  { "from": "now/d" }
              ]
          }
      }
   }
}

1,此日期将转换为2016-02-15T00:00:00.000+01:00。
2, now/d 将在CET时区内四舍五入到当天的开头。

Keyed Response
设置keyed 标志为true,将会把唯一的key 和 每个桶关联起来。返回范围的散列而不是数组:

POST /sales/_search?size=0
{
    "aggs": {
        "range": {
            "date_range": {
                "field": "date",
                "format": "MM-yyy",
                "ranges": [
                    { "to": "now-10M/M" },
                    { "from": "now-10M/M" }
                ],
                "keyed": true
            }
        }
    }
}

响应:

{
    ...
    "aggregations": {
        "range": {
            "buckets": {
                "*-10-2015": {   //将响应返回的key,作为桶的key
                    "to": 1.4436576E12,
                    "to_as_string": "10-2015",
                    "doc_count": 7
                },
                "10-2015-*": {
                    "from": 1.4436576E12,
                    "from_as_string": "10-2015",
                    "doc_count": 0
                }
            }
        }
    }
}

每个桶的key还支持自定义:

POST /sales/_search?size=0
{
    "aggs": {
        "range": {
            "date_range": {
                "field": "date",
                "format": "MM-yyy",
                "ranges": [
                    { "from": "01-2015",  "to": "03-2015", "key": "quarter_01" }, //自定义的key
                    { "from": "03-2015", "to": "06-2015", "key": "quarter_02" }
                ],
                "keyed": true
            }
        }
    }
}

Response:

{
    ...
    "aggregations": {
        "range": {
            "buckets": {
                "quarter_01": { //这里是自定义的key
                    "from": 1.4200704E12,
                    "from_as_string": "01-2015",
                    "to": 1.425168E12,
                    "to_as_string": "03-2015",
                    "doc_count": 5
                },
                "quarter_02": {
                    "from": 1.425168E12,
                    "from_as_string": "03-2015",
                    "to": 1.4331168E12,
                    "to_as_string": "06-2015",
                    "doc_count": 2
                }
            }
        }
    }
}
要获取聚合结果,你可以使用以下步骤: 1. 通过`search.getAggregations()`方法获取聚合结果对象`Aggregations`。 2. 使用`asList()`方法将聚合结果转换为一个`List<Aggregation>`对象,其中每个元素代表一个聚合。 3. 根据你之前设置的聚合名字,使用`get()`方法获取特定的聚合对象。 根据你的代码示例,假设你的聚合名字是"BrandAGG",你可以按照以下方式获取该聚合对象: ```java Aggregations aggregations = search.getAggregations(); List<Aggregation> list = aggregations.asList(); for (Aggregation aggregation : list) { if (aggregation.getName().equals("BrandAGG")) { // 找到了指定的聚合 Terms termsAggregation = (Terms) aggregation; // 获取聚合桶 List<? extends Terms.Bucket> buckets = termsAggregation.getBuckets(); // 遍历聚合桶 for (Terms.Bucket bucket : buckets) { String brand = bucket.getKeyAsString(); long docCount = bucket.getDocCount(); // 处理每个聚合桶的结果 System.out.println("品牌:" + brand + ",文档数量:" + docCount); } } } ``` 上述代码将遍历所有的聚合结果,找到名为"BrandAGG"的聚合,并获取该聚合的桶列表。然后,你可以进一步处理每个聚合桶的结果,例如获取品牌名和对应的文档数量。 请注意,根据你的需求,你可能需要对聚合结果进行类型转换。在上述示例中,假设你的聚合类型是`Terms`聚合,因此我们将其转换为`Terms`对象。如果你的聚合类型是其他类型(如`DateHistogram`、`Range`等),则需要进行相应的类型转换。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值