Elasticsearch 聚合统计与SQL聚合统计语法对比(一)
Es相比关系型数据库在数据检索方面有着极大的优势,在处理亿级数据时,可谓是毫秒级响应,我们在使用Es时不仅仅进行简单的查询,有时候会做一些数据统计与分析,如果你以前是使用的关系型数据库,那么Es的数据统计跟关系型数据库还是有很大的区别的,所以,这篇内容,为了更好的理解,我简单对比了Es中统计的写法与关系型数据库的写法。
首先,先了解一下Es中关于聚合的概念:
1:桶(Buckets)满足特定条件的文档的集合;
2:指标(Metrics)对桶内的文档进行统计计算
这两个概念是什么意思?先看下面一段T-SQL统计代码:
SELECT Color,SUM(1) as Nums【2】
FROM #Cars
GROUP BY Color 【1】
桶:满足特定条件的集合,这个很好理解,比如可以把蓝色的放到蓝色的桶里,绿色的放到绿色的桶里,桶是用来存放不同类型的集合。SQL代码中【1】就可以理解对桶进行分组,有多少种颜色,就会有几种不同的桶。桶类似于SQL中GROUP BY;
指标:对桶内的数据进行统计计算。SQL代码中【2】就可以理解为指标,每个桶里有多少条记录。指标类似于SQL中各种汇总,如Count(),Sum(),Max(),Min();
概念了解之后,对比来了, 我们来做一组数据:
1. 创建表结构并填充数据
1.1创建SQLSERVER结构与数据
CREATE TABLE #Cars
(
ID int IDENTITY(1,1) NOT NULL, --创建自增序列
Price int, --价格
Color varchar(50), --颜色
Make varchar(50), --品牌
Sold datetime, --销售日期
Primary key(ID) --定义ID为临时表#Cars的主键
);
INSERT INTO #Cars(Price,Color,Make,Sold) VALUES (10000,'红色','汉兰达','2014-10-28');
INSERT INTO #Cars(Price,Color,Make,Sold) VALUES (20000,'红色','汉兰达','2014-11-05');
INSERT INTO #Cars(Price,Color,Make,Sold) VALUES (30000,'绿色','福特','2014-05-18');
INSERT INTO #Cars(Price,Color,Make,Sold) VALUES (15000,'蓝色','丰田','2014-11-05');
INSERT INTO #Cars(Price,Color,Make,Sold) VALUES (12000,'绿色','丰田','2014-07-02');
INSERT INTO #Cars(Price,Color,Make,Sold) VALUES (20000,'红色','汉兰达','2014-11-05');
INSERT INTO #Cars(Price,Color,Make,Sold) VALUES (80000,'红色','宝马','2014-01-01');
INSERT INTO #Cars(Price,Color,Make,Sold) VALUES (25000,'蓝色','福特','2014-02-12');
1.2创建Elastsearch 结构与数据
POST /testindex/cars/_bulk
{ "index": {}}
{ "price" : 10000, "color" : "红色", "make" : "汉兰达", "sold" : "2014-10-28" }
{ "index": {}}
{ "price" : 20000, "color" : "红色", "make" : "汉兰达", "sold" : "2014-11-05" }
{ "index": {}}
{ "price" : 30000, "color" : "绿色", "make" : "福特", "sold" : "2014-05-18" }
{ "index": {}}
{ "price" : 15000, "color" : "蓝色", "make" : "丰田", "sold" : "2014-07-02" }
{ "index": {}}
{ "price" : 12000, "color" : "绿色", "make" : "丰田", "sold" : "2014-08-19" }
{ "index": {}}
{ "price" : 20000, "color" : "红色", "make" : "汉兰达", "sold" : "2014-11-05" }
{ "index": {}}
{ "price" : 80000, "color" : "红色", "make" : "宝马", "sold" : "2014-01-01" }
{ "index": {}}
{ "price" : 25000, "color" : "蓝色", "make" : "福特", "sold" : "2014-02-12" }
2. 统计查询对比
上面的代码中,分别创建了Es与SQLSERVER的数据结构,并且填充了一些数据。接下来,我们来举几个统计的例子,来看看他们两个之间的统计代码分别怎么写。
2.1 统计哪个颜色的销量最好?
【SQLSERVER实现】
SELECT Color,SUM(1) as SalesNum
FROM #Cars
GROUP BY Color
结果如下图:

【Elasticsearch 实现】
GET testindex/cars/_search
{
"size": 0, 【3】
"aggs": {【1】
"SalesNum": { 【2】
"terms": {【4】
"field": "color.keyword",
"size": 10
}
}
}
}
结果如下图:

【1】:如果想要进行统计分析,统计代码需要写在aggs中,aggs是aggregations 的简称,也可以写作 aggregations。
【2】:是指定的列的名称,作用同SQLSERVER统计中as 重命名。
【3】:这里设置了返回值为0,因为这个查询不仅仅返回了我们的统计的内容,还返回了搜索结果的内容,这里我们并不需要搜索结果的内容,所以设置为0.
【4】:这里定义了桶的类型,如果需要不同的统计内容,这些需要使用不同的统计类型。
2.2 按颜色统计出平均价格?
【SQLSERVER实现】
SELECT Color,AVG(Price) as '平均价格'
FROM #Cars
GROUP BY Color
【Elasticsearch 实现】
GET testindex/cars/_search
{
"size": 0,
"aggs": {
"s": {
"terms": {
"field": "color.keyword",
"size": 10
},
"aggs": {
"avg_price": {
"avg": {
"field": "price"
}
}
}
}
}
}
2.3 按照颜色统计出平均价格、最高价格、最低价格?
【SQLSERVER实现】
SELECT Color,AVG(Price) as '平均价格',MIN(Price) as MinPrice,MAX(Price) as MaxPrice
FROM #Cars
GROUP BY Color
【Elasticsearch 实现】
参考:https://elasticsearch.cn/question/4799
2.4 统计每一个企业品牌的最低价格和最高价格?
【SQLSERVER实现】
SELECT Make,MIN(Price) as MinPrice,MAX(Price) as MaxPrice
FROM #Cars
GROUP BY Make
【Elasticsearch 实现】
GET testindex/cars/_search
{
"size": 0
,"aggs": {
"make": {
"terms": {
"field": "make.keyword"
}
,"aggs": {
"price_age": {
"avg": {
"field": "price"
}
},
"min_price": {
"min": {
"field": "price"
}
}
,"max_price":{
"max": {
"field": "price"
}
}
}
}
}
}
通过上面的几个示例,我简单总结了几个SQLSever 中汇总函数与Es 的对比,看下面的表格:
|
SQLSERVER函数 |
Agg_Type |
功能说明 |
|
GROUP BY 字段名称 |
Terms (避免使用分词字段用来分组) |
分组、Es划分桶 |
|
Max()函数 |
Max |
求最大值 |
|
Min()函数 |
Min |
求最小值 |
|
Avg()函数 |
Avg |
求平均值 |
今天就先对比下简单的聚合汇总、求平均值统计,明天再对比下其他的,比如日期的聚合以及聚合的排序等。
Elasticsearch 聚合统计与SQL聚合统计语法对比(一)的更多相关文章
- lucene中facet实现统计分析的思路——本质上和word count计数无异,像splunk这种层层聚合(先filed1统计,再field2统计,最后field3统计)lucene是排序实现
http://stackoverflow.com/questions/185697/the-most-efficient-way-to-find-top-k-frequent-words-in-a-b ...
- sql 聚合函数、排序方法详解
聚合函数 count,max,min,avg,sum... select count (*) from T_Employee select Max(FSalary) from T_Employee 排 ...
- ElasticSearch 2 (35) - 信息聚合系列之近似聚合
ElasticSearch 2 (35) - 信息聚合系列之近似聚合 摘要 如果所有的数据都在一台机器上,那么生活会容易许多,CS201 课商教的经典算法就足够应付这些问题.但如果所有的数据都在一台机 ...
- sql 聚合查询
如果我们要统计一张表的数据量,例如,想查询students表一共有多少条记录,难道必须用SELECT * FROM students查出来然后再数一数有多少行吗? 这个方法当然可以,但是比较弱智.对于 ...
- Elasticsearch聚合 之 Range区间聚合
Elasticsearch提供了多种聚合方式,能帮助用户快速的进行信息统计与分类,本篇主要讲解下如何使用Range区间聚合. 最简单的例子,想要统计一个班级考试60分以下.60到80分.80到100分 ...
- SQL语句统计每天、每月、每年的 数据
SQL语句统计每天.每月.每年的数据 1.每年select year(ordertime) 年,sum(Total) 销售合计from 订单表group by year(ordertime) 2.每月 ...
- SQL Server数据库--》top关键字,order by排序,distinct去除重复记录,sql聚合函数,模糊查询,通配符,空值处理。。。。
top关键字:写在select后面 字段的前面 比如你要显示查询的前5条记录,如下所示: select top 5 * from Student 一般情况下,top是和order by连用的 orde ...
- 全废话SQL Server统计信息(2)——统计信息基础
接上文:http://blog.csdn.net/dba_huangzj/article/details/52835958 我想在大地上画满窗子,让所有习惯黑暗的眼睛都习惯光明--顾城<我是一个 ...
- 【转】SQL语句统计每天、每月、每年的数据
原文:https://www.cnblogs.com/Fooo/p/3435687.html SQL语句统计每天.每月.每年的数据 1.每年select year(ordertime) 年,sum(T ...
随机推荐
- quartz获取缓存中所有运行中的Job
原文地址:https://blog.csdn.net/zzm8421/article/details/77769203 Quartz 2.1.5: public static void getAllJ ...
- hibernate操纵数据库常用方法 及 hibernate对象的三种状态
在dao层使用hibernate语言来与数据库进行访问,hibernate作为面向对象思想开发的dao层框架其理解也需要以面向对象的思想来看待 使用.hibernate不仅支持使用者使用他提供的对象来 ...
- Python-Django下载与基本命令
1.下载Django: pip3 install django 2.创建一个django project django-admin.py startproject mysite 当前目录下会生成mys ...
- elk之查询方式(4种)
es 在查询时, 可以指定搜索类型为下面四种: QUERY_THEN_FETCH QUERY_AND_FEATCH DFS_QUERY_THEN_FEATCH DFS_QUERY_AND_FEATCH ...
- python os模块详解
一.Python os模块(Linux环境) 1.1 执行shell命令 os.system('cmd') 执行命令不保存结果 os.popen('command') 执行后返回结果,使用.read( ...
- 【问题解决方案】之 hadoop 用jps命令后缺少namenode的问题
用Xshell连接腾讯cloud里的虚拟机后,jps命令查无namenode导致过滤排序程序跑不起来,如图: 解决方案: Google之,说需要重启,格式化后再启动Hadoop.但鉴于本人不知道实现的 ...
- 正则校验:微信号,qq号,邮箱
java判断微信号.手机.名字的正则表达 - willgos - 博客园https://www.cnblogs.com/solossl/p/5813106.html 微信号正则校验,qq正则,邮箱正则 ...
- Jmeter之Constant Timer与constant throughput timer的区别(转)
当放置Constant Timer于两个http请求之间,那么它代表的含义是:在上一个请求发出至完成后, 开始Contant Timer指定的时间,最后再发出第二个请求.它并不是代表两个请求之间的发送 ...
- linuxmint 搜狗输入法安装
1.下载搜狗输入法linux安装包 2.进入安装包目录终端键入 dpkg -i [软件包名字] 3.设置语言选项中选择fcitx 4.重启电脑
- RedHat Enterprise Linux 6.4使用yum安装出现This system is not registered to Red Hat Subscription Management
我虚拟机安装的系统是RedHat Enterprise Linux 6.4-i686,是32位的.使用yum命令安装软件时候出现以下错误: This system is not registered ...