`
qindongliang1922
  • 浏览: 2189179 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
7265517b-f87e-3137-b62c-5c6e30e26109
证道Lucene4
浏览量:117681
097be4a0-491e-39c0-89ff-3456fadf8262
证道Hadoop
浏览量:126080
41c37529-f6d8-32e4-8563-3b42b2712a50
证道shell编程
浏览量:60035
43832365-bc15-3f5d-b3cd-c9161722a70c
ELK修真
浏览量:71405
社区版块
存档分类
最新评论

ElasticSearch里面如何分组后根据sum值排序

    博客分类:
  • ELK
阅读更多





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),在后台留言咨询。
技术债不能欠,健康债更不能欠, 求道之路,与君同行。


0
1
分享到:
评论

相关推荐

    java使用elasticsearch分组进行聚合查询过程解析

    同时,Elasticsearch 还提供了多种聚合函数,例如 SUM、AVG、MAX 等,可以对分组后的数据进行聚合计算。 Java 中的 Elasticsearch 客户端 在 Java 中,我们可以使用 Elasticsearch 的 Java 客户端来实现对 Elastic...

    Elasticsearch聚合 之 Terms

    Elasticsearch中的Terms聚合是一种常用的聚合方式,用于对文档中的某个字段进行分组统计。Terms聚合可以对文档中的某个字段进行分组,并统计每个组中的文档数量。 在Elasticsearch中,Terms聚合可以使用以下方式...

    elasticsearch-sql-2.2.0.1.zip

    安装Elasticsearch-SQL 2.2.0.1插件时,你需要将解压后的文件上传至Elasticsearch服务器,并通过Elasticsearch的Plugin Manager进行安装。在使用过程中,你可以通过HTTP RESTful API或者JDBC/ODBC驱动连接Elastic...

    elasticsearch-sql-master.zip

    2. **聚合查询**:Elasticsearch-SQL支持各种聚合函数,如COUNT、SUM、AVG、MIN、MAX等,以及更复杂的聚合操作,如Terms Aggregation、Histogram Aggregation等。 3. **过滤和排序**:通过WHERE子句,用户可以设置...

    lasticsearch-SQL使用SQL查询Elasticsearch

    Elasticsearch-SQL是针对Elasticsearch开发的一个插件,它允许用户通过SQL语句来查询Elasticsearch中的数据,极大地降低了使用Elasticsearch的门槛,特别是对于熟悉SQL语法的开发者来说,这是一个非常友好的特性。...

    ElasticSearch高级查询.zip

    Elasticsearch支持对搜索结果进行定制排序,不仅可以按分数排序,还可以按字段值进行排序。 ```json { "sort": [ { "field_name": "desc" }, { "_score": "asc" } ] } ``` ### 6. 聚合 聚合功能允许我们对...

    ElasticSearch增删改查以及聚合查询

    ElasticSearch提供了多种聚合函数,包括avg、sum、max、min、cardinality、stats等,可以根据实际需求选择合适的函数。同时,ElasticSearch也提供了丰富的数据类型,包括数字、字符串、日期、对象等,可以满足各种...

    elasticsearch数据的查询sql

    - GROUP BY 和聚合: Elasticsearch SQL 支持 GROUP BY 语句,配合聚合函数(如 COUNT, SUM, AVG, MIN, MAX)进行分组统计,例如 `GROUP BY field1, field2`。 - JOIN: 虽然 Elasticsearch 原生不支持JOIN操作,但...

    Java_使用SQL查询Elasticsearch.zip

    在现代大数据处理中,Elasticsearch(ES)已经成为一种广泛使用的搜索引擎和数据分析工具,而Java作为后端开发的主流语言,自然需要与ES进行紧密集成。"Java_使用SQL查询Elasticsearch.zip"这个压缩包内容可能包含了...

    千锋ElasticSearch6教程的资料

    **Elasticsearch 6 教程详解** Elasticsearch 是一个开源的全文搜索引擎,以其分布式、实时、可扩展性以及强大的数据分析能力而受到广大开发者和企业的青睐。在Elasticsearch 6版本中,它继续优化了性能,提升了...

    Elasticsearch Java API 手册.zip

    Elasticsearch是一款强大的开源搜索引擎,广泛应用于大数据分析和实时数据检索。Java API是与Elasticsearch交互的主要方式之一,尤其对于Java开发者来说,它提供了丰富的功能和高效的性能。本手册将深入探讨Elastic...

    Elasticsearch如何使用 Java 对索引进行 ESIQL 的查询.txt

    ### Elasticsearch使用Java执行ESIQL查询详解 #### 一、前言 Elasticsearch是一款基于Lucene的开源搜索引擎,以其高性能、高扩展性等特点而受到广泛欢迎。在Elasticsearch中,除了支持传统的JSON格式查询外,还...

    Elasticsearch 聚合分析深入学习

    类似于关系型数据库中的 SUM,AVG, GROUP BY 等,Elasticsearch 也提供了丰富的聚合运算方式,可以满足大部分分析和查询场景。 Doc Values 和 Field Data 在学习聚合分析之前,我们先了解一下 Doc Values 和 Field ...

    hive_elasticsearch_sql面试_大数据面试文档.rar

    在大数据领域,Hive、SQL和Elasticsearch都是至关重要的技术。这些技术在处理大规模数据时发挥着核心作用,尤其在面试过程中,对这些技术的深入理解和应用能力往往是考察求职者的重要标准。以下是对这些技术及其相关...

    ES索引和文档操作实验.docx

    在本实验中,我们将探讨如何使用Elasticsearch进行索引和文档操作。Elasticsearch是一个强大的开源搜索引擎,常用于大数据分析和实时搜索。实验的主要目标是熟练掌握Elasticsearch集群的启动与管理,以及索引、文档...

    微机原理实验二——循环程序结构和过程调用程序设计

    - **子程序SUB2**: 将排序后的数组复制到ES段。 ### 3. 双字节数组求和 #### 分析 该部分要求使用双字节指令处理数组元素。 #### 示例代码 ```assembly DATASEGMENT XDW132,-143,-116,-195,-28 YDW200,157,-100,-...

    解决Access中分组报表的问题

    它们允许用户根据特定字段对数据进行分类,并且可以显示每个组的总计、平均值等统计信息。然而,使用分组报表时可能会遇到各种问题,例如数据不正确地分组、格式设置问题或者计算错误。解决这些问题通常涉及理解...

    SQL语法大全.docx

    此命令表示按商店名称分组,并计算每个商店的销售额总和,只显示总销售额大于1500的记录。 #### 五、别名 在SQL中可以为表和列指定别名,使得查询结果更易于阅读。 ##### 示例 ```sql SELECT A1.Store_Name AS ...

    Access使用查询--1.2.用选择查询进行分组数据的计算

    选择查询可以根据一定的条件来筛选数据,然后对筛选结果进行分组、排序、计算等操作。 为什么需要进行分组数据的计算? 在实际的数据分析中,我们经常需要对数据进行分组计算,以便更好地了解数据之间的关系和规律...

Global site tag (gtag.js) - Google Analytics