跳到主要内容

Elasticsearch 过滤聚合

在Elasticsearch中,聚合(Aggregation)是一种强大的工具,用于对数据进行分组和统计分析。过滤聚合(Filter Aggregation)是其中一种特殊的聚合类型,它允许我们在聚合之前对文档进行过滤,从而只对符合条件的文档进行聚合分析。这对于需要针对特定子集数据进行统计分析的场景非常有用。

什么是过滤聚合?

过滤聚合是一种嵌套聚合,它允许我们在执行聚合操作之前,先对文档进行过滤。过滤条件可以是任意的查询条件,例如范围查询、术语查询等。通过过滤聚合,我们可以轻松地对满足特定条件的文档进行聚合分析,而不需要先执行一个单独的查询。

过滤聚合的基本结构

过滤聚合的基本结构如下:

json
{
"aggs": {
"filtered_agg": {
"filter": {
"查询条件"
},
"aggs": {
"子聚合"
}
}
}
}
  • filtered_agg:过滤聚合的名称。
  • filter:定义过滤条件,可以是任何有效的Elasticsearch查询。
  • aggs:在过滤后的文档上执行的子聚合。

过滤聚合的使用场景

过滤聚合在以下场景中非常有用:

  1. 特定时间范围内的数据统计:例如,统计过去7天内的订单数量。
  2. 特定类别的数据分析:例如,统计某个产品类别的销售额。
  3. 排除异常数据:例如,排除价格异常高的订单进行统计分析。

实际案例:统计特定时间范围内的订单数量

假设我们有一个订单索引,其中包含订单的创建时间(created_at)和订单金额(amount)。我们希望统计过去7天内订单的总金额。

输入数据示例

json
[
{
"created_at": "2023-10-01T12:00:00Z",
"amount": 100
},
{
"created_at": "2023-10-05T14:00:00Z",
"amount": 200
},
{
"created_at": "2023-09-20T10:00:00Z",
"amount": 150
}
]

过滤聚合查询

json
{
"aggs": {
"last_7_days_orders": {
"filter": {
"range": {
"created_at": {
"gte": "now-7d/d",
"lt": "now/d"
}
}
},
"aggs": {
"total_amount": {
"sum": {
"field": "amount"
}
}
}
}
}
}

查询解释

  • filter:过滤条件为过去7天内的订单。
  • aggs:在过滤后的文档上执行sum聚合,计算订单金额的总和。

输出结果

json
{
"aggregations": {
"last_7_days_orders": {
"doc_count": 2,
"total_amount": {
"value": 300
}
}
}
}
  • doc_count:过去7天内的订单数量为2。
  • total_amount:过去7天内的订单总金额为300。

总结

过滤聚合是Elasticsearch中一种非常有用的工具,它允许我们在执行聚合操作之前对文档进行过滤。通过过滤聚合,我们可以轻松地对特定条件下的文档进行统计分析,从而获得更精确的分析结果。

附加资源与练习

  • 练习:尝试在您的Elasticsearch索引中创建一个过滤聚合,统计某个特定类别的文档数量。
  • 进一步学习:了解Elasticsearch中的其他聚合类型,如terms聚合、date_histogram聚合等。

通过掌握过滤聚合,您将能够更灵活地处理和分析Elasticsearch中的数据。继续探索和实践,您会发现更多强大的功能和技巧!