SpringBoot+ElasticSearch聚合查詢+條件查詢
es7.0以上
對應mysql語句
select state,count(state) countState from indexName where is_delete=0 group by state
1.指定查詢的索引
SearchRequest searchRequest = new SearchRequest(indexName);
2.構建過濾條件
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
3.構建聚合條件:根據state字段進行分組
AggregationBuilder aggregationBuilder = AggregationBuilders.terms("state").field("state");
4.構建查詢條件:查詢未刪除
BoolQueryBuilder filterQuery = QueryBuilders.boolQuery();
filterQuery.must(QueryBuilders.termQuery("isDelete", 0));
5.將聚合條件和查詢條件放入過濾條件中
searchSourceBuilder.aggregation(aggregationBuilder);
searchSourceBuilder.query(QueryBuilders.boolQuery().filter(filterQuery));
6.將過濾條件放入指定索引中
searchRequest.source(searchSourceBuilder);
7.查詢
SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
8.解析查詢到結果
//map:key=分組的狀態,value=每組的個數
Map<String, Integer> stateCountMap = new LinkedHashMap<>();
//拿到聚合結果
Terms terms = response.getAggregations().get(Fn.getName(EsTaskEntity::getState));
//遍歷聚合結果
for (Terms.Bucket bucket : terms.getBuckets()) {
//getKeyAsString():分組之后每個詳細的值
//bucket.getDocCount() 分組之后每個值得個數
stateCountMap.put(bucket.getKeyAsString(), Long.valueOf(bucket.getDocCount()).intValue());
}