【Elasticsearch】filter聚合

在Elasticsearch中,Filter聚合是一种单桶聚合,用于根据特定的查询条件筛选文档,并对筛选后的文档集合进行进一步的聚合分析。它允许用户在执行聚合操作之前,先过滤出符合某些条件的文档,从而更精确地分析数据。

Filter聚合的核心概念

  1. 过滤条件:

• Filter聚合通过一个查询(如`term`、`range`、`bool`等)来定义过滤条件。

• 只有满足这些条件的文档才会被包含在聚合结果中。

  1. 子聚合:

• Filter聚合可以包含子聚合,这些子聚合仅对过滤后的文档集合进行计算。

• 这使得用户可以在特定的文档子集中进行更复杂的分析。

  1. 性能优势:

• 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中的数据进行分析和挖掘。

相关推荐
项目題供诗4 小时前
ES语法学习
学习·elasticsearch·django
Elastic 中国社区官方博客11 小时前
使用 Elastic-Agent 或 Beats 将 Journald 中的 syslog 和 auth 日志导入 Elastic Stack
大数据·linux·服务器·elasticsearch·搜索引擎·信息可视化·debian
星星点点洲13 小时前
【RAG】RAG 系统的基本搭建流程(ES关键词检索示例)
python·elasticsearch
郝开1 天前
ElasticSearch 分词器介绍及测试:Standard(标准分词器)、English(英文分词器)、Chinese(中文分词器)、IK(IK 分词器)
elasticsearch·中文分词·ik·ik analyzer
kngines1 天前
【实战ES】实战 Elasticsearch:快速上手与深度实践-3.2.3 案例:新闻搜索引擎的相关性优化
大数据·elasticsearch·搜索引擎
天草二十六_简村人2 天前
JPA编程,去重查询ES索引中的字段,对已有数据的去重过滤,而非全部字典数据
java·大数据·spring boot·elasticsearch·搜索引擎·微服务·架构
C182981825752 天前
ES Filter Query 区别
elasticsearch
Elastic 中国社区官方博客2 天前
Elasticsearch:使用 BigQuery 提取数据
大数据·数据库·elasticsearch·搜索引擎·全文检索
小诸葛IT课堂2 天前
MySQL数据实时同步至Elasticsearch的高效方案:Java实现+源码解析,一文搞定!
java·mysql·elasticsearch
山上春2 天前
常见的 Git 命令
大数据·git·elasticsearch