对于使用Elasticsearch来实现关系数据库中的group by操作,可以使用Aggregation,(本文纯手打,由于该用例是17年实现的,所以谅解,只是给大家提供思路)
简单举例:Elasticsearch5
//自己去实现client
TransportClient client = null;
//定义SearchRequestBuilder
SearchRequestBuilder sBuilder = client.prepareSearch("cars").setType("info");
//select color,count(1) as color_count form table1 group by color
TermsAggregationBuilder teamColorAgg = AggregationBuilders.terms("color_count").field("color");
sBuilder.addAggregation(teamColorAgg);
SearchResponse response = sBuilder.execute().actionGet();
Map<String,Aggregation> aggMap = response.getAggregations().asMap();
Terms terms = (Terms)aggMap.get("color_count");
List<Terms.Bucket> list = terms.getBuckets();
int size = list.size();
Terms.Bucket bucket = null;
for(int i=0;i<size;i++){
bucket = list.get(i);
System.out.println(bucket.getKey()); //自己加断点看一下结果就好
}
//多字段的嵌套分组带条件的聚合
//select color,max(price) as max_price from table1 group by color
sBuilder.addAggregation(teamColorAgg);就是在执行这段代码之前多定义一些Aggregation
MaxAggregationBuilder pirceAgg= AggregationBuilders.max("max_price").field("price");
sBuilder.addAggregation(teamColorAgg.subAggregation(pirceAgg))); //subAggregation(?) 支持多种聚合类型,例如SumAggregation
//本人实际项目是支持灵活多级自定义嵌套分组,已经实现