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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

余额很不足

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值