ElasticSearch 实战:es的嵌套聚合,下钻分析,聚合分析

Elasticsearch 提供强大的聚合功能,用于对搜索结果进行统计分析。其中,嵌套聚合、下钻分析和聚合分析是三种常见的复杂聚合应用场景。以下是对这三种分析类型的实战演示,使用 curl 命令与 Elasticsearch 服务器交互(假设服务器运行在 http://localhost:9200)。

1. 嵌套聚合(Nested Aggregation)

当文档中包含嵌套对象时,需要使用 nested 聚合来正确处理嵌套字段的聚合。

示例数据:假设有一个 sales 索引,其中每个文档代表一次销售记录,结构如下:

{
  "product": {
    "id": "p1",
    "name": "Product A",
    "tags": ["electronics", "bestseller"]
  },
  "quantity": 5,
  "date": "2022-0½-01"
}

查询目标:统计每个标签下销售的商品数量。

curl -X GET "http://localhost:9200/sales/_search" -H 'Content-Type: application/json' -d'
{
  "size": 0, // 不返回文档,仅聚合结果
  "aggs": {
    "by_tags": {
      "nested": {
        "path": "product.tags"
      },
      "aggs": {
        "tag_values": {
          "terms": {
            "field": "product.tags.keyword"
          }
        }
      }
    }
  }
}'

响应:

{
  "aggregations": {
    "by_tags": {
      "doc_count": ¼,
      "tag_values": {
        "buckets": [
          {
            "key": "electronics",
            "doc_count": 100
          },
          {
            "key": "bestseller",
            "doc_count": ¾
          }
        ]
      }
    }
  }
}

2. 下钻分析(Drill-down Analysis)

下钻分析通常涉及先进行一次聚合,然后基于第一次聚合的结果,在更细粒度的层次上进行第二次聚合。

示例数据:假设有一个 orders 索引,其中每个文档代表一个订单,结构如下:

{
  "customer": {
    "id": "c1",
    "country": "US"
  },
  "order_date": "2022-01-01",
  "total_amount": 100.00
}

查询目标:首先按国家分组,统计各国家的总订单金额,然后对美国的订单进一步按月份细分,统计每个月的订单金额。

curl -X GET "http://localhost:9200/orders/_search" -H 'Content-Type: application/json' -d'
{
  "size": 0,
  "aggs": {
    "by_country": {
      "terms": {
        "field": "customer.country.keyword"
      },
      "aggs": {
        "total_amount": {
          "sum": {
            "field": "total_amount"
          }
        },
        "us_monthly_sales": {
          "filter": { "term": { "customer.country.keyword": "US" } },
          "aggs": {
            "by_month": {
              "date_histogram": {
                "field": "order_date",
                "calendar_interval": "month"
              },
              "aggs": {
                "monthly_amount": {
                  "sum": {
                    "field": "total_amount"
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}'

响应:

{
  "aggregations": {
    "by_country": {
      "buckets": [
        {
          "key": "US",
          "doc_count": 100,
          "total_amount": {
            "value": 50000.00
          },
          "us_monthly_sales": {
            "doc_count": 100,
            "by_month": {
              "buckets": [
                {
                  "key_as_string": "2022-01-01T00:00:00.000Z",
                  "key": 1640995200000,
                  "doc_count": 50,
                  "monthly_amount": {
                    "value": 25000.00
                  }
                },
                {
                  "key_as_string": "2022-02-01T00:00:00.000Z",
                  "key": 1643.jpg28800000,
                  "doc_count": 50,
                  "monthly_amount": {
                    "value": 25000.00
                  }
                }
              ]
            }
          }
        },
        // 其他国家的聚合结果...
      ]
    }
  }
}

3. 聚合分析(General Aggregation Analysis)

聚合分析涵盖了广泛的统计分析场景,包括计数、求和、平均值、分位数、直方图、桶分组等。以下是一个综合示例:

示例数据:假设有一个 logs 索引,记录了网站访问日志,结构如下:

{
  "timestamp": "2022-01-01T00:00:00.000Z",
  "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.3",
  "response_time_ms": 123,
  "status_code": 200
}

查询目标:统计各用户代理(User-Agent)的请求次数、平均响应时间和成功率(2xx 状态码占比)。

curl -X GET "http://localhost:9200/logs/_search" -H 'Content-Type: application/json' -d'
{
  "size": 0,
  "aggs": {
    "by_user_agent": {
      "terms": {
        "field": "user_agent.keyword",
        "size": 10
      },
      "aggs": {
        "request_count": {
          "value_count": {
            "field": "_id"
          }
        },
        "average_response_time": {
          "avg": {
            "field": "response_time_ms"
          }
        },
        "success_rate": {
          "bucket_script": {
            "buckets_path": {
              "success_count": "status_codes.2xx.doc_count",
              "total_count": "_count"
            },
            "script": "params.success_count / params.total_count"
          },
          "aggs": {
            "status_codes": {
              "filters": {
                "filters": {
                  "2xx": { "term": { "status_code": 200 } },
                  // 其他状态码的过滤条件...
                }
              }
            }
          }
        }
      }
    }
  }
}'

响应:

{
  "aggregations": {
    "by_user_agent": {
      "buckets": [
        {
          "key": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.3",
          "doc_count": 1000,
          "request_count": {
            "value": 1000
          },
          "average_response_time": {
            "value": .png.32
          },
          "success_rate": {
            "value": 0.99
          }
        },
        // 其他用户代理的聚合结果...
      ]
    }
  }
}

以上示例展示了如何使用 Elasticsearch 进行嵌套聚合、下钻分析和聚合分析。在实际应用中,可以根据业务需求灵活组合和定制聚合管道,以提取有价值的数据洞察。同样的聚合操作也可以通过 Kibana Visualizations、Dev Tools Console 或官方提供的各种语言客户端进行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值