【Elasticsearch】cumulative_cardinality

1.定义与用途

`cumulative_cardinality`是一种父级管道聚合(Parent Pipeline Aggregation),用于在父级直方图(`histogram`)或日期直方图(`date_histogram`)聚合中计算累计基数。它主要用于统计在某个时间范围内“新增”的唯一项目数量,例如每天访问网站的新访客数量。

2.工作原理

`cumulative_cardinality`聚合会计算每个时间桶中的唯一值数量,并将这些值累计起来。它依赖于父级直方图中的某个基数聚合(`cardinality`)结果。具体来说,它会从第一个时间桶开始,逐个累加每个桶中的唯一值数量,从而得到每个时间点的累计唯一值数量。

3.参数

• `buckets_path`:必需参数,指定要计算累计基数的基数聚合路径。

• `format`:可选参数,定义输出值的格式。如果指定,格式化的值将返回在聚合的`value_as_string`属性中。

4.应用场景

`cumulative_cardinality`聚合特别适用于以下场景:

• 统计新增用户:例如,每天访问网站的新访客数量。

• 分析趋势:通过累计唯一值的变化,可以分析数据的增长趋势。

5.示例

假设我们有一个索引`user_hits`,其中记录了每次用户访问的日期(`timestamp`字段)和用户ID(`user_id`字段)。我们希望计算每天新增的唯一用户数量。

查询示例:

```json

GET /user_hits/_search

{

  "size": 0,

  "aggs": {

    "users_per_day": {

      "date_histogram": {

        "field": "timestamp",

        "calendar_interval": "day"

      },

      "aggs": {

        "distinct_users": {

          "cardinality": {

            "field": "user_id"

          }

        },

        "total_new_users": {

          "cumulative_cardinality": {

            "buckets_path": "distinct_users"

          }

        }

      }

    }

  }

}

```

 

 

响应结果:

 

```json

{

   "took": 11,

   "timed_out": false,

   "_shards": ...,

  &n

你提供的代码是从环境变量中读取 Elasticsearch 相关的配置信息,包括基础 URL、密码和用户名。这是在 Python 应用(如使用 `elasticsearch-py` 客户端)中安全管理敏感配置的一种推荐做法,避免将凭据硬编码在源码中。 下面是这段代码的完整解释以及一个实际使用的示例: ```python import os from elasticsearch import Elasticsearch # 从环境变量中读取配置 ELASTICSEARCH_BASE_URL = os.getenv('ELASTICSEARCH_BASE_URL') ELASTICSEARCH_PASSWORD = os.getenv('ELASTICSEARCH_PASSWORD') ELASTICSEARCH_NAME = os.getenv('ELASTICSEARCH_NAME') # 可选:添加错误处理,确保必要配置存在 if not all([ELASTICSEARCH_BASE_URL, ELASTICSEARCH_NAME, ELASTICSEARCH_PASSWORD]): raise ValueError("缺少必要的Elasticsearch环境变量,请检查 ELASTICSEARCH_BASE_URL、ELASTICSEARCH_NAME 和 ELASTICSEARCH_PASSWORD") # 创建Elasticsearch客户端 es = Elasticsearch( hosts=[ELASTICSEARCH_BASE_URL], basic_auth=(ELASTICSEARCH_NAME, ELASTICSEARCH_PASSWORD), verify_certs=False # 生产环境建议设为True并配置证书路径 ) # 测试连接 try: info = es.info() print("成功连接到Elasticsearch:", info["cluster_name"]) except Exception as e: print("无法连接到Elasticsearch:", str(e)) ``` ### 解释: - `os.getenv(key)`:安全地从环境变量中获取值,如果变量未设置则返回 `None`。 - 使用 `basic_auth` 参数传递用户名和密码,适用于启用了安全认证的 Elasticsearch 实例(如 Elastic Stack 的安全功能)。 - `verify_certs=False` 在开发时方便调试,但**生产环境中应启用证书验证**以防止中间人攻击。 - 添加了基本的空值检查,防止因遗漏环境变量导致运行时错误。 --- ### 如何设置环境变量(以 Linux/macOS 为例): ```bash export ELASTICSEARCH_BASE_URL="https://your-elasticsearch-domain:9200" export ELASTICSEARCH_NAME="elastic" export ELASTICSEARCH_PASSWORD="your-strong-password" ``` Windows(CMD): ```cmd set ELASTICSEARCH_BASE_URL=https://your-elasticsearch-domain:9200 set ELASTICSEARCH_NAME=elastic set ELASTICSEARCH_PASSWORD=your-strong-password ``` 或者使用 `.env` 文件配合 `python-dotenv` 更方便: ```bash # .env 文件 ELASTICSEARCH_BASE_URL=https://es-cluster.example.com:9200 ELASTICSEARCH_NAME=elastic ELASTICSEARCH_PASSWORD=secret123 ``` 然后安装并加载: ```bash pip install python-dotenv ``` 修改代码开头: ```python from dotenv import load_dotenv load_dotenv() # 加载 .env 文件中的变量 ``` 这样可以在本地开发时自动加载配置,而部署时使用系统环境变量。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值