Springboot操作Elasticsearch——聚合分组与排序

这篇具有很好参考价值的文章主要介绍了Springboot操作Elasticsearch——聚合分组与排序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这两天项目中需要从es中查询数据,根据某个字段进行分组,求其最大、最小、平均值,并按最大值进行排序。

springboot的版本号:2.0.6.RELEASE

Elasticsearch的版本号:5.6.3

主要代码记录下:

BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery()
                .filter(QueryBuilders.termsQuery("a", aList))
                .filter(QueryBuilders.termsQuery("b", bList))
                .filter(QueryBuilders.rangeQuery("cTime")
                        .from(startTime)
                        .to(endTime));
AggregationBuilder termsBuilder = AggregationBuilders.terms("fieldTerms").field("myField").size(99999).order(Terms.Order.aggregation("max_f", false));
MaxAggregationBuilder maxAggf = AggregationBuilders.max("max_f").field("prod.f");
MinAggregationBuilder minAggf = AggregationBuilders.min("min_f").field("prod.f");
AvgAggregationBuilder avgAggf = AggregationBuilders.avg("avg_f").field("prod.f");
termsBuilder.subAggregation(maxAggf);
termsBuilder.subAggregation(minAggf);
termsBuilder.subAggregation(avgAggf);
termsBuilder.subAggregation(maxAggMem);
termsBuilder.subAggregation(minAggMem);
termsBuilder.subAggregation(avgAggMem);

TransportClient transportClient = ESConnectionManagement.getInstance();
SearchRequestBuilder searchRequestBuilder = transportClient.prepareSearch("indexName_*")
        .setTypes("type1", "type2")
        .setScroll(TimeValue.timeValueMinutes(1))
        .setQuery(queryBuilder)
        .addAggregation(aggregationBuilder)
        .setSize(0); // 只获取聚合结果,不显示hits数据
SearchResponse scrollResponse = searchRequestBuilder.execute().actionGet();
Map<String, Aggregation> map =  scrollResponse.getAggregations().asMap();
    
StringTerms stringTerms = (StringTerms)map.get("fieldTerms");
List<StringTerms.Bucket> buckets = stringTerms.getBuckets();

for (StringTerms.Bucket bucket : buckets) {
    String myField = bucket.getKeyAsString();
    Map<String, Aggregation> aggMap = bucket.getAggregations().asMap();
    // 获取的最大、最小、平均值
    InternalMax maxf = (InternalMax)aggMap.get("max_f");
    String maxfValue = BigDecimal.valueOf(maxf.getValue())
            .setScale(2, BigDecimal.ROUND_HALF_UP)
            .toString();

    InternalMin minf = (InternalMin)aggMap.get("min_f");
    String minfValue = BigDecimal.valueOf(minf.getValue())
            .setScale(2, BigDecimal.ROUND_HALF_UP)
            .toString();

    InternalAvg avgf = (InternalAvg)aggMap.get("avg_f");
    String avgfValue = BigDecimal.valueOf(avgf.getValue())
            .setScale(2, BigDecimal.ROUND_HALF_UP)
            .toString();
    ...
}

其中

1、termsBuilder.subAggregation(maxAggf);

表示往分组聚合对象里追加聚合函数,可以追加多个聚合函数。

2、AggregationBuilders.terms("fieldTerms").field("myField").size(99999).order(Terms.Order.aggregation("max_f", false));

表示将字段myField进行分组,并按聚合字段max_f倒序排列,设置最多返回99999条结果,若不写则默认返回10条结果,需要注意。

3、InternalMax maxf = (InternalMax)aggMap.get("max_f");

表示最大值的聚合对象获取到的值类型,会有对应的InternalMax对象来接收,最小值对象为InternalMin,平均值对象为InternalAvg。文章来源地址https://www.toymoban.com/news/detail-596197.html

到了这里,关于Springboot操作Elasticsearch——聚合分组与排序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java Elasticsearch多条件分组聚合查询

    需求         在项目开发中,需要从elasticsearch中查询日志数据,先统计每一天的日志调用量,然后在每一天的分组聚合基础上,再分组聚合统计成功和失败的日志调用量。 代码

    2024年02月08日
    浏览(54)
  • 五、浅析[ElasticSearch]底层原理与分组聚合查询

    集群节点介绍 es配置文件夹中 客户端节点 当主节点和数据节点配置都设置为false的时候,该节点只能处理路由请求,处理搜索,分发索引操作等,从本质上来说该客户节点表现为智能负载平衡器。独立的客户端节点在一个比较大的集群中是非常有用的,他协调主节点和数据节

    2024年02月16日
    浏览(45)
  • 【JaveWeb教程】(20) MySQL数据库开发之 基本查询、条件查询、聚合函数、分组查询、排序查询、分页查询 详细代码示例讲解

    在上次学习的内容中,我们讲解了: 使用DDL语句来操作数据库以及表结构(数据库设计) 使用DML语句来完成数据库中数据的增、删、改操作(数据库操作) 我们今天还是继续学习数据库操作方面的内容:查询(DQL语句)。 查询操作我们分为两部分学习: DQL语句-单表操作

    2024年02月02日
    浏览(80)
  • Elasticsearch - 聚合获取原始数据并分页&排序&模糊查询

    ES版本: 7.6. 需要按照主机ID 进行告警时间的汇总,并且还得把主机相关的信息展示出来。 注: 所有的数据都存在索引中, 通过一个DSL查询展示 实际上就是将terms聚合的结果以列表形式分页展示。 bucket_sort中 from不是pageNum,如想实现pageNum效果,from=pageNum*size即可; terms聚合

    2024年02月05日
    浏览(44)
  • 解决Elasticsearch的Text类型的字段参与聚合和排序

    text字段类型用于全文内容,例如电子邮件正文或产品说明,并且es会通过分析器对字符串进行分词,可以在全文检索中搜索单独的单词。文本字段最适合非结构化但可读的内容并且不用于排序,也很少用于聚合 keyword主要用于结构化内容的字段,并且总是会有相同值的字段。

    2024年02月11日
    浏览(46)
  • Elasticsearch聚合学习之四:结果排序,阿里云java面试

    返回结果如下,已经按照key的大小从大到小排序: … “aggregations” : { “price” : { “buckets” : [ { “key” : 80000.0, “doc_count” : 1 }, { “key” : 60000.0, “doc_count” : 0 }, { “key” : 40000.0, “doc_count” : 0 }, { “key” : 20000.0, “doc_count” : 4 }, { “key” : 0.0, “doc_count” : 3 } ] } } }

    2024年04月09日
    浏览(39)
  • Mysql 数据库DQL 数据查询语言 SELECT 基本查询、条件查询、聚合查询、分组查询、排序查询、分页查询——包含DQL所有查询语句。吐血分享。

    DQL:数据查询语言; 用来对表内的数据进行查找 。Database Query Language SQL语句分为:基本查询、条件查询、聚合查询、分组查询、排序查询、分页查询。  可以发现name字段就只剩下一个张三了;   条件: 条件查询—比较运算符 比较运算符 功能 大于 = 大于等于 小于 = 小于等

    2024年01月19日
    浏览(53)
  • elasticsearch[四]-数据聚合排序查询、搜索框自动补全、数据同步、集群

    **聚合(aggregations)**可以让我们极其方便的实现对数据的统计、分析、运算。例如: 什么品牌的手机最受欢迎? 这些手机的平均价格、最高价格、最低价格? 这些手机每月的销售情况如何? 实现这些统计功能的比数据库的 sql 要方便的多,而且查询速度非常快,可以实现近

    2024年01月19日
    浏览(57)
  • ElasticSearch聚合操作

    Elasticsearch除搜索以外,提供了针对 ES 数据进行统计分析的功能。 聚合(aggregations):可以让我们极其方便的实现对数据的统计、分析、运算。 基本语法: Metric Aggregation:一些数学运算,可以对文档字段进行统计分析,类比 Mysql中的 min(), max(), sum() 操作。 Bucket Aggregation:一些

    2024年02月08日
    浏览(30)
  • Java 1.8 List集合排序、去重、分组、过滤、合并、截取操作

    1、正序 2、逆序 3、根据某个属性或多个属性排序 多个属性排序:需要添加排序条件就在后面添加.thenComparing(UserVO::getxxx),它是在上一个条件的基础上进行排序 1、去重 2、根据某个属性去重(它将该字段还进行排序了) 3、根据某个属性去重(这个方法没有排序) 4、对多个

    2024年02月01日
    浏览(67)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包