前言:
在前面的几篇文章讲到了elasticsearch的搜索,但是elasticsearch还有强大的聚合分析功能,通过聚合,我们会得到一个数据的概览,这样对大数据提取统计指标时就变得游刃有余。聚合允许我们向数据提出一些复杂的问题。虽然功能完全不同于搜索,但它们使用相同的数据结构,执行速度很快并且就像搜索一样几乎是实时的。
一、聚合(Aggregations)的介绍
elasticsearch的聚合(Aggregations)类似于数据库sql中的分组 group by,count、sum等函数,除此之外他还有更多强大的数据统计分析接口。
聚合有两个核心概念:
1.桶(bucket):对数据进行分组。比如一个对象User他有一个属性是city,有如下数据:1.张三 上海 ;2.李四 北京; 3.王五 北京,我们就可以基于city划分buckets,一个是北京bucket,一个是上海bucket,按照某个字段进行bucket划分,那个字段的值相同的那些数据,就会被划分到一个bucket中,相当于sql中的group by分组。
2.指标(metric):对一个数据分组执行的统计。当我们有了一堆bucket之后,就可以对每个bucket中的数据进行聚合分词了,比如说计算一个bucket内所有数据的数量、平均值、最大值等的,metric就是对一个bucket执行的某种聚合分析的操作,相当于数据库中的avg,sum函数
二、Bucket aggregations 聚合分组的使用
官方参考资料:
https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/_bucket_aggregations.html
我会在第一个例子中将完整的代码写出来,其他的例子仿照第一个进行
1. Terms Aggregation
terms按照某个字段进行分组,下面的代码中也涉及了排序问题,详细代码看注释
/**TermAggs 包含了Order
* termAggs统计每个颜色的个数
* @Title: countByColor
* @Description: TODO(统计每个颜色的销量)
* @param @throws UnknownHostException
* @return void
* @autor lpl
* @date 2017年11月6日
* @throws
*/
@Test
public void countByColor() throws UnknownHostException{
//进行聚合查询,terms按照某个字段中进行分组
TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders
.terms("popular_colors") //aggs的名称,自定义,取数据的时候与其一致即可
.field("color") //需要分组的字段
//.order(Terms.Order.term(true)) //true表示按照term分组的asc排序
.order(Terms.Order.count(true)); //true表asc按照doc_count排序,false表示desc排序
//查询数据进行聚合分析
SearchResponse response = EsClient.client().prepareSearch("tvs").setTypes("sales")
.addAggregation(termsAggregationBuilder)
.setSize(0)
.execute()
.actionGet();
//获取聚合
Terms terms = response.getAggregations().get("popular_colors");
//遍历处理数据
for (Terms.Bucket entry : terms.getBuckets()) {
Map<String,Object> map = new HashMap<String,Object>();
String key = (String) entry.getKey();