【Elasticsearch】date range聚合

embedded/2025/2/7 0:48:28/

 好的,继续之前的示例:

 

 

```json

        ]

      }

    }

  }

}

```

 

 

 

4.3 自定义键(`key`)

通过为每个范围指定一个唯一的键(`key`),可以在结果中更方便地引用每个范围。这在使用`keyed`参数将结果以键值对形式返回时尤其有用。

 

 

```json

POST /sales/_search?size=0

{

  "aggs": {

    "sales_range": {

      "date_range": {

        "field": "date",

        "ranges": [

          { "to": "2024-01-01", "key": "before_2024" },

          { "from": "2024-01-01", "key": "after_2024" }

        ],

        "keyed": true

      }

    }

  }

}

```

 

 

响应示例:

 

 

```json

{

  "aggregations": {

    "sales_range": {

      "buckets": {

        "before_2024": {

          "to": 1640995200000,

          "to_as_string": "2024-01-01",

          "doc_count": 10

        },

        "after_2024": {

          "from": 1640995200000,

          "from_as_string": "2024-01-01",

          "doc_count": 20

        }

      }

    }

  }

}

```

 

 

 

5.常见用例

 

 

5.1 按时间段分析数据

`date_range`聚合非常适合按时间段分析数据,例如按月、按季度或按年分析销售数据、用户活动等。

 

 

示例:按季度分析销售数据

假设你想按季度分析2024年的销售数据:

 

 

```json

POST /sales/_search?size=0

{

  "aggs": {

    "quarterly_sales": {

      "date_range": {

        "field": "date",

        "format": "yyyy-MM-dd",

        "ranges": [

          { "from": "2024-01-01", "to": "2024-04-01", "key": "Q1" },

          { "from": "2024-04-01", "to": "2024-07-01", "key": "Q2" },

          { "from": "2024-07-01", "to": "2024-10-01", "key": "Q3" },

          { "from": "2024-10-01", "to": "2025-01-01", "key": "Q4" }

        ]

      }

    }

  }

}

```

 

 

响应示例:

 

 

```json

{

  "aggregations": {

    "quarterly_sales": {

      "buckets": [

        {

          "key": "Q1",

          "from": 1640995200000,

          "from_as_string": "2024-01-01",

          "to": 1651382400000,

          "to_as_string": "2024-04-01",

          "doc_count": 30

        },

        {

          "key": "Q2",

          "from": 1651382400000,

          "from_as_string": "2024-04-01",

          "to": 1656662400000,

          "to_as_string": "2024-07-01",

          "doc_count": 40

        },

        {

          "key": "Q3",

          "from": 1656662400000,

          "from_as_string": "2024-07-01",

          "to": 1664592000000,

          "to_as_string": "2024-10-01",

          "doc_count": 50

        },

        {

          "key": "Q4",

          "from": 1664592000000,

          "from_as_string": "2024-10-01",

          "to": 1672531200000,

          "to_as_string": "2025-01-01",

          "doc_count": 60

        }

      ]

    }

  }

}

```

 

 

 

5.2 处理时区差异

在处理跨时区的数据时,`time_zone`参数非常有用。例如,如果你的数据存储在 UTC,但需要按用户所在时区进行分析,可以使用`time_zone`参数。

 

 

示例:按美国东部时间(EST)分析日志数据

假设你有一个日志索引`logs`,其中的`timestamp`字段记录了日志的时间戳(以 UTC 存储)。你希望按美国东部时间(EST,UTC-5)分析每天的日志数量:

 

 

```json

POST /logs/_search?size=0

{

  "aggs": {

    "daily_logs": {

      "date_histogram": {

        "field": "timestamp",

        "calendar_interval": "1d",

        "time_zone": "America/New_York"

      }

    }

  }

}

```

 

 

 

5.3 动态日期范围

使用日期数学表达式可以动态定义日期范围。例如,你可以根据当前时间动态生成过去几个月的范围。

 

 

示例:动态生成过去12个月的范围

假设你想分析过去12个月的销售数据:

 

 

```json

POST /sales/_search?size=0

{

  "aggs": {

    "monthly_sales": {

      "date_range": {

        "field": "date",

        "format": "yyyy-MM-dd",

        "ranges": [

          { "from": "now-12M/M", "to": "now-11M/M", "key": "12_months_ago" },

          { "from": "now-11M/M", "to": "now-10M/M", "key": "11_months_ago" },

          { "from": "now-10M/M", "to": "now-9M/M", "key": "10_months_ago" },

          { "from": "now-9M/M", "to": "now-8M/M", "key": "9_months_ago" },

          { "from": "now-8M/M", "to": "now-7M/M", "key": "8_months_ago" },

          { "from": "now-7M/M", "to": "now-6M/M", "key": "7_months_ago" },

          { "from": "now-6M/M", "to": "now-5M/M", "key": "6_months_ago" },

          { "from": "now-5M/M", "to": "now-4M/M", "key": "5_months_ago" },

          { "from": "now-4M/M", "to": "now-3M/M", "key": "4_months_ago" },

          { "from": "now-3M/M", "to": "now-2M/M", "key": "3_months_ago" },

          { "from": "now-2M/M", "to": "now-1M/M", "key": "2_months_ago" },

          { "from": "now-1M/M", "to": "now/M", "key": "1_month_ago" }

        ]

      }

    }

  }

}

```

 

 

 

6.注意事项

 

 

6.1 日期格式

确保`from`和`to`的日期格式与`format`参数一致。如果未指定`format`,Elasticsearch 将使用默认的日期格式。

 

 

6.2 时区转换

在使用`time_zone`参数时,Elasticsearch 会将所有日期字段从 UTC 转换为指定的时区。这可能会影响日期的四舍五入行为。

 

 

6.3 性能优化

虽然`date_range`聚合在 Elasticsearch 中是高效的,但在处理大量数据时,仍需注意性能影响。可以通过以下方式优化性能:

 

• 索引优化:确保日期字段已正确索引。

 

• 查询优化:尽量减少返回的字段数量,使用`size=0`来避免返回文档内容。

 

• 缓存:对于频繁查询的范围,可以考虑使用缓存。

 

 

7.总结

`date_range`聚合是 Elasticsearch 中一个非常强大的工具,用于将日期数据


http://www.ppmy.cn/embedded/160159.html

相关文章

Python 操作列表(元组)

在本章中,你将学习如何遍历 整个列表,这只需要几行代码,无论列表有多长。循环让你能 够对列表的每个元素都采取一个或一系列相同的措施,从而高效地处理任何长度的列表,包括包含数千乃至数百万个元素的列表。 元组 列表…

机器学习10

自定义数据集 使用scikit-learn中svm的包实现svm分类 代码 import numpy as np import matplotlib.pyplot as pltclass1_points np.array([[1.9, 1.2],[1.5, 2.1],[1.9, 0.5],[1.5, 0.9],[0.9, 1.2],[1.1, 1.7],[1.4, 1.1]])class2_points np.array([[3.2, 3.2],[3.7, 2.9],…

无人机测绘技术,为行业开启解决方案新篇章!

随着国土建设的专业化程度不断提升和工作负荷的持续加重,传统测绘方法的局限性也日益显露。它们不仅容易受环境及恶劣气候的制约,还面临着人力资源短缺的挑战,难以适应当前高度专业化的需求。而无人机测绘技术凭借其高度的灵活性和强大的适应…

C#面试常考随笔7:什么是匿名⽅法?还有Lambda表达式?

匿名方法本质上是一种没有显式名称的方法,它可以作为参数传递给需要委托类型的方法,常用于事件处理、回调函数等场景,能够让代码更加简洁和紧凑。 使用场景 事件处理:在处理事件时,不需要为每个事件处理程序单独定义…

Java 中 LinkedList 的底层源码

在 Java 的集合框架中,LinkedList是一个独特且常用的成员。它基于双向链表实现,与数组结构的集合类如ArrayList有着显著差异。深入探究LinkedList的底层源码,有助于我们更好地理解其工作原理和性能特点,以便在实际开发中做出更合适…

某音小程序反编译签名加密静态分析

文章目录 1. 写在前面2. 抓包分析3. 逆向分析 【🏠作者主页】:吴秋霖 【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python…

2502vim,vim文本对象中文文档

介绍 文本块用户(textobj-user)是一个可帮助你毫不费力地创建自己的文本对象的Vim插件. 因为有许多陷阱需要处理,很难创建文本对象.此插件隐藏了此类细节,并提供了声明式定义文本对象的方法. 你可用正则式来定义简单的文本对象,或使用函数来定义复杂的文本对象.如… 文本对…

【数据结构】树哈希

目录 一、树的同构1. 定义2. 具体理解(1) 结点对应(2) 孩子相同(3) 递归性质 3. 示例 二、树哈希1.定义2.哈希过程(1)叶节点哈希(2)非叶节点哈希(3)组合哈希值 3.性质(1) 唯一性 \re…