對於使用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
//本人實際項目是支持靈活多級自定義嵌套分組,已經實現
