【Elasticsearch】filter聚合

devtools/2025/2/6 23:02:30/

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


http://www.ppmy.cn/devtools/156639.html

相关文章

设计模式的艺术-策略模式

行为型模式的名称、定义、学习难度和使用频率如下表所示&#xff1a; 1.如何理解策略模式 在策略模式中&#xff0c;可以定义一些独立的类来封装不同的算法&#xff0c;每个类封装一种具体的算法。在这里&#xff0c;每个封装算法的类都可以称之为一种策略&#xff08;Strategy…

PostgreSQL 数据库视图基础操作

视图是 PostgreSQL 中的一种虚拟表&#xff0c;通过一个或多个查询语句生成。视图不实际存储数据&#xff0c;而是存储了一个查询定义&#xff0c;每次查询视图时&#xff0c;都会执行这个查询定义。视图可以用于简化复杂的查询、隐藏某些列或行、实现数据聚合等。定义视图如下…

数据库课程设计使用Java+JDBC+MySQL+Swing实现的会议预约管理系统源代码+数据库

编码&#xff1a; GBK 开发环境 jdk12MySQL8.0 效果图 用户端 管理员端 完整代码下载地址&#xff1a;会议预约管理系统源代码数据库

项目配置的最常见文件格式(ini,toml,yaml,conf,json,env)

在编程中&#xff0c;有多种文件格式可用于处理项目配置&#xff0c;每种格式都有其特点&#xff0c;下面将详细比较常见的配置文件格式&#xff08;INI、TOML、YAML、CONF、JSON、ENV&#xff09;以及用于解析它们的 Python 库。 1. INI 文件格式 特点&#xff1a; 简单易读&…

AURIX TC275学习笔记3 官方例程 (UART LED WDT)

文章目录 参考资料1. ASCLIN_UART_12. GPIO_LED_Button_13. WDT (Watch Dog Timer) 参考资料 AURIX TC275学习笔记1 资料收集Getting Started with AURIX™ Development Studio 官方帮助文档happy hacking for TC275! 硬件平台使用AURIX™ TC275 Lite 套件&#xff0c;按照参…

STM32 PWM驱动直流电机

接线图&#xff1a; 代码配置&#xff1a; 根据驱动舵机的代码来写&#xff0c;与舵机不同的是&#xff0c;这次的引脚接到了PA2上&#xff0c;所以需要改一下引脚以及改为OC3通道。 另外还需在配置两个GPIO引脚&#xff0c;来控制电机的旋转方向&#xff0c;这里连接到了PA4与…

跨域问题解决实践

在软件开发中&#xff0c;经常会遇到跨域问题&#xff0c;这个问题比较头疼&#xff0c;今天主要介绍下遇到的跨域问题解决思路及如何解决&#xff1f; 1、首先是后端跨域问题 spring boot中的跨域配置如下&#xff1a; Configuration public class WebMvcConfig implements W…

【go语言】结构体

一、type 关键字的用法 在 go 语言中&#xff0c;type 关键字用于定义新的类型&#xff0c;他可以用来定义基础类型、结构体类型、接口类型、函数类型等。通过 type 关键字&#xff0c;我们可以为现有类型创建新的类型别名或者自定义新的类型。 1.1 类型别名 使用 type 可以为…