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 或官方提供的各种语言客户端进行。