ElasticSearch里面的聚合机制非常灵活和强大,今天我们来看下如何在ElasticSearch里面实现分组后,根据sum值进行排序?类似的数据库SQL如下:
select id,sum(c1) as c1 , sum(c2) as c2 from table1 group id order by c1 desc, c2 asc
这是一个比较常见的统计需求,在es也能比较轻松的实现,先看看curl的一个实现例子查询:
GET myindex/_search
{
"size":0,
"aggs": {
"a1": {
"terms": {
"field": "FIELD1",
"size":0,
"order": {"a2": "desc"}
},
"aggs":{
"a2":{
"sum":{
"field":"FIELD2.SUBFIELD"
}
}
}
}
}
}
然后,我们看下,如何在Java Api里面操作:
首先我们看下造的数据
总共三个字段id,count,code都是int类型的
id,count,code
1,3,1
2,4,1
1,5,2
2,7,1
3,11,7
然后,我们可以将上面的数据插入到es里面,具体的插入代码不在给出,比较简单,直接通过client.prepareIndex方法插入json即可。
下面看下查询代码:
public void groupTest(){
//构建查询请求体
SearchRequestBuilder search = client.prepareSearch("gv_test").setTypes("gv_test");
//分组字段是id,排序由多个字段排序组成
TermsBuilder tb= AggregationBuilders.terms("id").field("id").order(Terms.Order.compound(
Terms.Order.aggregation("sum_count",false)//先按count,降序排
,
Terms.Order.aggregation("sum_code",true)//如果count相等情况下,使用code的和排序
));
//求和字段1
SumBuilder sb= AggregationBuilders.sum("sum_count").field("count");
//求和字段2
SumBuilder sb_code= AggregationBuilders.sum("sum_code").field("code");
tb.subAggregation(sb);//添加到分组聚合请求中
tb.subAggregation(sb_code);//添加到分组聚合请求中
//将分组聚合请求插入到主请求体重
search.addAggregation(tb);
//发送查询,获取聚合结果
Terms tms= search.get().getAggregations().get("id");
//遍历每一个分组的key
for(Terms.Bucket tbb:tms.getBuckets()){
//获取count的和
Sum sum= tbb.getAggregations().get("sum_count");
//获取code的和
Sum sum2=tbb.getAggregations().get("sum_code");
System.out.println(tbb.getKey()+" " + tbb.getDocCount() +" "+sum.getValue()+" "+sum2.getValue());
}
//释放资源
client.close();
}
最终的结果如下:
id,分组个数,count的和,code和
2 2 11.0 2.0
3 1 11.0 7.0
1 2 8.0 3.0
通过对比,我们可以到到结果是准确的,虽然代码量比sql多很多,但是ElasticSearch的聚合功能却是非常的强大和灵活,用来做一些OLAP分析是非常方便的。
有什么问题可以扫码关注微信公众号:我是攻城师(woshigcs),在后台留言咨询。
技术债不能欠,健康债更不能欠, 求道之路,与君同行。
分享到:
相关推荐
同时,Elasticsearch 还提供了多种聚合函数,例如 SUM、AVG、MAX 等,可以对分组后的数据进行聚合计算。 Java 中的 Elasticsearch 客户端 在 Java 中,我们可以使用 Elasticsearch 的 Java 客户端来实现对 Elastic...
Elasticsearch中的Terms聚合是一种常用的聚合方式,用于对文档中的某个字段进行分组统计。Terms聚合可以对文档中的某个字段进行分组,并统计每个组中的文档数量。 在Elasticsearch中,Terms聚合可以使用以下方式...
安装Elasticsearch-SQL 2.2.0.1插件时,你需要将解压后的文件上传至Elasticsearch服务器,并通过Elasticsearch的Plugin Manager进行安装。在使用过程中,你可以通过HTTP RESTful API或者JDBC/ODBC驱动连接Elastic...
2. **聚合查询**:Elasticsearch-SQL支持各种聚合函数,如COUNT、SUM、AVG、MIN、MAX等,以及更复杂的聚合操作,如Terms Aggregation、Histogram Aggregation等。 3. **过滤和排序**:通过WHERE子句,用户可以设置...
Elasticsearch-SQL是针对Elasticsearch开发的一个插件,它允许用户通过SQL语句来查询Elasticsearch中的数据,极大地降低了使用Elasticsearch的门槛,特别是对于熟悉SQL语法的开发者来说,这是一个非常友好的特性。...
Elasticsearch支持对搜索结果进行定制排序,不仅可以按分数排序,还可以按字段值进行排序。 ```json { "sort": [ { "field_name": "desc" }, { "_score": "asc" } ] } ``` ### 6. 聚合 聚合功能允许我们对...
ElasticSearch提供了多种聚合函数,包括avg、sum、max、min、cardinality、stats等,可以根据实际需求选择合适的函数。同时,ElasticSearch也提供了丰富的数据类型,包括数字、字符串、日期、对象等,可以满足各种...
- GROUP BY 和聚合: Elasticsearch SQL 支持 GROUP BY 语句,配合聚合函数(如 COUNT, SUM, AVG, MIN, MAX)进行分组统计,例如 `GROUP BY field1, field2`。 - JOIN: 虽然 Elasticsearch 原生不支持JOIN操作,但...
在现代大数据处理中,Elasticsearch(ES)已经成为一种广泛使用的搜索引擎和数据分析工具,而Java作为后端开发的主流语言,自然需要与ES进行紧密集成。"Java_使用SQL查询Elasticsearch.zip"这个压缩包内容可能包含了...
**Elasticsearch 6 教程详解** Elasticsearch 是一个开源的全文搜索引擎,以其分布式、实时、可扩展性以及强大的数据分析能力而受到广大开发者和企业的青睐。在Elasticsearch 6版本中,它继续优化了性能,提升了...
Elasticsearch是一款强大的开源搜索引擎,广泛应用于大数据分析和实时数据检索。Java API是与Elasticsearch交互的主要方式之一,尤其对于Java开发者来说,它提供了丰富的功能和高效的性能。本手册将深入探讨Elastic...
### Elasticsearch使用Java执行ESIQL查询详解 #### 一、前言 Elasticsearch是一款基于Lucene的开源搜索引擎,以其高性能、高扩展性等特点而受到广泛欢迎。在Elasticsearch中,除了支持传统的JSON格式查询外,还...
类似于关系型数据库中的 SUM,AVG, GROUP BY 等,Elasticsearch 也提供了丰富的聚合运算方式,可以满足大部分分析和查询场景。 Doc Values 和 Field Data 在学习聚合分析之前,我们先了解一下 Doc Values 和 Field ...
在大数据领域,Hive、SQL和Elasticsearch都是至关重要的技术。这些技术在处理大规模数据时发挥着核心作用,尤其在面试过程中,对这些技术的深入理解和应用能力往往是考察求职者的重要标准。以下是对这些技术及其相关...
在本实验中,我们将探讨如何使用Elasticsearch进行索引和文档操作。Elasticsearch是一个强大的开源搜索引擎,常用于大数据分析和实时搜索。实验的主要目标是熟练掌握Elasticsearch集群的启动与管理,以及索引、文档...
- **子程序SUB2**: 将排序后的数组复制到ES段。 ### 3. 双字节数组求和 #### 分析 该部分要求使用双字节指令处理数组元素。 #### 示例代码 ```assembly DATASEGMENT XDW132,-143,-116,-195,-28 YDW200,157,-100,-...
它们允许用户根据特定字段对数据进行分类,并且可以显示每个组的总计、平均值等统计信息。然而,使用分组报表时可能会遇到各种问题,例如数据不正确地分组、格式设置问题或者计算错误。解决这些问题通常涉及理解...
此命令表示按商店名称分组,并计算每个商店的销售额总和,只显示总销售额大于1500的记录。 #### 五、别名 在SQL中可以为表和列指定别名,使得查询结果更易于阅读。 ##### 示例 ```sql SELECT A1.Store_Name AS ...
选择查询可以根据一定的条件来筛选数据,然后对筛选结果进行分组、排序、计算等操作。 为什么需要进行分组数据的计算? 在实际的数据分析中,我们经常需要对数据进行分组计算,以便更好地了解数据之间的关系和规律...