【Elasticsearch】filter聚合

news/2025/2/6 14:50:42 标签: elasticsearch

 在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.niftyadmin.cn/n/5843090.html

相关文章

ES6 const 使用总结

1. 声明不可变性 1.1 基本类型的不可变性 // 基本类型声明后不能修改 const name John; name Jane; // TypeError: Assignment to constant variableconst age 25; age 26; // TypeError: Assignment to constant variableconst isValid true; isValid false; // Ty…

java使用LibreOffice实现word转pdf

之前使用dom4j转换&#xff0c;依赖office&#xff1b; 网上还有Apache poi和itextpdf方式&#xff0c;尝试后发现复杂word&#xff0c;比如包含表格曲线等支持性不好。 最后发现 LibreOffice&#xff1a;不依赖office&#xff0c;免费&#xff0c;可跨平台 参考链接&#xf…

Ollama+deepseek+Docker+Open WebUI实现与AI聊天

1、下载并安装Ollama 官方网址&#xff1a;Ollama 安装好后&#xff0c;在命令行输入&#xff0c; ollama --version 返回以下信息&#xff0c;则表明安装成功&#xff0c; 2、 下载AI大模型 这里以deepseek-r1:1.5b模型为例&#xff0c; 在命令行中&#xff0c;执行&…

国防科大:双目标优化防止LLM灾难性遗忘

&#x1f4d6;标题&#xff1a;How to Complete Domain Tuning while Keeping General Ability in LLM: Adaptive Layer-wise and Element-wise Regularization &#x1f310;来源&#xff1a;arXiv, 2501.13669 &#x1f31f;摘要 &#x1f538;大型语言模型&#xff08;LLM…

产品经理的人工智能课 02 - 自然语言处理

产品经理的人工智能课 02 - 自然语言处理 1 自然语言处理是什么2 一个 NLP 算法的例子——n-gram 模型3 预处理与重要概念3.1 分词 Token3.2 词向量化表示与 Word2Vec 4 与大语言模型的交互过程参考链接 大语言模型&#xff08;Large Language Models, LLMs&#xff09;是自然语…

技术书籍写作与编辑沟通指南

引言 撰写技术书籍不仅仅是知识的输出过程&#xff0c;更是与编辑团队紧密合作的协同工作。优秀的技术书籍不仅依赖作者深厚的技术背景&#xff0c;还需要精准的表达、流畅的结构以及符合出版要求的编辑润色。因此&#xff0c;如何高效地与编辑沟通&#xff0c;确保书籍质量&a…

Android Studio:Application 和 Activity的区别

Application 和 Activity 是 Android 中非常重要的两个组件&#xff0c;它们分别负责不同的生命周期管理和应用的不同层次的操作。 Application 是应用级别的生命周期管理&#xff0c;它在整个应用运行时只有一个实例&#xff0c;负责应用的全局初始化和资源管理。Activity 是…

【PostgreSQL内核学习 —— (WindowAgg(二))】

WindowAgg WindowAggState 结构体窗口聚合行为ExecInitWindowAgg 函数ExecWindowAgg 函数代码逻辑解释&#xff1a;计算窗口偏移量代码逻辑详细解释&#xff1a; 代码逻辑解释&#xff1a;窗口聚合分区初始化与行推进逻辑代码逻辑详细解释&#xff1a; 代码逻辑解释&#xff1a…