ElasticsearchRestTemplate 单个字段求和
String key = "sum_bale_count";
// 查询条件组装
BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
boolQueryBuilder.must(QueryBuilders.matchQuery(Cont.SMALL_MAT_CODE,matSmallCode)).filter(QueryBuilders.boolQuery()
.must(QueryBuilders.existsQuery("baleCount")))
.filter(QueryBuilders.termsQuery(Cont.FIRST_MENU_ID, FirstPageMenuId.N2018032700291334.getCode(), FirstPageMenuId.N2018032900295987.getCode()));
/**
*求和函数
* key -- 求和的名称(可以理解为一个标志)
* baleCount --求和字段
*/
SumAggregationBuilder sumBale= AggregationBuilders.sum(key).field("baleCount");
// 数据分页。需求是聚合,数据本身我并不需要,所以只返回一条数据就行
Pageable pageable = PageRequest.of(0, 1);
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
nativeSearchQueryBuilder.withFields("baleCount");
nativeSearchQueryBuilder.withQuery(boolQueryBuilder).addAggregation(sumBale).withPageable(pageable);
SearchHits<DocNotices> search = elasticsearchRestTemplate.search(nativeSearchQueryBuilder.build(), DocNotices.class);
//获取求和结果
Aggregations aggregations = search.getAggregations();
if (Objects.isNull(aggregations)){
return null;
}
Map<String, Aggregation> aggMap = aggregations.getAsMap();
if (!CollectionUtils.isEmpty(aggMap)){
ParsedSum parsedSum = (ParsedSum)aggMap.get(key);
if (!Objects.isNull(parsedSum) && !Objects.isNull(parsedSum.getValue())) {
Integer sum = Integer.valueOf(new Double(parsedSum.getValue()).intValue());
//redisTemplate.opsForValue().set(cacheKey,sum,10, TimeUnit.MINUTES);
return sum;
}
}
return null;
本文参考文章
Elasticsearch 基本查询及聚合查询参考
Elasticsearch深分页-1
Elasticsearch深分页 -2