這兩天項(xiàng)目中需要從es中查詢數(shù)據(jù),根據(jù)某個(gè)字段進(jìn)行分組,求其最大、最小、平均值,并按最大值進(jìn)行排序。
springboot的版本號(hào):2.0.6.RELEASE
Elasticsearch的版本號(hào):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); // 只獲取聚合結(jié)果,不顯示hits數(shù)據(jù)
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);
表示往分組聚合對(duì)象里追加聚合函數(shù),可以追加多個(gè)聚合函數(shù)。
2、AggregationBuilders.terms("fieldTerms").field("myField").size(99999).order(Terms.Order.aggregation("max_f", false));
表示將字段myField進(jìn)行分組,并按聚合字段max_f倒序排列,設(shè)置最多返回99999條結(jié)果,若不寫(xiě)則默認(rèn)返回10條結(jié)果,需要注意。
3、InternalMax maxf = (InternalMax)aggMap.get("max_f");文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-596197.html
表示最大值的聚合對(duì)象獲取到的值類(lèi)型,會(huì)有對(duì)應(yīng)的InternalMax對(duì)象來(lái)接收,最小值對(duì)象為InternalMin,平均值對(duì)象為InternalAvg。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-596197.html
到了這里,關(guān)于Springboot操作Elasticsearch——聚合分組與排序的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!