栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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 map =  scrollResponse.getAggregations().asMap();
    
StringTerms stringTerms = (StringTerms)map.get("fieldTerms");
List buckets = stringTerms.getBuckets();

for (StringTerms.Bucket bucket : buckets) {
    String myField = bucket.getKeyAsString();
    Map 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。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/964660.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号