网站建设域名什么意思,怎么注册网站的步骤,.net开发微信网站流程,如何做vip影视网站前言
在之前我们详细面熟了es的查询用法#xff0c;但是es还拥有强大的聚合查询功能#xff0c;可以得到类似分组#xff0c;直方图#xff0c;折线图等数据组合。类似SQL的SUM、AVG、COUNT、GROUP BY Elasticsearch-02-es的restapi使用
概念
1#xff1a;ES聚合查询流…前言
在之前我们详细面熟了es的查询用法但是es还拥有强大的聚合查询功能可以得到类似分组直方图折线图等数据组合。类似SQL的SUM、AVG、COUNT、GROUP BY Elasticsearch-02-es的restapi使用
概念
1ES聚合查询流程
ES聚合查询类似SQL的GROUP by一般统计分析主要分为两个步骤
分组 对查询的数据首先进行一轮分组可以设置分组条件例如新生入学把所有的学生按专业分班这个分班的过程就是对学生进行了分组。 组内聚合 组内聚合就是对组内的数据进行统计例如计算总数、求平均值等等接上面的例子学生都按专业分班了那么就可以统计每个班的学生总数 这个统计每个班学生总数的计算就是组内聚合计算。 2桶的概念
es中满足特定条件的文档的集合叫做桶。 桶的就是一组数据的集合对数据分组后得到一组组的数据就是一个个的桶。 提示桶等同于组分桶和分组是一个意思ES使用桶代表一组相同特征的数据。 ES中桶聚合指的就是先对数据进行分组ES支持多种分组条件例如支持类似SQL的group by根据字段分组当然ES比SQL更强大支持更多的分组条件以满足各种统计需求
3指标
指标指的是对文档进行统计计算方式又叫指标聚合。 桶内聚合说的就是先对数据进行分组分桶然后对每一个桶内的数据进行指标聚合。 说白了就是前面将数据经过一轮桶聚合把数据分成一个个的桶之后我们根据上面计算指标对桶内的数据进行统计。比如计算每个桶内最大值最小值平均值等 常用的指标有SUM、COUNT、MAX等统计函数。
ES分组聚合查询
Elasticsearch桶聚合目的就是数据分组先将数据按指定的条件分成多个组然后对每一个组进行统计。 组的概念跟桶是等同的在ES中统一使用桶bucket这个术语。
ES桶聚合的作用跟SQL的group by的作用是一样的区别是ES支持更加强大的数据分组能力SQL只能根据字段的唯一值进行分组分组的数量跟字段的唯一值的数量相等例如: group by 店铺id 去掉重复的店铺ID后有多少个店铺就有多少个分组。
ES常用的桶聚合如下
Terms聚合 - 类似SQL的group by根据字段唯一值分组Histogram聚合 - 根据数值间隔分组例如: 价格按100间隔分组0、100、200、300等等Date histogram聚合 - 根据时间间隔分组例如按月、按天、按小时分组Range聚合 - 按数值范围分组例如: 0-150一组150-200一组200-500一组。
Terms聚合 - 类似SQL的group by根据字段唯一值分组
terms聚合的作用跟SQL中group by作用一样都是根据字段唯一值对数据进行分组分桶字段值相等的文档都分到同一个桶内。
GET person_info/_search
{size: 0, //这是为了不返回数据只返回聚合结果aggs: {buket_name: { // 聚合查询名字随便取一个terms: { //聚合类型为: termsfield: source.keyword //根据source值来分组}}}
}结果
{took : 82,timed_out : false,_shards : {total : 3,successful : 3,skipped : 0,failed : 0},hits : {total : {value : 6854,relation : eq},max_score : null,hits : [ ]},aggregations : {buket_name : {doc_count_error_upper_bound : 10,sum_other_doc_count : 1261,buckets : [{key : 填表,doc_count : 5340},{key : 普查,doc_count : 56},{key : 网上下载,doc_count : 39}]}}
}
Histogram聚合 - 根据数值间隔分组可做直方图
histogram直方图聚合主要根据数值间隔分组使用histogram聚合分桶统计结果通常用在绘制条形图报表。
GET person_info/_search
{size: 0, //这是为了不返回数据只返回聚合结果aggs: {buket_name: { // 聚合查询名字随便取一个histogram: { // 聚合类型为histogramfield: age, //对age字段进行分类interval: 5 //数字间隔为5}}}
}结果
{took : 4,timed_out : false,_shards : {total : 3,successful : 3,skipped : 0,failed : 0},hits : {total : {value : 6854,relation : eq},max_score : null,hits : [ ]},aggregations : {buket_name : {buckets : [{key : 10,doc_count : 814},{key : 15.0,doc_count : 1612},{key : 20.0,doc_count : 1290},{key : 25.0,doc_count : 3138}]}}
}
Date histogram聚合 - 根据时间间隔分组可做时间折线图
类似histogram聚合区别是Date histogram可以很好的处理时间类型字段主要用于根据时间、日期分桶的场景。 GET person_info/_search
{size: 0,aggs: {buket_name: { //这是为了不返回数据只返回聚合结果date_histogram: { // 聚合类型为: date_histogramfield: data, // 根据date字段分组calendar_interval: month, // 分组间隔,详解在下边format : yyyy-MM-dd, // 设置返回结果中桶key的时间格式time_zone: 08:00, //**设置时区如果存入的时候没设置就不用填**min_doc_count: 0, // 没有数据的月份返回0extended_bounds: { //强制返回的日期区间既需要填充0的范围min: 2000-01-01,max: 2003-01-01}}}}
}结果
{took : 17,timed_out : false,_shards : {total : 3,successful : 3,skipped : 0,failed : 0},hits : {total : {value : 6854,relation : eq},max_score : null,hits : [ ]},aggregations : {buket_name : {buckets : [{key_as_string : 2002-01-01,key : 1009843200000,doc_count : 5}]}}
}
参考
参数说明1“time_zone”: “08:00”
日期(date)类型的字段在 es中是以 long类型的值保存的。es中默认 默认的时区是 0时区。如果我们有一个东八区的时间那么在es中是如何存储的呢如果我们此时存在 如下 东八区时间 2022-11-29 12:12:12那么在 es 会存储为 2022-11-29 12:12:12 0000 对应的时间戳为什么会加上0000因为我们自己的时间字符串中没有时区就会加上默认的0时区。也可用 时差(offset)来表示使用 offset 参数按指定的正()或负(-)偏移量持续时间来更改每个桶的起始值例如1h表示一个小时1d表示一天。例如当使用day作为时间间隔时每个桶的时间区间从午夜到午夜。 将参数 offset 设置为 6h 会将每个桶的时间区间更改为从早上6点到早上6点
参数说明2fixed_interval 和calendar_interval 区别
原本的interval 字段在7.2中被弃用日历感知间隔是用参数 calendar_interval 配置的。 日历间隔只能以单位的“单数”数量指定(1d、1M等)。 不支持像 2d这样的倍数否则会引发异常。 minute (1m) hour(1h) day(1d) week(1w) month(1m) quarter( 季度1q) year(1y) 固定间隔是用参数 fixed_interval 配置的。 与日历感知间隔不同固定间隔是固定数量的国际单位制(SI)单位无论它们在日历上的位置如何都不会偏离。 一秒钟总是由1000毫秒组成。 这允许以支持单位的任何倍数值指定固定间隔。 然而这意味着固定的间隔不能表达其他单位如“月(month)”因为一个月的持续时间不是一个固定的量。 试图指定月或季度(quarter)等日历间隔将引发异常。 固定间隔支持的单位有 毫秒 (ms) 秒 (s)定义为每个1000毫秒 分钟 (m)所有分钟都从00秒开始。 定义为每个60秒(60,000毫秒) 小时 (h)所有小时都从00分00秒开始。 定义为每60分钟(3,600,000毫秒) 天 (d)所有天都在尽可能早的时间开始通常是00:00:00(午夜)。 定义为24小时(86,400,000毫秒) Range聚合 - 按数值范围分组自定义分组
GET /xxx/_search
{query: {range: {alarmNum: {gte: 20, lte: 50}} },size: 0,aggs: {warncont: {range: {field: alarmNum,ranges: [{to: 24 #},{from: 24, # and to: 32},{ from: 32 #}]}}}
}Elasticsearch 指标聚合metrics-函数
ES指标聚合就是类似SQL的统计函数指标聚合可以单独使用也可以跟桶聚合一起使用。
常用的统计函数如下
Value Count - 类似sql的count函数统计总数Cardinality - 类似SQL的count(DISTINCT 字段) 统计不重复的数据总数Avg - 求平均值Sum - 求和Max - 求最大值Min - 求最小值
Value Count - 类似sql的count函数统计总数
GET /sales/_search?size0
{aggs: {types_count: { // 聚合查询的名字随便取个名字value_count: { // 聚合类型为value_countfield: type // 计算type这个字段值的总数}}}
}等价SQLselect count(type) from salesCardinality - 类似SQL的count(DISTINCT 字段) 统计不重复的数据总数
POST /sales/_search?size0
{aggs : {type_count : { // 聚合查询的名字随便取一个cardinality : { // 聚合查询类型为cardinalityfield : type // 根据type这个字段统计文档总数}}}
}等价SQLselect count(DISTINCT type) from salesAvg - 求平均值 Sum - 求和 Max - 求最大值 Min - 求最小值
POST /exams/_search?size0
{aggs: {avg_grade: { // 聚合查询名字随便取一个名字avg: { // 聚合查询类型为: avgfield: grade // 统计grade字段值的平均值}}}
}综合使用-多层嵌套
GET /project_zcy/_search
{size: 0,query: {term: {project_status.keyword: {value: 执行中}}},aggs: {institue_bulk: {terms: {field: institute_code.keyword, #分组codeorder: {_count: asc}},aggs: {depart_bulk: {terms: {field: institute_name.keyword #再次分组获取名称},aggs: { #指标sumwarm_sum: {sum: {field: alarmNum}},index_count: { #指标countvalue_count: {field: institute_code.keyword}}}}}}}
}ES聚合排序
排序是对桶里面数据排序
默认情况ES会根据doc_count文档总数降序排序。
ES桶聚合支持两种方式排序
内置排序按度量指标排序
1内置排序
内置排序参数
_count - 按文档数排序。对 terms 、 histogram 、 date_histogram 有效_term - 按词项的字符串值的字母顺序排序。只在 terms 内使用_key - 按每个桶的键值数值排序, 仅对 histogram 和 date_histogram 有效
GET /cars/_search
{size : 0,aggs : {colors : { // 聚合查询名字随便取一个terms : { // 聚合类型为: termsfield : color, order: { // 设置排序参数_count : asc // 根据_count排序asc升序desc降序}}}}
}2按度量排序
通常情况下我们根据桶聚合分桶后都会对桶内进行多个维度的指标聚合所以我们也可以根据桶内指标聚合的结果进行排序。
GET /cars/_search
{size : 0,aggs : {colors : { // 聚合查询名字terms : { // 聚合类型: terms先分桶field : color, // 分桶字段为colororder: { // 设置排序参数avg_price : asc // 根据avg_price指标聚合结果升序排序。}},aggs: { // 嵌套聚合查询设置桶内聚合指标avg_price: { // 聚合查询名字前面排序引用的就是这个名字avg: {field: price} // 计算price字段平均值}}}}
}限制返回桶的数量 -size
GET /_search
{aggs : {products : { // 聚合查询名字terms : { // 聚合类型为: termsfield : product, // 根据product字段分桶size : 5 // 限制最多返回5个桶}}}
}