视频网站外链怎么做/网站营销方案

视频网站外链怎么做,网站营销方案,抖音代运营合作协议免费,学javaweb可以做网站嘛掌握 ElasticSearch 聚合查询:Aggregations 入门与实战 一、引言 (Introduction)二、数据准备 (Data Preparation)2.1 创建索引 (Create Index)2.2 批量导入数据 (Bulk Import Data) 三、聚合查询基础 (Aggregation Basics)3.1 什么是聚合查询?(What are…

掌握 ElasticSearch 聚合查询:Aggregations 入门与实战

    • 一、引言 (Introduction)
    • 二、数据准备 (Data Preparation)
      • 2.1 创建索引 (Create Index)
      • 2.2 批量导入数据 (Bulk Import Data)
    • 三、聚合查询基础 (Aggregation Basics)
      • 3.1 什么是聚合查询?(What are Aggregations?)
      • 3.2 聚合查询的基本结构 (Basic Aggregation Structure)
      • 3.3 聚合类型 (Aggregation Types)
    • 四、指标聚合 (Metrics Aggregations)
      • 4.1 `avg` (平均值)
      • 4.2 `min` (最小值)
      • 4.3 `max` (最大值)
      • 4.4 `sum` (总和)
      • 4.5 `stats` (统计信息)
      • 4.6 `value_count` (值计数)
      • 4.7 `cardinality` (基数/去重计数)
    • 五、桶聚合 (Bucket Aggregations)
      • 5.1 `terms` (词条聚合)
      • 5.2 嵌套桶聚合
    • 六、管道聚合 (Pipeline Aggregations)
      • 6.1 什么是管道聚合?
      • 6.2 `min_bucket` (最小桶)
      • 6.3 其他管道聚合
    • 七、实战案例 (Practical Examples)
      • 案例 1:统计每个产品类别中,价格最高的产品的价格,并按最高价格降序排列
      • 案例 2:找出每个月销售额最高的日期
    • 八、总结 (Conclusion)

一、引言 (Introduction)

在信息检索和数据分析的世界中,我们常常需要做的不仅仅是找到匹配特定关键词的文档。很多时候,我们需要从海量数据中提取出更深层次的、有价值的洞察。例如:

  • 我想知道我的电商网站上所有商品的平均价格是多少?
  • 哪个产品类别下的商品数量最多?
  • 我的网站上有多少种不同的商品品牌?
  • 在过去的一年中,每个月的销售总额是多少?
  • 哪一天的销售额是最高的?

这些问题都涉及对数据的统计和分析,而不仅仅是简单的搜索。为了满足这些需求,Elasticsearch 提供了强大的聚合查询(Aggregations) 功能。聚合查询就像一个多功能的瑞士军刀,或者说是一个强大的数据分析工具箱,它允许你对数据进行各种分组、统计和计算,从而提取出隐藏在数据背后的关键信息。

你可以把聚合查询想象成 SQL 中的 GROUP BY 子句和各种聚合函数(COUNT, SUM, AVG, MIN, MAX)的组合,但 Elasticsearch 的聚合功能远比 SQL 更加灵活和强大。

本文将带你深入了解 Elasticsearch 7.10 版本中聚合查询的基础知识。通过本文,你将学习到:

  • 聚合查询的基本概念和工作原理。
  • 三种核心的聚合类型:指标聚合(Metrics Aggregations)、桶聚合(Bucket Aggregations)和管道聚合(Pipeline Aggregations)。
  • 如何使用各种指标聚合函数(avg, min, max, sum, stats, value_count, cardinality)。
  • 如何使用 terms 聚合进行分组。
  • 如何使用管道聚合对聚合结果进行二次聚合。
  • 通过实战案例学习如何在实际应用中运用聚合查询,解决真实的数据分析问题。

二、数据准备 (Data Preparation)

在开始学习聚合查询之前,我们需要先准备一些示例数据。我们将创建一个名为 product 的索引,并批量导入一些商品数据。

2.1 创建索引 (Create Index)

首先,我们创建一个名为 product 的索引,并定义其 mappings(映射)。Mappings 定义了索引中每个字段的数据类型以及如何进行索引和搜索。

PUT product
{"mappings": {"properties": {"createtime": {"type": "date"},"date": {"type": "date"},"desc": {"type": "text","fields": {"keyword": {"type": "keyword","ignore_above": 256}}},"lv": {"type": "text","fields": {"keyword": {"type": "keyword","ignore_above": 256}}},"name": {"type": "text","analyzer": "ik_max_word","fields": {"keyword": {"type": "keyword","ignore_above": 256}}},"price": {"type": "long"},"tags": {"type": "text","fields": {"keyword": {"type": "keyword","ignore_above": 256}}},"type": {"type": "text","fields": {"keyword": {"type": "keyword","ignore_above": 256}}}}}
}

2.2 批量导入数据 (Bulk Import Data)

接下来,我们使用 Elasticsearch 的 _bulk API 来批量导入一些商品数据。_bulk API 可以一次性执行多个索引、更新或删除操作,效率更高。

POST /product/_bulk
{"index":{"_index": "product"}}
{"name": "小米手机", "desc": "手机中的战斗机", "price": 3999, "lv": "旗舰机", "type": "手机", "createtime": "2020-10-01T08:00:00Z", "tags": [ "性价比", "发烧", "不卡顿" ]}
{"index":{"_index": "product"}}
{"name": "小米NFC手机", "desc": "支持全功能NFC,手机中的滑翔机", "price": 4999, "lv": "旗舰机", "type": "手机", "createtime": "2020-05-21T08:00:00Z", "tags": [ "性价比", "发烧", "公交卡" ]}
{"index":{"_index": "product"}}
{"name": "NFC手机", "desc": "手机中的轰炸机", "price": 2999, "lv": "高端机", "type": "手机", "createtime": "2020-06-20T08:00:00Z", "tags": [ "性价比", "快充", "门禁卡" ]}
{"index":{"_index": "product"}}
{"name": "小米耳机", "desc": "耳机中的黄焖鸡", "price": 999, "lv": "百元机", "type": "耳机", "createtime": "2020-06-23T08:00:00Z", "tags": [ "降噪", "防水", "蓝牙" ]}
{"index":{"_index": "product"}}
{"name": "红米耳机", "desc": "耳机中的肯德基", "price": 399, "type": "耳机", "lv": "百元机", "createtime": "2020-07-20T08:00:00Z", "tags": [ "防火", "低音炮", "听声辨位" ]}
{"index":{"_index": "product"}}
{"name": "小米手机10", "desc": "充电贼快掉电更快,超级无敌望远镜,高刷电竞屏", "price": null, "lv": "旗舰机", "type": "手机", "createtime": "2020-07-27T08:00:00Z", "tags": [ "120HZ刷新率", "120W快充", "120倍变焦" ]}
{"index":{"_index": "product"}}
{"name": "挨炮 SE2", "desc": "除了CPU,一无是处", "price": 3299, "lv": "旗舰机", "type": "手机", "createtime": "2020-07-21T08:00:00Z", "tags": [ "割韭菜", "割韭菜", "割新韭菜" ]}
{"index":{"_index": "product"}}
{"name": "XS Max", "desc": "听说要出新款12手机了,终于可以换掉手中的4S了", "price": 4399, "lv": "旗舰机", "type": "手机", "createtime": "2020-08-19T08:00:00Z", "tags": [ "5V1A", "4G全网通", "大" ]}
{"index":{"_index": "product"}}
{"name": "小米电视", "desc": "70寸性价比只选,不要一万八,要不要八千八,只要两千九百九十八", "price": 2998, "lv": "高端机", "type": "电视", "createtime": "2020-08-16T08:00:00Z", "tags": [ "巨馍", "家庭影院", "游戏" ]}
{"index":{"_index": "product"}}
{"name": "红米电视", "desc": "我比上边那个更划算,我也2998,我也70寸,但是我更好看", "price": 2999, "type": "电视", "lv": "高端机", "createtime": "2020-08-28T08:00:00Z", "tags": [ "大片", "蓝光8K", "超薄" ]}
{"index":{"_index": "product"}}
{"name": "红米电视", "desc": "我比上边那个更划算,我也2998,我也70寸,但是我更好看", "price": 2998, "type": "电视", "lv": "高端机", "createtime": "2020-08-28T08:00:00Z", "tags": [ "大片", "蓝光8K", "超薄" ]}

代码解释:

  • POST /product/_bulk: 使用 _bulk API 向 product 索引发送批量请求。
  • 每一行是一个 JSON 对象,表示一个操作。

现在,我们已经准备好了数据,可以开始学习 Elasticsearch 的聚合查询了!

三、聚合查询基础 (Aggregation Basics)

3.1 什么是聚合查询?(What are Aggregations?)

聚合查询(Aggregations)是 Elasticsearch 中一种强大的数据分析功能,它允许你对文档数据进行各种统计分析。与搜索查询(返回匹配的文档)不同,聚合查询返回的是聚合后的统计结果。

你可以将聚合查询类比为 SQL 中的 GROUP BY 子句和聚合函数(如 COUNT, SUM, AVG, MIN, MAX)。 例如,你可以使用 SQL 来计算每个部门的平均工资:

SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department;

Elasticsearch 的聚合查询提供了类似的功能,但更加灵活和强大。它可以处理更复杂的数据结构和分析场景,并且可以进行多层嵌套的聚合。

3.2 聚合查询的基本结构 (Basic Aggregation Structure)

聚合查询的基本语法结构如下:

GET /<index>/_search
{"size": 0,"aggs": {"<aggregation_name>": {"<aggregation_type>": {"<aggregation_parameters>"},"aggs": {"<nested_aggregation_name>": {"<nested_aggregation_type>": {"<nested_aggregation_parameters>"}}}}}
}

解释:

  • GET /<index>/_search: 这是 Elasticsearch 的搜索 API,我们在这里使用它来执行聚合查询。
  • "size": 0: 这是一个可选参数。通常,在执行聚合查询时,我们只关心聚合结果,而不关心具体的文档内容。"size": 0 表示不返回任何文档,只返回聚合结果。
  • "aggs" (或 "aggregations"): 这是聚合查询的顶层关键字。所有聚合操作都定义在 aggs 对象中。
  • "<aggregation_name>": 这是你为聚合操作指定的名称。这个名称可以是任意的,它将作为聚合结果的一部分返回,方便你识别和引用。例如,你可以将计算平均价格的聚合命名为 "avg_price"
  • "<aggregation_type>": 这是聚合的类型。Elasticsearch 提供了多种聚合类型,每种类型都有不同的功能。常见的聚合类型包括:
    • avg (平均值)
    • min (最小值)
    • max (最大值)
    • sum (总和)
    • terms (词条聚合)
    • stats (统计信息)
    • 等等…
  • "<aggregation_parameters>": 这是特定于聚合类型的参数。不同的聚合类型有不同的参数。例如,avg 聚合需要指定要计算平均值的字段,terms 聚合需要指定要分组的字段。
  • "aggs": { ... } (在 <aggregation_name> 内部): 这是可选的嵌套聚合。你可以在一个聚合操作中嵌套另一个聚合操作,以实现更复杂的分析。例如,你可以先按产品类别分组,然后在每个类别中计算平均价格。

3.3 聚合类型 (Aggregation Types)

Elasticsearch 提供了三种主要的聚合类型:

  1. Metrics Aggregations (指标聚合): 这类聚合主要用于计算单个数值指标。例如:

    • avg: 计算平均值。
    • min: 计算最小值。
    • max: 计算最大值。
    • sum: 计算总和。
    • stats: 一次性计算多个统计值(avg, min, max, sum, count)。
    • value_count: 计算非空字段的文档数量。
    • cardinality: 计算字段的不同值的数量(去重)。
  2. Bucket Aggregations (桶聚合): 这类聚合主要用于将文档分组到不同的“桶”中。每个桶代表一个分组。例如:

    • terms: 按字段值对文档进行分组。
    • date_histogram: 按日期范围对文档进行分组。
    • range: 按自定义数值范围对文档进行分组。
    • filter: 根据指定的过滤条件将文档分到一个桶
    • filters: 根据指定的多个过滤条件将文档分到多个桶
  3. Pipeline Aggregations (管道聚合): 这类聚合比较特殊,它们不直接操作文档,而是对其他聚合的结果进行进一步的聚合。例如:

    • min_bucket: 找出包含最小值的桶。
    • max_bucket: 找出包含最大值的桶。
    • avg_bucket: 计算桶的平均值。
    • sum_bucket: 计算桶的总和。
    • stats_bucket: 对桶进行统计分析
    • derivative: 计算导数(例如,计算销售额的变化率)。

本文将重点介绍这三种聚合类型的基础用法。接下来,我们将分别深入探讨每种聚合类型,并通过示例演示如何在实际应用中使用它们。

四、指标聚合 (Metrics Aggregations)

指标聚合用于计算单个数值指标,例如平均值、最小值、最大值、总和等。这些指标可以帮助你了解数据的整体特征。

4.1 avg (平均值)

avg 聚合用于计算指定字段的平均值。

示例: 计算 product 索引中所有产品的平均价格。

GET /product/_search
{"size": 0,"aggs": {"avg_price": {"avg": {"field": "price"}}}
}

代码解释:

  • "size": 0: 不返回文档,只返回聚合结果。
  • "aggs": 聚合查询的开始。
  • "avg_price": 我们为这个聚合操作指定的名称。
  • "avg": 指定聚合类型为 avg (平均值)。
  • "field": "price": 指定要计算平均值的字段为 price

结果 (部分):

{..."aggregations": {"avg_price": {"value": 3008.8}}
}

结果中的 "value" 字段显示了所有产品价格的平均值。

4.2 min (最小值)

min 聚合用于计算指定字段的最小值。

示例: 计算 product 索引中所有产品的最低价格。

GET /product/_search
{"size": 0,"aggs": {"min_price": {"min": {"field": "price"}}}
}

结果 (部分):

{..."aggregations": {"min_price": {"value": 399.0}}
}

4.3 max (最大值)

max 聚合用于计算指定字段的最大值。

示例: 计算 product 索引中所有产品的最高价格。

GET /product/_search
{"size": 0,"aggs": {"max_price": {"max": {"field": "price"}}}
}

结果 (部分):

{..."aggregations": {"max_price": {"value": 4999.0}}
}

4.4 sum (总和)

sum 聚合用于计算指定字段的总和。

示例: 计算 product 索引中所有产品的价格总和。

GET /product/_search
{"size": 0,"aggs": {"sum_price": {"sum": {"field": "price"}}}
}

结果 (部分):

{..."aggregations": {"sum_price": {"value": 30088.0}}
}

4.5 stats (统计信息)

stats 聚合可以一次性计算多个统计值,包括:

  • count: 文档数量。
  • min: 最小值。
  • max: 最大值。
  • avg: 平均值。
  • sum: 总和。

示例: 获取 product 索引中所有产品的价格统计信息。

GET /product/_search
{"size": 0,"aggs": {"price_stats": {"stats": {"field": "price"}}}
}

结果 (部分):

{..."aggregations" : {"statistics" : {"count" : 10,"min" : 399.0,"max" : 4999.0,"avg" : 3008.8,"sum" : 30088.0}}
}

结果中一次性返回了countminmaxavgsum

4.6 value_count (值计数)

value_count 聚合用于计算指定字段的 非空 值的文档数量。

示例: 计算 product 索引中有多少个文档具有 price 字段(即有多少个产品有价格信息)。

GET /product/_search
{"size": 0,"aggs": {"price_count": {"value_count": {"field": "price"}}}
}

结果 (部分):

{..."aggregations": {"price_count": {"value": 10}}
}

注意,由于有一个文档的 price 字段为 null,因此结果为 10,而不是 11。

4.7 cardinality (基数/去重计数)

cardinality 聚合用于计算指定字段的不同值的数量(即去重计数)。

示例: 计算 product 索引中有多少种不同的产品等级 (lv)。

GET /product/_search
{"size": 0,"aggs": {"lv_cardinality": {"cardinality": {"field": "lv.keyword"}}}
}

代码解释:

  • "lv_cardinality": 聚合的名称。
  • "cardinality": 指定聚合类型为 cardinality
  • "field": "lv.keyword": 指定要计算基数的字段为 lv.keyword。 这里使用 .keyword 子字段是因为我们要对原始的、未分词的 lv 值进行去重计数。

结果 (部分):

{..."aggregations": {"lv_cardinality": {"value": 3}}
}

结果表明,product 索引中有 3 种不同的产品等级。

cardinality 聚合的计算结果是近似的,而不是完全精确的。对于低基数字段(即不同值较少),结果通常是准确的。但对于高基数字段(即不同值非常多),为了提高性能,Elasticsearch 使用了一种称为 HyperLogLog++ 的算法进行近似计算。你可以通过 precision_threshold 参数来控制精度和内存使用之间的权衡。如果需要完全精确的去重计数,并且数据集较小,可以考虑使用 terms 聚合,并设置一个足够大的 size 值。但对于大数据集,cardinality 聚合通常是更好的选择。

五、桶聚合 (Bucket Aggregations)

桶聚合(Bucket Aggregations)用于将文档分组到不同的“桶”中。每个桶代表一个分组,可以根据不同的条件来创建桶。桶聚合本身不进行统计运算,其主要作用是分组。通常会在桶聚合内嵌套一个或者多个指标聚合,用于统计每个桶内的指标。

5.1 terms (词条聚合)

terms 聚合是最常用的桶聚合之一。它根据指定字段的值对文档进行分组,每个不同的字段值都会创建一个桶。

示例:tags.keyword 字段对 product 索引中的产品进行分组,并统计每个标签下的文档数量。

GET /product/_search
{"size": 0,"aggs": {"tag_bucket": {"terms": {"field": "tags.keyword","size": 10,"order": {"_count": "desc"}}}}
}

代码解释:

  • "size": 0: 不返回文档,只返回聚合结果。
  • "aggs": 聚合查询的开始。
  • "tag_bucket": 我们为这个聚合操作指定的名称。
  • "terms": 指定聚合类型为 terms (词条聚合)。
  • "field": "tags.keyword": 指定要进行分组的字段为 tags.keyword。使用 .keyword 子字段是因为我们要基于标签的原始值进行分组,而不是分词后的结果。
  • "size": 10: 指定返回的桶的最大数量。默认情况下,terms 聚合会返回文档数量最多的前 10 个桶。
  • "order": { "_count": "desc" }: 指定桶的排序方式。这里按照每个桶中文档数量 (_count) 的降序 (desc) 进行排序。

结果(部分):

{..."aggregations": {"tag_bucket": {"doc_count_error_upper_bound": 0,"sum_other_doc_count": 8,"buckets": [{"key": "性价比","doc_count": 3},{"key": "发烧","doc_count": 2},{"key": "大片","doc_count": 2},{"key": "蓝光8K","doc_count": 2},{"key": "超薄","doc_count": 2},{"key": "割韭菜","doc_count": 2},{"key": "120W快充","doc_count": 1},{"key": "120HZ刷新率","doc_count": 1},{"key": "120倍变焦","doc_count": 1},{"key": "4G全网通","doc_count": 1}]}}
}

结果解释:

  • "buckets": 这是一个数组,包含了根据 tags.keyword 字段值分组后的桶。
  • "key": 每个桶的键,即 tags.keyword 字段的值(例如 “性价比”, “发烧”)。
  • "doc_count": 每个桶中的文档数量。
  • "doc_count_error_upper_bound":由于terms聚合默认情况下返回文档数量最多的前N个桶,这个值表示因为桶数量限制,没有被统计到的文档数量的最大可能误差值。
  • "sum_other_doc_count": 由于terms聚合默认情况下返回文档数量最多的前N个桶,这个值表示未返回的其他桶中文档数量的总和。

size 参数:

size 参数控制返回的桶的数量。 如果你想返回所有桶,可以将 size 设置为一个较大的值(例如,大于字段中不同值的数量)。 但是,请注意,如果字段的基数非常高(即有很多不同的值),返回所有桶可能会消耗大量内存。

order 参数:

order 参数控制桶的排序方式。除了按 _count 排序外,还可以:

  • _key 排序:"order": { "_key": "asc" } (按字段值升序) 或 "order": { "_key": "desc" } (按字段值降序)。
  • 按桶内指标聚合的结果排序(稍后在嵌套聚合中介绍)。

5.2 嵌套桶聚合

在实际应用中,我们经常需要进行多层级的聚合。例如,我们想先按type进行分组,然后统计每个typeprice的平均值。这种情况下我们就需要用到嵌套聚合。

GET /product/_search
{"size": 0,"aggs": {"type_bucket": {"terms": {"field": "type.keyword"},"aggs": {"avg_price": {"avg": {"field": "price"}}}}}
}

代码解释:

  • 外层是一个terms聚合, 根据type.keyword字段进行分组。
  • 内层是一个avg聚合, 计算每个分组内price字段的平均值。
  • 内层聚合的结果会作为外层聚合每个桶的一个属性。

结果(部分):

{..."aggregations": {"type_bucket": {"doc_count_error_upper_bound": 0,"sum_other_doc_count": 0,"buckets": [{"key" : "手机","doc_count" : 6,"avg_price" : {"value" : 3939.0}},{"key" : "耳机","doc_count" : 3,"avg_price" : {"value" : 1465.3333333333333}},{"key" : "电视","doc_count" : 2,"avg_price" : {"value" : 2998.5}}]}}
}

结果解释:

  • "buckets": 这是一个数组,包含了根据 type.keyword 字段值分组后的桶。
  • "key": 每个桶的键,即 type.keyword 字段的值(例如 “手机”, “耳机”)。
  • "doc_count": 每个桶中的文档数量。
  • "avg_price": 每个桶中嵌套聚合的结果, 即该类型商品的平均价格。

通过嵌套聚合,我们可以轻松实现多层级的数据分析。我们可以根据需求自由组合不同的聚合类型,构建出非常复杂的聚合查询。

六、管道聚合 (Pipeline Aggregations)

管道聚合(Pipeline Aggregations)是一种特殊的聚合类型。它们不像指标聚合和桶聚合那样直接操作文档,而是对其他聚合的结果进行进一步的聚合。这就像在数据处理流程中添加了一个额外的“管道”,对上游聚合的输出进行处理。

6.1 什么是管道聚合?

管道聚合的核心思想是:输入是另一个聚合(或多个聚合)的输出,而不是文档本身。这使得我们可以进行诸如以下操作:

  • 找出平均价格最低的产品类别。
  • 计算每个月销售额的总和,然后找出销售额最高的月份。
  • 计算某个指标的导数或移动平均值。

管道聚合的关键参数是 buckets_path,它用于指定要作为输入的聚合的路径。

6.2 min_bucket (最小桶)

min_bucket 管道聚合用于找出包含最小值的桶。

示例: 找出平均价格最低的产品分类(基于之前嵌套聚合的结果)。

GET /product/_search
{"size": 0,"aggs": {"type_bucket": {"terms": {"field": "type.keyword"},"aggs": {"avg_price": {"avg": {"field": "price"}}}},"min_avg_price_bucket": {"min_bucket": {"buckets_path": "type_bucket>avg_price"}}}
}

代码解释:

  • "type_bucket": 这是一个 terms 聚合,按产品类型 (type.keyword) 分组。
  • "avg_price": 这是一个嵌套的 avg 聚合,计算每个产品类型的平均价格。
  • "min_avg_price_bucket": 这是我们定义的管道聚合的名称。
  • "min_bucket": 指定聚合类型为 min_bucket
  • "buckets_path": "type_bucket>avg_price": 这是 buckets_path 参数,它指定了要处理的聚合路径。
    • type_bucket: 表示外层的 terms 聚合。
    • >: 表示嵌套关系。
    • avg_price: 表示内层的 avg 聚合。
    • 所以,"type_bucket>avg_price" 表示我们要找到 type_bucket 聚合中,avg_price 聚合结果最小的那个桶。

结果(部分):

{..."aggregations": {"type_bucket": {... // 省略了 type_bucket 的详细结果},"min_avg_price_bucket": {"value": 1465.3333333333333,"keys": ["耳机"]}}
}

结果解释:

  • "min_avg_price_bucket": 管道聚合的结果。
  • "value": 最小值 (最低的平均价格)。
  • "keys": 取得最小值的桶的key值数组, 在本例中, 平均价格最低的分类是 “耳机”。

6.3 其他管道聚合

除了 min_bucket 之外,ElasticSearch 还提供了其他几种管道聚合:

  • max_bucket: 找出包含最大值的桶。用法与min_bucket类似, 只是找出最大值。
  • avg_bucket: 计算所有桶中某个指标的平均值。
  • sum_bucket: 计算所有桶中某个指标的总和。
  • stats_bucket:一次性计算多个统计值, 类似于stats指标聚合, 但是stats_bucket是作用于桶聚合的结果之上。
  • derivative: 计算导数(例如,计算销售额的变化率)。
  • moving_avg: 计算移动平均值(例如,计算过去 7 天的平均销售额)。
  • bucket_script: 使用脚本对桶的指标进行自定义计算。
  • bucket_selector: 根据脚本过滤桶。
  • bucket_sort: 对桶进行排序。

这些管道聚合提供了更高级的数据分析功能。你可以在 ElasticSearch 的官方文档中找到关于它们的详细信息。

七、实战案例 (Practical Examples)

现在,让我们通过几个更贴近实际应用的示例,来展示如何组合不同类型的聚合,以解决真实的数据分析问题。

案例 1:统计每个产品类别中,价格最高的产品的价格,并按最高价格降序排列

这个案例结合了 terms 桶聚合、max 指标聚合和排序。

GET product/_search
{"size": 0, "aggs": {"type_bucket": {"terms": {"field": "type.keyword","order": {"max_price": "desc"}},"aggs": {"max_price": {"max": {"field": "price"}}}}}
}

代码解释:

  • "type_buckets": terms 聚合,按 type.keyword 字段(产品类型)分组。
  • "order": { "max_price": "desc" }: 按嵌套的 max_price 聚合的结果(即每个类别中的最高价格)进行降序排序。
  • "max_price": 嵌套的 max 聚合,计算每个类别中的最高价格。

结果(部分):

{..."aggregations": {"type_buckets": {..."buckets": [{"key" : "手机","doc_count" : 6,"max_price" : {"value" : 4999.0}},{"key" : "电视","doc_count" : 2,"max_price" : {"value" : 2999.0}},{"key" : "耳机","doc_count" : 3,"max_price" : {"value" : 2998.0}}]}}
}

案例 2:找出每个月销售额最高的日期

这个案例结合了 date_histogram 桶聚合、sum 指标聚合和 max_bucket 管道聚合。

GET /product/_search
{"size": 0,"aggs": {"sales_per_month": {"date_histogram": {"field": "createtime","calendar_interval": "month"},"aggs": {"sales_per_day": {"date_histogram": {"field": "createtime","calendar_interval": "day"},"aggs": {"daily_sales": {"sum": {"field": "price"}}}},"max_daily_sales": {"max_bucket": {"buckets_path": "sales_per_day>daily_sales"}}}}}
}

代码解释:

  1. sales_per_month (外层 date_histogram):

    • 按月对文档进行分组("calendar_interval": "month")。
    • field: “createtime”
  2. sales_per_day (内层 date_histogram):

    • 在每个月的桶内,再按天对文档进行分组("calendar_interval": "day")。
    • field: “createtime”
  3. daily_sales (指标聚合):

    • 在每个天的桶内,计算当天的销售总额("sum": { "field": "price" })。
  4. max_daily_sales (管道聚合):

    • 使用 max_bucket 管道聚合。
    • "buckets_path": "sales_per_day>daily_sales": 找出每个月内,daily_sales (销售总额) 最高的那个 sales_per_day (天) 桶。

结果 (部分):

{..."aggregations": {"sales_per_month": {"buckets": [{"key_as_string": "2020-05-01T00:00:00.000Z","key": 1588291200000,"doc_count": 1,"sales_per_day": {...},"max_daily_sales": {"value": 4999.0,"keys": ["2020-05-21T00:00:00.000Z"]}},{"key_as_string": "2020-06-01T00:00:00.000Z","key": 1590969600000,"doc_count": 2,"sales_per_day": {...},"max_daily_sales": {"value": 2999.0,"keys": ["2020-06-20T00:00:00.000Z"]}},...]}}
}

结果显示, 对于每个月, 销售额最高的那一天的日期和销售额都被找了出来. 例如, 在2020年5月, 销售额最高的那一天是2020-05-21, 销售额是4999.

这两个案例展示了如何将不同类型的聚合组合起来,以解决更复杂的数据分析问题。 ElasticSearch 聚合的强大之处在于其灵活性和可组合性,你可以根据自己的需求设计出各种各样的聚合查询。\

八、总结 (Conclusion)

在本教程中,我们深入探讨了 Elasticsearch 7.10 中聚合查询的基础知识。聚合查询是 Elasticsearch 中进行数据分析的强大工具,它能够帮助你从海量数据中提取出有价值的统计信息和洞察。

我们学习了:

  • 聚合查询的基本概念和结构: 了解了聚合查询与搜索查询的区别,以及聚合查询的基本 JSON 结构。
  • 三种核心的聚合类型:
    • 指标聚合 (Metrics Aggregations): 用于计算单个数值指标,如平均值、最小值、最大值、总和、去重计数等。
    • 桶聚合 (Bucket Aggregations): 用于将文档分组到不同的桶中,如按字段值分组、按日期范围分组等。
    • 管道聚合 (Pipeline Aggregations): 用于对其他聚合的结果进行进一步的聚合,如找出最大值、最小值、计算导数等。
  • 各种常用的聚合函数: avg, min, max, sum, stats, value_count, cardinality, terms, min_bucket, max_bucket 等。
  • 如何使用嵌套聚合: 将不同类型的聚合组合起来,实现更复杂的数据分析。
  • 实战案例: 通过两个实际案例,展示了如何运用聚合查询解决真实的数据分析问题。

Elasticsearch 的聚合功能远不止于此。本文只是一个入门指南,涵盖了最基础和最常用的部分。要充分发挥 Elasticsearch 聚合的威力,你需要不断学习和实践,探索更高级的聚合类型和用法。

进一步学习的建议:

  • 阅读 Elasticsearch 官方文档: 官方文档是学习 ElasticSearch 的最佳资源。关于聚合的详细文档,请参考
  • 尝试更多的聚合类型: 除了本文介绍的聚合类型外,ElasticSearch 还提供了许多其他聚合类型,如 date_histogramrangefiltersgeo_distancepercentilestop_hits 等等。
  • 练习、练习、再练习: 最好的学习方法就是实践。尝试使用不同的数据集和不同的聚合组合,来解决各种数据分析问题。

希望本文能帮助你入门 Elasticsearch 聚合查询。祝你在数据分析的道路上不断进步!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/896889.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LLM 对话框组件 | 字节青训营前端开发项目

系统介绍 LLM对话框项目系统介绍 一、项目概述 选题背景随着人工智能技术的飞速发展,自然语言处理(NLP)领域取得了显著进展,其中对话系统(Dialog System)作为NLP的重要应用方向,正逐渐渗透到人们的日常生活中。从智能客服到语音助手,从智能家居到在线教育,对话系统以…

k8s命名空间和资源配额

在现代的云计算环境中&#xff0c;容器化技术已成为主流。而 Kubernetes&#xff08;简称 k8s&#xff09;作为一项开源的容器编排系统&#xff0c;广泛应用于各类场景。本文将详细介绍关于 k8s 中的命名空间和资源配额&#xff0c;帮助你更好地理解和管理你的集群资源。 k8s …

AI赋能企业协作4-NL2Sql技术路线

1.1 对话即服务的一点思考 在数智化转型的过程中&#xff0c;基于即时通信&#xff08;IM&#xff09;的协作平台正悄然成为企业智能化转型的“新基建”。协作平台天然具备高频交互、实时协同和场景化落地的特性&#xff0c;仿佛是为对话式AI量身定制的试验场——员工在熟悉的聊…

批量提取 Word 文档中的页面

如何将 Word 文档中的页面提取出来形成一个新的文档呢&#xff1f;比如将 Word 文档中的第一页提取出来、将 Word 文档中的最后一页提取出来、再或者将 Word 文档中的中间几页提取出来等等。人工的处理肯定非常的麻烦&#xff0c;需要新建 Word 文档&#xff0c;然后将内容复制…

Sqlserver安全篇之_启用TLS即配置SQL Server 数据库引擎以加密连接

官方文档 https://learn.microsoft.com/zh-cn/sql/database-engine/configure-windows/configure-sql-server-encryption?viewsql-server-ver16 https://learn.microsoft.com/zh-cn/sql/database-engine/configure-windows/manage-certificates?viewsql-server-ver15&pre…

多镜头视频生成、机器人抓取、扩散模型个性化 | Big Model weekly第58期

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 01 GLM-4-Voice: Towards Intelligent and Human-Like End-to-End Spoken Chatbot 本文介绍了一种名为GLM-4-Voice的智能且类人化的端到端语音聊天机器人。它支持中文和英文&#xff0c;能够进行实时语音对话&a…

MOM成功实施分享(七)电力电容制造MOM工艺分析与解决方案(第一部分)

声明&#xff1a;文章仅用于交流学习&#xff0c;不用于商业项目实施&#xff0c;图片来源于网络&#xff0c;如有侵犯权利&#xff0c;请联系作者及时删除。 本方案旨在对电力电容&#xff08;PEC和PQM型号&#xff09;制造工艺深度分析&#xff0c;结合管理要求设计MOM相关功…

JavaWeb后端基础(3)

原打算把Mysql操作数据库的一些知识写进去&#xff0c;但是感觉没必要&#xff0c;要是现在会的都是简单的增删改查&#xff0c;所以&#xff0c;这一篇&#xff0c;我直接从java操作数据库开始写&#xff0c;所以这一篇大致就是记一下JDBC、MyBatis、以及SpringBoot的配置文件…

移动端国际化翻译同步解决方案-V3

1.前言 因为软件出海&#xff0c;从在上上家公司就开始做翻译系统&#xff0c;到目前为止已经出了两个比较大的版本了&#xff0c;各个版本解决的痛点如下&#xff1a; V1版本&#xff1a; 主要针对的是AndroidiOS翻译不一致和翻译内容管理麻烦的问题&#xff0c;通过这个工具…

2.css简介

什么是css&#xff1a; CSS (Cascading Style Sheets&#xff0c;层叠样式表&#xff09;&#xff0c;是一种用来为结构化文档&#xff08;如 HTML 文档或 XML 应用&#xff09;添加样式&#xff08;字体、间距和颜色等&#xff09;的计算机语言&#xff0c;CSS 文件扩展名为 .…

机器人学习模拟框架 robosuite (3) 机器人控制代码示例

Robosuite框架是一个用于机器人模拟和控制的强大工具&#xff0c;支持多种类型的机器人。 官方文档&#xff1a;Overview — robosuite 1.5 documentation 开源地址&#xff1a;https://github.com/ARISE-Initiative/robosuite 目录 1、通过键盘或SpaceMouse远程控制机器人…

可终身授权的外国工具,不限次数使用!PDF转CAD的软件

最近有不少朋友问我有没有好用的CAD转换工具&#xff0c;今天就来给大家分享两款超实用的小软件&#xff0c;希望能帮到大家。 第一款软件是一款国外开发的&#xff0c;它专门用来把PDF文件转换成CAD格式&#xff0c;特别方便。 这款软件的操作非常简单&#xff0c;打开后无需安…

ffmpeg源码编译支持cuda

1.安装cuda CUDA Toolkit 11.3 Downloads | NVIDIA Developer 在选择组件的时候&#xff0c;将CUDA中的Nsight VSE和Visual Studio Integration取消勾选 不然会安装失败 2.编译ffmpeg 把cuda编译宏定义开启&#xff0c;再编译avcodec 3.编译livavutil报错struct "Cuda…

【北京迅为】iTOP-RK3568OpenHarmony系统南向驱动开发-第4章 UART基础知识

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

【计算机网络入门】初学计算机网络(十)(重要)

目录 1. 网络层的作用 2. IPV4 2.1 IP 数据报格式 2.2 IP地址分类方案 2.3 数据的转发 2.4 特殊用途的IP地址 3. 子网划分和子网掩码 3.1 子网划分 3.2 子网掩码 1. 网络层的作用 按照教学五层模型&#xff0c;应用层、传输层、网络层、数据链路层、物理层&#xff…

机器学习(五)

一&#xff0c;多类&#xff08;Multiclass&#xff09; 多类是指输出不止有两个输出标签&#xff0c;想要对多个种类进行分类。 Softmax回归算法&#xff1a; Softmax回归算法是Logistic回归在多类问题上的推广&#xff0c;和线性回归一样&#xff0c;将输入的特征与权重进行…

Windows安装nvm【超详细图解】

目录 前言 一、NVM下载 方式一&#xff1a;官网下载 方式二&#xff1a;GitHub 下载 二、NVM安装 镜像源配置 三、Node安装 四、环境变量配置 前言 NVM&#xff08;Node Version Manager&#xff09;是一个命令行工具&#xff0c;用于在一台计算机上轻松管理和切换多…

KVM虚拟机磁盘创建探究-2

使用 virt-install 命令自动创建磁盘镜像和使用 qemu-img 手动创建磁盘镜像&#xff0c;在磁盘镜像本身格式和基本功能上是一致的&#xff0c;但在一些特性如初始占用磁盘空间、创建时的可配置性等方面存在区别&#xff0c;下面以 QCOW2 格式磁盘镜像为例进行详细说明。 初始占…

京准电钟:NTP校时服务器于安防监控系统应用方案

京准电钟&#xff1a;NTP校时服务器于安防监控系统应用方案 京准电钟&#xff1a;NTP校时服务器于安防监控系统应用方案 NTP校时服务器在安防监控系统中的应用方案主要通过高精度时间同步技术&#xff0c;解决设备间时间差异问题&#xff0c;确保日志、录像等数据的时间一致性…

Linux网络_应用层自定义协议与序列化_守护进程

一.协议 协议是一种 "约定". socket api 的接口, 在读写数据时, 都是按 "字符串" 的方式来发送接 收的. 如果我们要传输一些 "结构化的数据" 怎么办呢? 其实&#xff0c;协议就是双方约定好的结构化的数据 像下面&#xff0c;两端都知道数据结构…