【Elasticsearch】filter聚合
在Elasticsearch中,Filter聚合是一种单桶聚合,用于根据特定的查询条件筛选文档,并对筛选后的文档集合进行进一步的聚合分析。它允许用户在执行聚合操作之前,先过滤出符合某些条件的文档,从而更精确地分析数据。
Filter聚合的核心概念
1. 过滤条件:
• Filter聚合通过一个查询(如`term`、`range`、`bool`等)来定义过滤条件。
• 只有满足这些条件的文档才会被包含在聚合结果中。
2. 子聚合:
• Filter聚合可以包含子聚合,这些子聚合仅对过滤后的文档集合进行计算。
• 这使得用户可以在特定的文档子集中进行更复杂的分析。
3. 性能优势:
• Filter聚合在内部进行了优化,比直接在查询中使用`filter`子句更高效。
• 它特别适合于需要对特定文档子集进行多次聚合分析的场景。
Filter聚合的语法
Filter聚合的基本语法如下:
```json
{
"aggs": {
"<aggregation_name>": {
"filter": {
"<query>": {
"<query_definition>": ...
}
},
"aggs": {
"<sub_aggregation_name>": {
"<sub_aggregation_type>": {
"<sub_aggregation_definition>": ...
}
}
}
}
}
}
```
• `<aggregation_name>`:自定义的聚合名称。
• `<query>`:定义过滤条件的查询类型(如`term`、`range`等)。
• `<query_definition>`:具体的查询定义。
• `<sub_aggregation_name>`:子聚合的名称。
• `<sub_aggregation_type>`:子聚合的类型(如`avg`、`sum`、`max`等)。
• `<sub_aggregation_definition>`:子聚合的具体定义。
示例:计算特定类型商品的平均价格
假设我们有一个`sales`索引,其中包含不同类型的销售记录,我们希望计算所有T恤的平均价格。可以使用以下Filter聚合:
```json
POST /sales/_search?size=0&filter_path=aggregations
{
"aggs": {
"t_shirts": {
"filter": {
"term": {
"type": "t-shirt"
}
},
"aggs": {
"avg_price": {
"avg": {
"field": "price"
}
}
}
}
}
}
```
响应结果
```json
{
"aggregations": {
"t_shirts": {
"doc_count": 3,
"avg_price": {
"value": 128.33333333333334
}
}
}
}
```
• `doc_count`:表示过滤后的文档数量(即T恤的数量)。
• `avg_price`:表示这些T恤的平均价格。
使用顶级`query`限制所有聚合
如果需要对所有聚合操作的文档集合进行限制,可以使用顶级`query`。这比使用Filter聚合更高效,因为它在聚合之前就过滤了文档。
例如,如果只想对T恤进行聚合分析,可以使用以下方式:
```json
POST /sales/_search?size=0&filter_path=aggregations
{
"query": {
"term": {
"type": "t-shirt"
}
},
"aggs": {
"avg_price": {
"avg": {
"field": "price"
}
}
}
}
```
使用`filters`聚合进行多过滤器分组
如果需要对多个过滤条件进行分组分析,可以使用`filters`聚合。这比多个单独的Filter聚合更高效。
例如,同时计算帽子和T恤的平均价格:
```json
POST /sales/_search?size=0&filter_path=aggregations
{
"aggs": {
"f": {
"filters": {
"filters": {
"hats": {
"term": {
"type": "hat"
}
},
"t_shirts": {
"term": {
"type": "t-shirt"
}
}
}
},
"aggs": {
"avg_price": {
"avg": {
"field": "price"
}
}
}
}
}
}
```
响应结果
```json
{
"aggregations": {
"f": {
"buckets": {
"hats": {
"doc_count": 2,
"avg_price": {
"value": 100.5
}
},
"t_shirts": {
"doc_count": 3,
"avg_price": {
"value": 128.33333333333334
}
}
}
}
}
}
```
总结
• Filter聚合:用于根据特定条件筛选文档,并对筛选后的文档进行聚合分析。
• 性能优化:使用顶级`query`限制所有聚合操作的文档集合,或使用`filters`聚合对多个过滤条件进行分组分析,可以提高性能。
• 应用场景:适用于需要对特定文档子集进行多次聚合分析的场景,例如按产品类型、价格范围等进行分组分析。
通过合理使用Filter聚合,可以更高效地对Elasticsearch中的数据进行分析和挖掘。