ElasticSearch Aggregation(八)

2024-02-27 16:58
文章标签 elasticsearch aggregation

本文主要是介绍ElasticSearch Aggregation(八),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • ElasticSearch Aggregation(八)
    • 管道聚合
      • cumulative sum聚合
        • 语法
      • Derivative 聚合
      • extended stats bucket聚合
        • 语法
      • 最大桶聚合
        • 语法
      • 最小桶聚合
      • moving function聚合
        • 语法
        • 自定义用户脚本
        • 内置函数
      • Moving percentiles聚合
        • 语法
      • 百分位桶聚合
        • 语法
      • stats bucket聚合
        • 语法
      • sum bucket聚合
        • 语法

ElasticSearch Aggregation(八)

管道聚合

cumulative sum聚合

一种父管道聚合,它计算父直方图聚合中指定指标的累积和(当前分桶指标的累积和等于前几个桶指标的累加总和)。指定的指标必须是数值,并且外围的直方图必须将min_doc_count设置为0(直方图聚合的默认值)。

语法

cumulative_sum语法为:

{"cumulative_sum": {"buckets_path": "the_sum"}
}

以下代码段计算每月总销售额的累计总和:

curl -X POST "localhost:9200/sales/_search?pretty" -H 'Content-Type: application/json' -d'
{"size": 0,"aggs": {"sales_per_month": {"date_histogram": {"field": "date","calendar_interval": "month"},"aggs": {"sales": {"sum": {"field": "price"}},"cumulative_sales": {"cumulative_sum": {"buckets_path": "sales" }}}}}
}
'

响应:

{"took": 11,"timed_out": false,"_shards": ...,"hits": ...,"aggregations": {"sales_per_month": {"buckets": [{"key_as_string": "2015/01/01 00:00:00","key": 1420070400000,"doc_count": 3,"sales": {"value": 550.0},"cumulative_sales": {"value": 550.0}},{"key_as_string": "2015/02/01 00:00:00","key": 1422748800000,"doc_count": 2,"sales": {"value": 60.0},"cumulative_sales": {"value": 610.0}},{"key_as_string": "2015/03/01 00:00:00","key": 1425168000000,"doc_count": 2,"sales": {"value": 375.0},"cumulative_sales": {"value": 985.0}}]}}
}

通过以上例子中2015/03/01 00:00:00桶中的累积和聚合为例。他的累积和等会550.0+60.0+375.0=985.0

Derivative 聚合

衍生聚合。略

extended stats bucket聚合

同级管道聚合,它计算同级聚合中指定指标的所有存储桶的各种统计信息。指定的指标必须是数字,同级聚合必须是多桶聚合。

语法

extended_stats_bucket聚合语法为:

{"extended_stats_bucket": {"buckets_path": "the_sum"}
}

以下代码段计算每月销售桶的扩展统计数据:

curl -X POST "localhost:9200/sales/_search?pretty" -H 'Content-Type: application/json' -d'
{"size": 0,"aggs": {"sales_per_month": {"date_histogram": {"field": "date","calendar_interval": "month"},"aggs": {"sales": {"sum": {"field": "price"}}}},"stats_monthly_sales": {"extended_stats_bucket": {"buckets_path": "sales_per_month>sales" }}}
}
'

响应:

{"took": 11,"timed_out": false,"_shards": ...,"hits": ...,"aggregations": {"sales_per_month": {"buckets": [{"key_as_string": "2015/01/01 00:00:00","key": 1420070400000,"doc_count": 3,"sales": {"value": 550.0}},{"key_as_string": "2015/02/01 00:00:00","key": 1422748800000,"doc_count": 2,"sales": {"value": 60.0}},{"key_as_string": "2015/03/01 00:00:00","key": 1425168000000,"doc_count": 2,"sales": {"value": 375.0}}]},"stats_monthly_sales": {"count": 3,"min": 60.0,"max": 550.0,"avg": 328.3333333333333,"sum": 985.0,"sum_of_squares": 446725.0,"variance": 41105.55555555556,"variance_population": 41105.55555555556,"variance_sampling": 61658.33333333334,"std_deviation": 202.74505063146563,"std_deviation_population": 202.74505063146563,"std_deviation_sampling": 248.3109609609156,"std_deviation_bounds": {"upper": 733.8234345962646,"lower": -77.15676792959795,"upper_population" : 733.8234345962646,"lower_population" : -77.15676792959795,"upper_sampling" : 824.9552552551645,"lower_sampling" : -168.28858858849787}}}
}

最大桶聚合

一个同级管道聚合,它用同级聚合中指定指标的最大值来标识桶,并输出桶的值和键。指定的指标必须是数值,并且同级聚合必须是多桶聚合。

语法

max_bucket语法如下:

{"max_bucket": {"buckets_path": "the_sum"}
}

以下代码段计算每月总销售额的最大值:

curl -X POST "localhost:9200/sales/_search?pretty" -H 'Content-Type: application/json' -d'
{"size": 0,"aggs": {"sales_per_month": {"date_histogram": {"field": "date","calendar_interval": "month"},"aggs": {"sales": {"sum": {"field": "price"}}}},"max_monthly_sales": {"max_bucket": {"buckets_path": "sales_per_month>sales" }}}
}
'

以下可能是响应:

{"took": 11,"timed_out": false,"_shards": ...,"hits": ...,"aggregations": {"sales_per_month": {"buckets": [{"key_as_string": "2015/01/01 00:00:00","key": 1420070400000,"doc_count": 3,"sales": {"value": 550.0}},{"key_as_string": "2015/02/01 00:00:00","key": 1422748800000,"doc_count": 2,"sales": {"value": 60.0}},{"key_as_string": "2015/03/01 00:00:00","key": 1425168000000,"doc_count": 2,"sales": {"value": 375.0}}]},"max_monthly_sales": {"keys": ["2015/01/01 00:00:00"], "value": 550.0}}
}

最小桶聚合

与最大桶聚合类似

moving function聚合

给定一系列有序的数据,Moving Function聚合将在数据之间生成一个滑动窗口,并允许用户指定在每个数据窗口上执行自定义脚本。为了方便起见,预定义了一些常用函数,如最小/最大值、移动平均值等。

语法

moving_fn聚合语法如下:

{"moving_fn": {"buckets_path": "the_sum","window": 10,"script": "MovingFunctions.min(values)"}
}

moving_fn 聚合必须嵌入到直方图或 date_histogram 聚合中。它们可以像任何其他指标聚合一样嵌入:

curl -X POST "localhost:9200/_search?pretty" -H 'Content-Type: application/json' -d'
{"size": 0,"aggs": {"my_date_histo": {                  "date_histogram": {"field": "date","calendar_interval": "1M"},"aggs": {"the_sum": {"sum": { "field": "price" }   },"the_movfn": {"moving_fn": {"buckets_path": "the_sum",  "window": 10,"script": "MovingFunctions.unweightedAvg(values)"}}}}}
}
'

移动平均通过第一个指定的histogram或者date_histogram上的字段来构建。然后,您可以选择在该直方图中添加数字指标,例如总和。最后,moving_fn 被嵌入到直方图中。然后buckets_path 参数用于“指向”直方图中的同级指标之一。

来自上述聚合的示例响应可能如下所示:

{"took": 11,"timed_out": false,"_shards": ...,"hits": ...,"aggregations": {"my_date_histo": {"buckets": [{"key_as_string": "2015/01/01 00:00:00","key": 1420070400000,"doc_count": 3,"the_sum": {"value": 550.0},"the_movfn": {"value": null}},{"key_as_string": "2015/02/01 00:00:00","key": 1422748800000,"doc_count": 2,"the_sum": {"value": 60.0},"the_movfn": {"value": 550.0}},{"key_as_string": "2015/03/01 00:00:00","key": 1425168000000,"doc_count": 2,"the_sum": {"value": 375.0},"the_movfn": {"value": 305.0}}]}}
}
自定义用户脚本

移动函数聚合允许用户指定任意脚本来定义自定义逻辑。每次收集新的数据窗口时都会调用该脚本。这些值在values变量中提供给脚本。然后,脚本应该执行某种计算,并生成一个double作为结果。不允许发出null,尽管NaN+/- Inf是允许的。

例如,此脚本将简单地返回窗口中的第一个值,如果没有可用值,则返回 NaN

curl -X POST "localhost:9200/_search?pretty" -H 'Content-Type: application/json' -d'
{"size": 0,"aggs": {"my_date_histo": {"date_histogram": {"field": "date","calendar_interval": "1M"},"aggs": {"the_sum": {"sum": { "field": "price" }},"the_movavg": {"moving_fn": {"buckets_path": "the_sum","window": 10,"script": "return values.length > 0 ? values[0] : Double.NaN"}}}}}
}
'
内置函数
  • max()
  • min()
  • sum()
  • stdDev()
  • unweightedAvg()
  • linearWeightedAvg()
  • ewma()
  • holt()
  • holtWinters()

这些函数可从 MovingFunctions 命名空间获得。例如。MovingFunctions.max()

Moving percentiles聚合

给定一系列有序的百分位数,移动百分位数聚合将在这些百分位数上滑动一个窗口,并允许用户计算累积百分位数

这在概念上与移动函数管道聚合非常相似,不同之处在于它适用于百分位数草图而不是实际的桶值。

语法

move_percentiles 聚合看起来像这样:

{"moving_percentiles": {"buckets_path": "the_percentile","window": 10}
}

move_percentiles 聚合必须嵌入到 histogramdate_histogram 聚合中。它们可以像任何其他指标聚合一样嵌入:

curl -X POST "localhost:9200/_search?pretty" -H 'Content-Type: application/json' -d'
{"size": 0,"aggs": {"my_date_histo": {                          "date_histogram": {"field": "date","calendar_interval": "1M"},"aggs": {"the_percentile": {                     "percentiles": {"field": "price","percents": [ 1.0, 99.0 ]}},"the_movperc": {"moving_percentiles": {"buckets_path": "the_percentile",   "window": 10}}}}}
}
'

以下可能是响应:

{"took": 11,"timed_out": false,"_shards": ...,"hits": ...,"aggregations": {"my_date_histo": {"buckets": [{"key_as_string": "2015/01/01 00:00:00","key": 1420070400000,"doc_count": 3,"the_percentile": {"values": {"1.0": 150.0,"99.0": 200.0}}},{"key_as_string": "2015/02/01 00:00:00","key": 1422748800000,"doc_count": 2,"the_percentile": {"values": {"1.0": 10.0,"99.0": 50.0}},"the_movperc": {"values": {"1.0": 150.0,"99.0": 200.0}}},{"key_as_string": "2015/03/01 00:00:00","key": 1425168000000,"doc_count": 2,"the_percentile": {"values": {"1.0": 175.0,"99.0": 200.0}},"the_movperc": {"values": {"1.0": 10.0,"99.0": 200.0}}}]}}
}

百分位桶聚合

同级管道聚合,计算同级聚合中指定指标的所有bucket的百分比。指定的指标必须是数值,并且同级聚合必须是多桶聚合。

语法

percentiles_bucket` 聚合看起来像这样:

{"percentiles_bucket": {"buckets_path": "the_sum"}
}

以下代码段计算每月总销售额的百分位数:

curl -X POST "localhost:9200/sales/_search?pretty" -H 'Content-Type: application/json' -d'
{"size": 0,"aggs": {"sales_per_month": {"date_histogram": {"field": "date","calendar_interval": "month"},"aggs": {"sales": {"sum": {"field": "price"}}}},"percentiles_monthly_sales": {"percentiles_bucket": {"buckets_path": "sales_per_month>sales", "percents": [ 25.0, 50.0, 75.0 ]         }}}
}
'

以下可能是响应:

{"took": 11,"timed_out": false,"_shards": ...,"hits": ...,"aggregations": {"sales_per_month": {"buckets": [{"key_as_string": "2015/01/01 00:00:00","key": 1420070400000,"doc_count": 3,"sales": {"value": 550.0}},{"key_as_string": "2015/02/01 00:00:00","key": 1422748800000,"doc_count": 2,"sales": {"value": 60.0}},{"key_as_string": "2015/03/01 00:00:00","key": 1425168000000,"doc_count": 2,"sales": {"value": 375.0}}]},"percentiles_monthly_sales": {"values" : {"25.0": 375.0,"50.0": 375.0,"75.0": 550.0}}}
}

stats bucket聚合

同级管道聚合,它计算同级聚合中指定度量的所有bucket的各种统计信息。指定的度量必须是数值,并且同级聚合必须是多桶聚合。

语法

stats_bucket 聚合如下所示:

{"stats_bucket": {"buckets_path": "the_sum"}
}

以下代码段计算每月销售额的统计数据:

curl -X POST "localhost:9200/sales/_search?pretty" -H 'Content-Type: application/json' -d'
{"size": 0,"aggs": {"sales_per_month": {"date_histogram": {"field": "date","calendar_interval": "month"},"aggs": {"sales": {"sum": {"field": "price"}}}},"stats_monthly_sales": {"stats_bucket": {"buckets_path": "sales_per_month>sales" }}}
}
'

以下可能是响应:

{"took": 11,"timed_out": false,"_shards": ...,"hits": ...,"aggregations": {"sales_per_month": {"buckets": [{"key_as_string": "2015/01/01 00:00:00","key": 1420070400000,"doc_count": 3,"sales": {"value": 550.0}},{"key_as_string": "2015/02/01 00:00:00","key": 1422748800000,"doc_count": 2,"sales": {"value": 60.0}},{"key_as_string": "2015/03/01 00:00:00","key": 1425168000000,"doc_count": 2,"sales": {"value": 375.0}}]},"stats_monthly_sales": {"count": 3,"min": 60.0,"max": 550.0,"avg": 328.3333333333333,"sum": 985.0}}
}

sum bucket聚合

一个同级管道聚合,它计算同级聚合中指定度量的所有桶的总和。指定的度量必须是数值,并且同级聚合必须是多桶聚合。

语法

sum_bucket 聚合看起来像这样:

{"sum_bucket": {"buckets_path": "the_sum"}
}

以下代码段计算所有每月总销售额的总和:

curl -X POST "localhost:9200/sales/_search?pretty" -H 'Content-Type: application/json' -d'
{"size": 0,"aggs": {"sales_per_month": {"date_histogram": {"field": "date","calendar_interval": "month"},"aggs": {"sales": {"sum": {"field": "price"}}}},"sum_monthly_sales": {"sum_bucket": {"buckets_path": "sales_per_month>sales" }}}
}
'

以下可能是响应:

{"took": 11,"timed_out": false,"_shards": ...,"hits": ...,"aggregations": {"sales_per_month": {"buckets": [{"key_as_string": "2015/01/01 00:00:00","key": 1420070400000,"doc_count": 3,"sales": {"value": 550.0}},{"key_as_string": "2015/02/01 00:00:00","key": 1422748800000,"doc_count": 2,"sales": {"value": 60.0}},{"key_as_string": "2015/03/01 00:00:00","key": 1425168000000,"doc_count": 2,"sales": {"value": 375.0}}]},"sum_monthly_sales": {"value": 985.0}}
}

这篇关于ElasticSearch Aggregation(八)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/753050

相关文章

Java操作ElasticSearch的实例详解

《Java操作ElasticSearch的实例详解》Elasticsearch是一个分布式的搜索和分析引擎,广泛用于全文搜索、日志分析等场景,本文将介绍如何在Java应用中使用Elastics... 目录简介环境准备1. 安装 Elasticsearch2. 添加依赖连接 Elasticsearch1. 创

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

ElasticSearch的DSL查询⑤(ES数据聚合、DSL语法数据聚合、RestClient数据聚合)

目录 一、数据聚合 1.1 DSL实现聚合 1.1.1 Bucket聚合  1.1.2 带条件聚合 1.1.3 Metric聚合 1.1.4 总结 2.1 RestClient实现聚合 2.1.1 Bucket聚合 2.1.2 带条件聚合 2.2.3 Metric聚合 一、数据聚合 聚合(aggregations)可以让我们极其方便的实现对数据的统计、分析、运算。例如:

【docker】基于docker-compose 安装elasticsearch + kibana + ik分词器(8.10.4版本)

记录下,使用 docker-compose 安装 Elasticsearch 和 Kibana,并配置 IK 分词器,你可以按照以下步骤进行。此过程适用于 Elasticsearch 和 Kibana 8.10.4 版本。 安装 首先,在你的工作目录下创建一个 docker-compose.yml 文件,用于配置 Elasticsearch 和 Kibana 的服务。 version:

ElasticSearch底层原理简析

1.ElasticSearch简述 ElastiaSearch(以下简称ES)是一个基于Lucene的搜索服务器,它提供了一个分布式多用户能力的全文搜索引擎,支持RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。ES设计用于云计算中,能够进行实时搜索,支持PB级搜索,具有稳定,可靠,快速,安装使用方便等

ElasticSearch 6.1.1 通过Head插件,新建索引,添加文档,及其查询数据

ElasticSearch 6.1.1 通过Head插件,新建索引,添加文档,及其查询; 一、首先启动相关服务: 二、新建一个film索引: 三、建立映射: 1、通过Head插件: POST http://192.168.1.111:9200/film/_mapping/dongzuo/ {"properties": {"title": {"type":

ElasticSearch 6.1.1运用代码添加索引及其添加,修改,删除文档

1、新建一个MAVEN项目:ElasticSearchTest 2、修改pom.xml文件内容: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.or

Windows下安装Elasticsearch,启动报错,解决方法,访问

对于Windows用户,我们推荐使用MSI安装包进行安装。这个安装包使用图形用户界面来引导你进行安装。 首先,从这里https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.1.1.msi下载Elasticsearch 6.1.1的MSI安装包。 然后双击下载好的安装包文件启动图形化安装程序,在第一个界面,选

Elasticsearch:无状态世界中的数据安全

作者:来自 Elastic Henning Andersen 在最近的博客文章中,我们宣布了支持 Elastic Cloud Serverless 产品的无状态架构。通过将持久性保证和复制卸载到对象存储(例如 Amazon S3),我们获得了许多优势和简化。 从历史上看,Elasticsearch 依靠本地磁盘持久性来确保数据安全并处理陈旧或孤立的节点。在本博客中,我们将讨论无状态的数据持

ElasticSearch的DSL查询④(DSL查询、RestClient的DSL查询)

目录 一、DSL查询 1.1 快熟入门 1.2 叶子查询 1.2.1 全文检索查询 1)match查询 2)multi_match查询 1.2.2 精确查询 1)term查询 2)range查询 3)ids查询 1.3 复合查询 1.3.1 bool查询 1.3.2 算分函数查询 1)基本语法: 2)运行流程: 3)示例: 4)执行结果: 1.4 排序 1.5