對於剛剛學習es的童鞋來說,很容易不清楚怎么獲取客戶端對es文檔的聚合結果,下面就演示一下模仿DSL寫聚合,然后獲取到聚合的結果。
一, 對於下面這個簡單的聚合,目的是對於文檔全文匹配,聚合顏色字段。把滿足匹配的文檔放入自定義名稱的colors桶中,參照《elasticsearch權威指南》的范圍限定聚合
1 { 2 "size" : 0, 3 "query" : { 4 "match_all" : {} 5 }, 6 "aggs" : { 7 "colors" : { 8 "terms" : { 9 "field" : "color" 10 } 11 } 12 } 13 }
二, 對照着這個DSL寫我們的java rest client api的調用方法,供業務層調用
1 /** 2 * ES中查詢所有color 3 * 4 * @param indices 5 * @return 6 */ 7 public SearchResponse getAllColor(String... indices) { 8 SearchRequest searchRequest = new SearchRequest(indices); 9 SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder().size(0); 10 searchSourceBuilder.query(QueryBuilders.matchAllQuery()); 11 TermsAggregationBuilder builder = AggregationBuilders.terms("colors").field("color"); 12 searchSourceBuilder.aggregation(builder); 13 searchRequest.source(searchSourceBuilder); 14 15 try { 16 return client.getHighLevelClient().search(searchRequest); 17 } catch (IOException e) { 18 throw new BizException("聚合失敗:{}", e.getCause()); 19 } 20 }
三, 在我們的業務層調用上文中的getAllColor方法獲取response,對response解析,獲取聚合的結果
2 * 顏色信息 3 * 4 * @return 5 */ 6 public List<String> getAllColorInfo() { 7 SearchResponse response = highRestHelper.getAllColor(getIndices()); 8 Aggregations aggregations = response.getAggregations(); 9 ParsedStringTerms colorTerms = aggregations.get("app_group"); 10 List<String> colors = new ArrayList<>(); 11 List<? extends Terms.Bucket> buckets = colorTerms.getBuckets(); 12 for (Terms.Bucket bucket : buckets) { 13 String appName = bucket.getKey().toString(); 14 colors.add(appName); 15 } 16 return colors; 17 }
至此即可獲取所有的聚合結果,只要能夠參照DSL,轉換成相應的api調用,那么解析過程完全可以復用。