Elasticsearch的聚集统计,可以进行各种统计分析

说明: Elasticsearch不仅是一个大数据搜索引擎,也是一个大数据分析引擎。它的聚集(aggregation)统计的REST端点可用于实现与统计分析有关的功能。Elasticsearch提供的聚集分为三大类。

  1. 度量聚集(Metric aggregation):度量聚集可以用于计算搜索结果在某个字段上的数量统计指标,比如平均值、最大值、最小值、总和等。
  2. 桶聚集(Bucket aggregation):桶聚集可以在某个字段上划定一些区间,每个区间是一个“桶”,然后按照搜索结果的文档内容把文档归类到它所属的桶中,统计的结果能明确每个桶中有多少文档。桶聚集还可以嵌套其他的桶聚集或者度量聚集来进行一些复杂的指标计算。
  3. 管道聚集(Pipeline aggregation):管道聚集就是把桶聚集统计的结果作为输入来继续做聚集统计,会在桶聚集的结果中追加一些额外的统计数据。

1.1、平均值聚集

平均值聚集用来计算索引中某个数值字段的平均值,对索引sougoulog的字段rank求平均值的聚集请求如下。

POST sougoulog/_search
{"query": {"match_all": {}},"size": 0,"aggs": {"rank_avg": {"avg": {"field": "rank","missing": 0}}}
}

在这个请求中,aggs的参数使用了一个类型为avg的聚集,它会对rank字段求平均值,请求中的missing参数表示如果遇到rank字段为null的文档,则当作0计算。这一聚集被命名为rank_avg,当然得新建索引,添加数据。

1.2 最大值和最小值聚集

使用最大值和最小值聚集可以快速地得到搜索结果中某个数值字段的最大值、最小值,例如,获取rank字段的最大值的请求如下。

POST sougoulog/_search
{"query": {"match_all": {}},"size": 0,"aggs": {"rank_max": {"max": {"field": "rank","missing": 0}}}
}

同理,如果要得到rank字段的最小值,把聚集类型设置为min即可。

1.3 求和聚集

与平均值聚集类似,求和聚集可以让搜索结果在某个数值字段上求和。

POST sougoulog/_search
{"query": {"match_all": {}},"size": 0,"aggs": {"rank_sum": {"sum": {"field": "rank","missing": 0}}}
}

1.4 统计聚集统计

聚集可以一次性返回搜索结果在某个数值字段上的最大值、最小值、平均值、个数、总和。

POST sougoulog/_search
{"query": {"match_all": {}},"size": 0,"aggs": {"rank_stats": {"stats": {"field": "rank","missing": 0}}}
}

2.1 百分比聚集

百分比聚集用于近似地查看搜索结果中某个字段的百分比分布数据,你可以根据搜索结果清晰地看出某个值以内的数据在整体数据集中的占比。例如,对sougoulog的rank字段做百分比聚集的请求如下。

POST sougoulog/_search
{"query": {"match_all": {}},"size": 0,"aggs": {"rank_percent": {"percentiles": {"field": "rank"}}}
}

2.2 百分比等级聚集

百分比等级聚集跟百分比聚集的参数恰好相反,传入一组值,就可以看到这个值以内的数据占整体数据的百分比。例如:

POST sougoulog/_search
{"query": {"match_all": {}},"size": 0,"aggs": {"percent_ranks": {"percentile_ranks": {"field": "rank","values": [ 10, 50 ]}}}
}

在这个聚集请求中,把聚集类型设置为percentile_ranks表示发起百分比等级聚集,values用来设置需要查看的rank值,可以得到以下结果。

"aggregations" : {"percent_ranks" : {"values" : {"10.0" : 82.98,"50.0" : 94.22}}}

这个结果表明,有82.98%的文档rank值小于等于10,有94.22%的文档rank值小于等于50。

2 桶聚集

桶聚集会按照某个字段划分出一些区间,把搜索结果的每个文档按照字段所在的区间划分到桶中,桶聚集会返回每个桶拥有的文档数目。桶的数目既可以用参数确定,也可以在执行过程中按照数据内容动态生成。桶的默认上限数目是65535,返回的桶数目超过这个数目会报错。另外,桶聚集可以嵌套其他的聚集来得到一些复杂的统计结果,度量聚集是不能嵌套其他子聚集的。

2.1 范围聚集范围

聚集需要你提供一组左闭右开的区间,在返回的结果中会得到搜索结果的某个字段落在每个区间的文档数目,参数from用于提供区间下界,to用于提供区间上界。统计的字段既可以是数值类型的字段也可以是日期类型的字段。例如:

POST sougoulog/_search
{"query": {"match_all": {}},"size": 0,"aggs": {"range_rank": {"range": {"field": "rank","ranges": [{"to": 20},{"from": 20,"to": 50},{"from": 50}]}}}
}

此时的聚集类型为range,field设置了统计的字段为rank,ranges提供区间内容,得到的结果如下。

"aggregations" : {"range_rank" : {"buckets" : [{"key" : "*-20.0","to" : 20.0,"doc_count" : 8895},{"key" : "20.0-50.0","from" : 20.0,"to" : 50.0,"doc_count" : 521},{"key" : "50.0-*","from" : 50.0,"doc_count" : 584}]}}

这个结果表示,有8895个文档的rank值小于20,有521个文档的rank值大于等于20小于50,rank值大于等于50的文档有584个。

2.2 日期范围聚集

日期范围聚集是一种特殊的范围聚集,它要求统计的字段类型必须是日期类型,在索引test-3-2-1中保存的日期字段born用的是UTC时间,下面的代码会实现在这个born字段上做日期范围聚集。

POST test-3-2-1/_search
{"query": {"match_all": {}},"size": 10,"aggs": {"range_rank": {"date_range": {"field": "born","ranges": [{"from": "2020-09-11 00:00:00","to": "2020-10-11 00:00:00"},{"from": "2020-10-11 00:00:00","to": "2020-11-11 00:00:00"}]}}}
}

2.3 直方图聚集

直方图聚集经常用于做一些柱状图和折线图的展示,它可以选择一个数值或日期字段,然后根据字段的最小值和区间步长生成一组区间,统计出每个区间的文档数目。例如:

POST sougoulog/_search
{"query": {"match_all": {}},"size": 0,"aggs": {"histogram_rank": {"histogram": {"field": "rank","interval": 400,"extended_bounds": {"min": 0,"max": 1500}}}}
}

上面的请求使用extended_bounds中的max设置区间的上限,使用min设置区间的下限

"aggregations" : {"histogram_rank" : {"buckets" : [{"key" : 0.0,"doc_count" : 9760},{"key" : 400.0,"doc_count" : 9},{"key" : 800.0,"doc_count" : 231},{"key" : 1200.0,"doc_count" : 0}]}}

0表示0-400的数据,400表示4000-800的数据,其他依次类推。

2.4 日期直方图聚集

日期直方图聚集的功能和直方图聚集的基本一样,但它只能在日期字段上做聚集,常用于做时间维度的统计分析。使用它可以非常方便地设置时间间隔,既可以是固定长度的时间间隔,也可以是日历时间间隔,例如你想了解每个月文档的数量分布,由于大小月的关系,应该把时间间隔设置为month,而不是固定为30天。参数calendar_interval用于设置日历时间间隔,可选配置如下。
在这里插入图片描述
下面来尝试实现日期直方图聚集,只需要传入时间间隔就可以切分区间,不用像范围聚集那样需传入每个区间的边界。

POST test-3-2-1/_search
{"query": {"match_all": {}},"size": 10,"aggs": {"range_rank": {"date_histogram": {"field": "born","calendar_interval": "month","time_zone": "+08:00"}}}
}

2.5 缺失聚集

使用缺失聚集可以很方便地统计出索引中某个字段缺失或者为空的文档数量。例如:

POST test-3-2-1/_search
{"query": {"match_all": {}},"size": 10,"aggs": {"miss": {"missing": {"field": "age"}}}
}

该聚集请求直接返回age字段为空的文档数量。

2.6 过滤器聚集

过滤器聚集往往作为其他聚集的父聚集使用,它可以在其他的聚集开始之前去掉一些文档使其不纳入统计,但是过滤器聚集的过滤条件对搜索结果不起作用。也就是说,它只过滤聚集结果,不过滤搜索结果。例如:

POST test-3-2-1/_search
{"query": {"match_all": {}},"size": 0,"aggs": {"filteraggs": {"filter": {"term": {"name.keyword": "张三"}},"aggs": {"names": {"terms": {"field": "name.keyword","size": 10}}}}}
}

在这个嵌套聚集请求中,先使用过滤器聚集只保留姓名为“张三”的文档,然后嵌套了词条聚集,聚集的结果只出现一个桶,但是搜索结果还是会返回所有的文档。这里设置了size为0没有展示搜索详情,但是如下所示total已经返回了全部文档总数。

2.7 多过滤器聚集

跟过滤器聚集相比,多过滤器聚集允许添加多个过滤条件,每个条件生成一个桶,聚集结果会返回每个桶匹配的文档数。你还可以把不属于任何过滤器的文档全部放入一个名为“other”的桶。例如:

POST test-3-2-1/_search
{"query": {"match_all": {}},"size": 0,"aggs": {"filtersaggs": {"filters": {"other_bucket": true,"filters": {"zhang": {"match": {"name": "张"}},"wang": {"match": {"name": "王"}}}}}}
}

这个请求定义了两个过滤条件,分别用match搜索姓名包含“张”和“王”的文档,搜索的结果数会各自返回到桶中,other_bucket参数设置为true表示显示不属于任何过滤器的文档数到名为“other”的桶中

3、管道聚集

前面谈到的聚集都是对索引的文档数据进行统计,但是管道聚集统计的对象不是索引中的文档数据,它是对桶聚集产生的结果做进一步聚集从而得到一些新的统计结果。管道聚集需要你提供一个桶聚集的相对路径来确定统计的桶对象。根据管道聚集出现的位置,管道聚集可以分为父管道聚集和兄弟管道聚集。

3.1 平均桶聚集

假如你通过日期直方图聚集或直方图聚集产生了3个桶,现在你想对这3个桶的统计值取平均值并做展示,这时候就可以使用平均桶聚集,例如:

POST sougoulog/_search
{"query": {"match_all": {}},"size": 0,"aggs": {"date": {"date_histogram": {"field": "visittime","fixed_interval": "4m"},"aggs": {"rank_avg": {"avg": {"field": "rank"}}}},"rank_sum":{"avg_bucket": {"buckets_path": "date>rank_avg"}}}
}

“buckets_path”: "date>rank_avg"表示执行顺序,先用date进行时间分割,后面都数据求平均值。

.3.2 求和桶聚集

除了可以对桶聚集的值求平均值,还可以使用sum_bucket对多个桶的值求和。例如:

POST sougoulog/_search
{"query": {"match_all": {}},"size": 0,"aggs": {"date": {"date_histogram": {"field": "visittime","fixed_interval": "4m"},"aggs": {"rank_sum": {"sum": {"field": "rank"}}}},"rank_sum":{"sum_bucket": {"buckets_path": "date>rank_sum"}}}
}

3.3 最大桶和最小桶聚集

最大桶和最小桶聚集分别用于求多个桶的最大值和最小值,使用方法与求和桶聚集类似。例如:

POST sougoulog/_search
{"query": {"match_all": {}},"size": 0,"aggs": {"date": {"date_histogram": {"field": "visittime","fixed_interval": "4m"},"aggs": {"rank_data": {"stats": {"field": "rank"}}}},"max_rank":{"max_bucket": {"buckets_path": "date>rank_data.max"}}}
}

3.4 差值聚集差值

聚集用于计算直方图聚集的相邻桶数据的增量值,它也是父管道聚集。例如:

POST sougoulog/_search
{"query": {"match_all": {}},"size": 0,"aggs": {"date": {"date_histogram": {"field": "visittime","fixed_interval": "4m"},"aggs": {"avg_rank": {"avg": {"field": "rank"}},"hb":{"derivative": {"buckets_path": "avg_rank"}}}}}
}

差值聚集可以用于计算相邻桶数据的环比增长值,因此从第二个桶开始才有统计结果,结果如下。

"aggregations" : {"date" : {"buckets" : [{"key_as_string" : "00:00:00","key" : 0,"doc_count" : 4231,"avg_rank" : {"value" : 13.434885369888915}},{"key_as_string" : "00:04:00","key" : 240000,"doc_count" : 4115,"avg_rank" : {"value" : 46.68262454434994},"hb" : {"value" : 33.247739174461024}},{"key_as_string" : "00:08:00","key" : 480000,"doc_count" : 1654,"avg_rank" : {"value" : 47.66142684401451},"hb" : {"value" : 0.9788022996645651}}]}}

6.3 使用fielddata聚集

text字段通过前面的讲解,你应该已经学会了Elasticsearch支持的各种常用的聚集方式,然而这些聚集请求的聚集字段均未使用text字段,原因是实现聚集统计时需要使用字段的doc value值,而text字段不支持doc value。为了让text字段也能做聚集统计,Elasticsearch给text字段提供了fielddata字段数据功能,使用该功能可以在内存中临时生成字段的doc value值,从而实现对text字段做聚集统计。字段数据是一种缓存机制,它会取出字段的值放入内存,可用于排序和聚集统计。

先建立一个映射fielddata-test,它只有一个text字段,在映射中开启字段数据功能。

PUT fielddata-test
{"mappings": {"properties": {"content": {"type": "text","fielddata": true}}}
}

然后向其中添加一条数据。

PUT fielddata-test/_doc/1
{"content":"hello php java"
}

尝试在这个text字段上做词条聚集。

POST fielddata-test/_search
{"query": {"match_all": {}},"aggs": {"termdata": {"terms": {"field": "content","size": 10}}}
}

要显示内存中的content字段数据所占用的大小,可以使用以下代码。

id                         host      ip        node   field   size
EijMhNrDSoy-Bbmo3W8JGA 127.0.0.1 127.0.0.1 node-1 content  512b

字段数据可能会消耗大量内存,为了防止内存被字段数据过度消耗,可以在elasticsearch.yml中使用indices.fielddata.cache.size配置字段数据消耗内存的上限,可以给定一个百分比值,也可以给定具体大小值,该参数配置完后需要重启集群才能生效。

除了内存上限的配置,还可以使用字段数据的断路器,它会评估一个请求使用字段数据消耗的内存量,如果消耗的内存量超过indices.breaker.request.limit中配置的数值,它就会终止该请求继续消耗内存,这种配置可以使用REST端点动态修改,代码如下。

PUT /_cluster/settings
{"persistent" : {"indices.breaker.request.limit" : "30%"}
}

6.4 给聚集请求添加后过滤器

给聚集请求添加后过滤器前面已经介绍过两种过滤器,一种是在布尔查询的过滤上下文中添加搜索条件,另一种是过滤器聚集。本节介绍的后过滤器与它们都有区别。
在这里插入图片描述
由于后过滤器是在生成聚集统计结果之后对搜索结果进行过滤,所以它对聚集统计的结果没有任何影响,你可以在聚集请求的后面添加一个后过滤器,例如:

POST test-3-2-1/_search
{"query": {"match_all": {}},"size": 10,"aggs": {"names": {"terms": {"field": "name.keyword","size": 10}}},"post_filter": {"term": {"name.keyword": "张三"}}
}

这个请求把后过滤器的过滤条件放到了聚集请求的后面,表示搜索结果只显示名字为“张三”的数据,聚集统计的结果是索引的全部文档,代码如下。

"hits" : {"total" : {"value" : 1,"relation" : "eq"},"max_score" : 1.0,"hits" : [{"_index" : "test-3-2-1","_type" : "_doc","_id" : "1","_score" : 1.0,"_source" : {"id" : "1","sex" : false,"name" : "张三","born" : "2020-09-11 00:02:20","location" : {"lat" : 41.12,"lon" : -71.34}}}]},"aggregations" : {"names" : {"doc_count_error_upper_bound" : 0,"sum_other_doc_count" : 0,"buckets" : [{"key" : "王五","doc_count" : 1},{"key" : "张三","doc_count" : 1},{"key" : "赵二","doc_count" : 1},{"key" : "李四","doc_count" : 1}]}}

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

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

相关文章

MyBatisPlus的使用【详细】

目录 Mybatis MybatisPlus特性 MybatisPlus的使用 常见注解 TableName TableId TableField MP常见配置 条件查询器Wrapper QueryWrapper UpdateWrapper LambdaQueryWrapper 自定义SQL Service接口 批量添加数据 MP的代码生成 MP静态工具 MP扩展功能之逻辑删除…

C++栈、队列、优先级队列模拟+仿函数

目录 一、栈的模拟和deque容器 1.deque 1.1deque结构 1.2deque优缺点 2.stack模拟 二、队列的模拟 三、priority_queue优先级队列 1.优先级队列模拟 2.添加仿函数 一、栈的模拟和deque容器 在之前,我们学过了C语言版本的栈,可以看这篇文章 栈和…

【刷题篇】笔试真题

文章目录 复数乘法一年中的第几天字符串相加字符串相乘 复数乘法 复数 可以用字符串表示,遵循 “实部虚部i” 的形式,并满足下述条件: 实部 是一个整数,取值范围是 [-100, 100] 虚部 也是一个整数,取值范围是 [-100, 1…

MySQL字段加密方案 安当加密

要通过安当KSP密钥管理系统实现MySQL数据库字段的加密,您可以按照以下步骤进行操作: 安装和配置安当KSP密钥管理系统:首先,您需要安装安当KSP密钥管理系统,并按照说明进行配置。确保您已经正确地设置了密钥管理系统的用…

C语言知识回顾

链接:https://pan.baidu.com/s/1CiB1Ydm4LTV6hZE8wx0VFw?pwdna4z 提取码:na4z --来自百度网盘超级会员V6的分享

判断过/欠拟合和学习率

一、说明 这篇博客是判断是否过拟合和学习率大小的问题,并没有给出解决办法。因为每个人的网络模型不一样,解决办法也不同。因此,如果需要解决办法的话,请参考其他博客。 二、拟合问题 1.train_loss 不断下降,test_los…

【Linux系统编程:信号】产生信号 | 阻塞信号 | 处理信号 | 可重入函数

写在前面 通过学习信号可以理解进程与进程的一个相对关系,还能理解操作系统与进程的关系。要注意的是进程间通信中的信号量与这里的信号没有半毛钱关系,就像老婆和老婆饼。 本文要点: 掌握 Linux 信号的基本概念掌握信号产生的一般方式理解…

Unity之ShaderGraph如何实现触电电流效果

前言 之前使用ASE做过一个电流效果的shader,今天我们通过ShaderGraph来实现一个电流效果。 效果如下: 关键节点 Simple Noise:根据输入UV生成简单噪声或Value噪声。生成的噪声的大小由输入Scale控制。 Power:返回输入A的结果…

统信UOS技术开放日:四大领域全面接入AI大模型能力

1024是程序员的节日,10月24日,统信举办2023统信UOS技术开放日暨deepin Meetup北京站活动,发布与大模型同行的UOS AI、浏览器AI助手、邮箱AI助手、自然语言全局搜索、畅写在线等多项最新AI技术与产品应用。 统信软件高级副总经理、CTO、深度社…

周记之马上要答辩了

“ 要变得温柔和强大,就算哪天突然孤身一人,也能平静地活下去,不至于崩溃。” 10.16 今天提前写完了一篇六级阅读,积累了一些词组: speak out against 公然反对,印象最深刻的就这个; 先了解…

opencv dnn模块 示例(19) 目标检测 object_detection 之 yolox

文章目录 0、前言1、网络介绍1.1、输入1.2、Backbone主干网络1.3、Neck1.4、Prediction预测输出1.4.1、Decoupled Head解耦头1.4.2、Anchor-Free1.4.3、标签分配1.4.4、Loss计算 1.5、Yolox-s、l、m、x系列1.6、轻量级网络研究1.6.1、轻量级网络1.6.2、数据增强的优缺点 1.7、Y…

app专项测试:app弱网测试

弱网测试背景 用户体验 APP使用过程中,弱网的高延迟和高丢包,在实时性要求非常高的场景,容易伤害用户体验 非正常情况下,Bug出现几率会增加 在解决日常支持需求中,经常出现一些用户反馈的Bug无法复现,有…

库的操作【MySQL】

文章目录 创建数据库字符集和校验规则概念分类例子 查看数据库显示创建语句修改数据库删除数据库备份和恢复备份恢复 创建数据库 SQL: CREATE DATABASE [IF NOT EXISTS] db_name [[DEFAULT] CHARSETcharset_name] [[DEFAULT] COLLATEcollation_name];其中,大写的单…

xhadmin多应用Saas框架之超级SEO应用介绍

xhadmin是什么? xhadmin 是一套基于最新技术的研发的多应用 Saas 框架,支持在线升级和安装模块及模板,拥有良好的开发框架、成熟稳定的技术解决方案、提供丰富的扩展功能。为开发者赋能,助力企业发展、国家富强,致力于…

面对史上最难求职季,哪些测试技能更容易拿到offer?

在一线大厂,没有测试这个岗位,只有测开这个岗位。这几年,各互联网大厂技术高速更新迭代,软件测试行业也正处于转型期。传统的功能测试技术逐步淘汰,各种新的测试技术层出不穷,测试人员的薪资也水涨船高。与…

ChatGPT 助力英文论文翻译和润色

文章目录 一、前言二、主要内容1. 中英互译2. 中文润色3. 英文润色 三、总结 🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 一、前言 随着全球化的推进,跨文化交流变得越来越重要。在学术领域,英文论文的质量对于研究成果的传…

JAVA设计模式全解(独家AI解析)

JAVA设计模式全解(独家AI解析) 一、JAVA介绍二、JAVA设计模式六大原则三、JAVA设计模式介绍四、JAVA设计模式详解4.1 单例模式4.1.1 懒汉式(Lazy Initialization)4.1.2 饿汉式(Lazy Initialization) 4.2 代…

nginx配置负载均衡--实战项目(适用于轮询、加权轮询、ip_hash)

👨‍🎓博主简介 🏅云计算领域优质创作者   🏅华为云开发者社区专家博主   🏅阿里云开发者社区专家博主 💊交流社区:运维交流社区 欢迎大家的加入! 🐋 希望大家多多支…

制药企业固体制剂设备管理及维护要点

在制药企业的生产过程中,固体制剂设备是至关重要的一环。有效管理和维护这些设备对于确保生产质量、提高生产效率以及延长设备寿命至关重要。本文将从以下三个方面介绍制药企业固体制剂设备的主要类型、常见管理问题以及设备维护的关键要点。 制药企业固体制剂设备主…

java智慧工地云平台源码,以物联网、移动互联网技术为基础,结合大数据、云计算等,实现工程管理绿色化、数字化、精细化、智能化的效果

智慧工地将更多人工智能、传感技术、虚拟现实等高科技技术植入到建筑、机械、人员穿戴设施、场地进出关口等各类物体中,围绕人、机、料、法、环等各方面关键因素,彻底改变传统建筑施工现场参建各方现场管理的交互方式、工作方式和管理模式,智…