ElasticSearch7.3学习(二十九)—-聚合实战之使用Java api实现电视案例

一、数据准备

创建索引及映射

建立价格、颜色、品牌、售卖日期字段

PUT /tvs
PUT /tvs/_mapping {   "properties": {     "price": {       "type": "long"     },     "color": {       "type": "keyword"     },     "brand": {       "type": "keyword"     },     "sold_date": {       "type": "date"     }   } }

插入数据

POST /tvs/_bulk {"index":{}} {"price":1000,"color":"红色","brand":"长虹","sold_date":"2019-10-28"} {"index":{}} {"price":2000,"color":"红色","brand":"长虹","sold_date":"2019-11-05"} {"index":{}} {"price":3000,"color":"绿色","brand":"小米","sold_date":"2019-05-18"} {"index":{}} {"price":1500,"color":"蓝色","brand":"TCL","sold_date":"2019-07-02"} {"index":{}} {"price":1200,"color":"绿色","brand":"TCL","sold_date":"2019-08-19"} {"index":{}} {"price":2000,"color":"红色","brand":"长虹","sold_date":"2019-11-05"} {"index":{}} {"price":8000,"color":"红色","brand":"三星","sold_date":"2020-01-01"} {"index":{}} {"price":2500,"color":"蓝色","brand":"小米","sold_date":"2020-02-12"}

二、 按照颜色分组,计算每个颜色卖出的个数

ES语句

GET /tvs/_search {   "size": 0,   "query": {     "match_all": {}   },   "aggs": {     "group_by_color": {       "terms": {         "field": "color"       }     }   } }

返回

{   "took" : 1,   "timed_out" : false,   "_shards" : {     "total" : 1,     "successful" : 1,     "skipped" : 0,     "failed" : 0   },   "hits" : {     "total" : {       "value" : 8,       "relation" : "eq"     },     "max_score" : null,     "hits" : [ ]   },   "aggregations" : {     "group_by_color" : {       "doc_count_error_upper_bound" : 0,       "sum_other_doc_count" : 0,       "buckets" : [         {           "key" : "红色",           "doc_count" : 4         },         {           "key" : "绿色",           "doc_count" : 2         },         {           "key" : "蓝色",           "doc_count" : 2         }       ]     }   } }

Java代码

//按照颜色分组,计算每个颜色卖出的个数     @Test     public void testAggs() throws IOException {         //1 构建请求         SearchRequest searchRequest=new SearchRequest("tvs");         //请求体         SearchSourceBuilder searchSourceBuilder=new SearchSourceBuilder();         searchSourceBuilder.size(0);         searchSourceBuilder.query(QueryBuilders.matchAllQuery());         TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms("group_by_color").field("color");         searchSourceBuilder.aggregation(termsAggregationBuilder);         //请求体放入请求头         searchRequest.source(searchSourceBuilder);         //2 执行         SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);         Aggregations aggregations = searchResponse.getAggregations();         Terms group_by_color = aggregations.get("group_by_color");         List<? extends Terms.Bucket> buckets = group_by_color.getBuckets();         for (Terms.Bucket bucket : buckets) {             String key = bucket.getKeyAsString();             System.out.println("key:"+key);             long docCount = bucket.getDocCount();             System.out.println("docCount:"+docCount);             System.out.println("=================================");         }     }

结果

ElasticSearch7.3学习(二十九)----聚合实战之使用Java api实现电视案例

三、按照颜色分组,计算每个颜色卖出的个数,每个颜色卖出的平均价格

ES语句

GET /tvs/_search {   "size": 0,   "query": {     "match_all": {}   },   "aggs": {     "group_by_color": {       "terms": {         "field": "color"       },       "aggs": {         "avg_price": {           "avg": {             "field": "price"           }         }       }     }   } }

返回结果

{   "took" : 2,   "timed_out" : false,   "_shards" : {     "total" : 1,     "successful" : 1,     "skipped" : 0,     "failed" : 0   },   "hits" : {     "total" : {       "value" : 8,       "relation" : "eq"     },     "max_score" : null,     "hits" : [ ]   },   "aggregations" : {     "group_by_color" : {       "doc_count_error_upper_bound" : 0,       "sum_other_doc_count" : 0,       "buckets" : [         {           "key" : "红色",           "doc_count" : 4,           "avg_price" : {             "value" : 3250.0           }         },         {           "key" : "绿色",           "doc_count" : 2,           "avg_price" : {             "value" : 2100.0           }         },         {           "key" : "蓝色",           "doc_count" : 2,           "avg_price" : {             "value" : 2000.0           }         }       ]     }   } }

Java代码

// 按照颜色分组,计算每个颜色卖出的个数,每个颜色卖出的平均价格     @Test     public void testAggsAndAvg() throws IOException {         //1 构建请求         SearchRequest searchRequest=new SearchRequest("tvs");         //请求体         SearchSourceBuilder searchSourceBuilder=new SearchSourceBuilder();         searchSourceBuilder.size(0);         searchSourceBuilder.query(QueryBuilders.matchAllQuery());         TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms("group_by_color").field("color");         //terms聚合下填充一个子聚合         AvgAggregationBuilder avgAggregationBuilder = AggregationBuilders.avg("avg_price").field("price");         termsAggregationBuilder.subAggregation(avgAggregationBuilder);         searchSourceBuilder.aggregation(termsAggregationBuilder);         //请求体放入请求头         searchRequest.source(searchSourceBuilder);         //2 执行         SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);         Aggregations aggregations = searchResponse.getAggregations();         Terms group_by_color = aggregations.get("group_by_color");         List<? extends Terms.Bucket> buckets = group_by_color.getBuckets();         for (Terms.Bucket bucket : buckets) {             String key = bucket.getKeyAsString();             System.out.println("key:"+key);             long docCount = bucket.getDocCount();             System.out.println("docCount:"+docCount);             Aggregations aggregations1 = bucket.getAggregations();             Avg avg_price = aggregations1.get("avg_price");             double value = avg_price.getValue();             System.out.println("value:"+value);             System.out.println("=================================");         }     }

返回结果

ElasticSearch7.3学习(二十九)----聚合实战之使用Java api实现电视案例

四、按照颜色分组,计算每个颜色卖出的个数,以及每个颜色卖出的平均值、最大值、最小值、总和

ES语句

GET /tvs/_search {   "size": 0,   "aggs": {     "group_by_color": {       "terms": {         "field": "color"       },       "aggs": {         "avg_price": {           "avg": {             "field": "price"           }         },         "min_price": {           "min": {             "field": "price"           }         },         "max_price": {           "max": {             "field": "price"           }         },         "sum_price": {           "sum": {             "field": "price"           }         }       }     }   } }

返回结果

{   "took" : 1,   "timed_out" : false,   "_shards" : {     "total" : 1,     "successful" : 1,     "skipped" : 0,     "failed" : 0   },   "hits" : {     "total" : {       "value" : 8,       "relation" : "eq"     },     "max_score" : null,     "hits" : [ ]   },   "aggregations" : {     "group_by_color" : {       "doc_count_error_upper_bound" : 0,       "sum_other_doc_count" : 0,       "buckets" : [         {           "key" : "红色",           "doc_count" : 4,           "max_price" : {             "value" : 8000.0           },           "min_price" : {             "value" : 1000.0           },           "avg_price" : {             "value" : 3250.0           },           "sum_price" : {             "value" : 13000.0           }         },         {           "key" : "绿色",           "doc_count" : 2,           "max_price" : {             "value" : 3000.0           },           "min_price" : {             "value" : 1200.0           },           "avg_price" : {             "value" : 2100.0           },           "sum_price" : {             "value" : 4200.0           }         },         {           "key" : "蓝色",           "doc_count" : 2,           "max_price" : {             "value" : 2500.0           },           "min_price" : {             "value" : 1500.0           },           "avg_price" : {             "value" : 2000.0           },           "sum_price" : {             "value" : 4000.0           }         }       ]     }   } }

Java代码

    // 按照颜色分组,计算每个颜色卖出的个数,以及每个颜色卖出的平均值、最大值、最小值、总和。     @Test     public void testAggsAndMore() throws IOException {         //1 构建请求         SearchRequest searchRequest=new SearchRequest("tvs");         //请求体         SearchSourceBuilder searchSourceBuilder=new SearchSourceBuilder();         searchSourceBuilder.size(0);         searchSourceBuilder.query(QueryBuilders.matchAllQuery());         TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms("group_by_color").field("color");         //termsAggregationBuilder里放入多个子聚合         AvgAggregationBuilder avgAggregationBuilder = AggregationBuilders.avg("avg_price").field("price");         MinAggregationBuilder minAggregationBuilder = AggregationBuilders.min("min_price").field("price");         MaxAggregationBuilder maxAggregationBuilder = AggregationBuilders.max("max_price").field("price");         SumAggregationBuilder sumAggregationBuilder = AggregationBuilders.sum("sum_price").field("price");          termsAggregationBuilder.subAggregation(avgAggregationBuilder);         termsAggregationBuilder.subAggregation(minAggregationBuilder);         termsAggregationBuilder.subAggregation(maxAggregationBuilder);         termsAggregationBuilder.subAggregation(sumAggregationBuilder);         searchSourceBuilder.aggregation(termsAggregationBuilder);         //请求体放入请求头         searchRequest.source(searchSourceBuilder);         //2 执行         SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);         Aggregations aggregations = searchResponse.getAggregations();         Terms group_by_color = aggregations.get("group_by_color");         List<? extends Terms.Bucket> buckets = group_by_color.getBuckets();         for (Terms.Bucket bucket : buckets) {             String key = bucket.getKeyAsString();             System.out.println("key:"+key);              long docCount = bucket.getDocCount();             System.out.println("docCount:"+docCount);              Aggregations aggregations1 = bucket.getAggregations();              Max max_price = aggregations1.get("max_price");             double maxPriceValue = max_price.getValue();             System.out.println("maxPriceValue:"+maxPriceValue);              Min min_price = aggregations1.get("min_price");             double minPriceValue = min_price.getValue();             System.out.println("minPriceValue:"+minPriceValue);              Avg avg_price = aggregations1.get("avg_price");             double avgPriceValue = avg_price.getValue();             System.out.println("avgPriceValue:"+avgPriceValue);              Sum sum_price = aggregations1.get("sum_price");             double sumPriceValue = sum_price.getValue();             System.out.println("sumPriceValue:"+sumPriceValue);              System.out.println("=================================");         }     }

返回结果

ElasticSearch7.3学习(二十九)----聚合实战之使用Java api实现电视案例 

五、按照售价每2000价格划分范围,算出每个区间的销售总额

ES语句

GET /tvs/_search {   "size": 0,   "aggs": {     "by_histogram": {       "histogram": {         "field": "price",         "interval": 2000       },       "aggs": {         "income": {           "sum": {             "field": "price"           }         }       }     }   } }

返回结果

查看代码
 {   "took" : 0,   "timed_out" : false,   "_shards" : {     "total" : 1,     "successful" : 1,     "skipped" : 0,     "failed" : 0   },   "hits" : {     "total" : {       "value" : 8,       "relation" : "eq"     },     "max_score" : null,     "hits" : [ ]   },   "aggregations" : {     "by_histogram" : {       "buckets" : [         {           "key" : 0.0,           "doc_count" : 3,           "income" : {             "value" : 3700.0           }         },         {           "key" : 2000.0,           "doc_count" : 4,           "income" : {             "value" : 9500.0           }         },         {           "key" : 4000.0,           "doc_count" : 0,           "income" : {             "value" : 0.0           }         },         {           "key" : 6000.0,           "doc_count" : 0,           "income" : {             "value" : 0.0           }         },         {           "key" : 8000.0,           "doc_count" : 1,           "income" : {             "value" : 8000.0           }         }       ]     }   } }

Java代码

    // 按照售价每2000价格划分范围,算出每个区间的销售总额 histogram     @Test     public void testAggsAndHistogram() throws IOException {         //1 构建请求         SearchRequest searchRequest=new SearchRequest("tvs");         //请求体         SearchSourceBuilder searchSourceBuilder=new SearchSourceBuilder();         searchSourceBuilder.size(0);         searchSourceBuilder.query(QueryBuilders.matchAllQuery());         HistogramAggregationBuilder histogramAggregationBuilder =                  AggregationBuilders.histogram("by_histogram").field("price").interval(2000);         SumAggregationBuilder sumAggregationBuilder = AggregationBuilders.sum("income").field("price");         histogramAggregationBuilder.subAggregation(sumAggregationBuilder);         searchSourceBuilder.aggregation(histogramAggregationBuilder);         //请求体放入请求头         searchRequest.source(searchSourceBuilder);         //2 执行         SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);         Aggregations aggregations = searchResponse.getAggregations();         Histogram group_by_color = aggregations.get("by_histogram");         List<? extends Histogram.Bucket> buckets = group_by_color.getBuckets();         for (Histogram.Bucket bucket : buckets) {             String keyAsString = bucket.getKeyAsString();             System.out.println("keyAsString:"+keyAsString);             long docCount = bucket.getDocCount();             System.out.println("docCount:"+docCount);              Aggregations aggregations1 = bucket.getAggregations();             Sum income = aggregations1.get("income");             double value = income.getValue();             System.out.println("value:"+value);              System.out.println("=================================");         }     }

返回结果

ElasticSearch7.3学习(二十九)----聚合实战之使用Java api实现电视案例

六、计算每个季度的销售总额

ES语句

GET /tvs/_search {   "size": 0,   "aggs": {     "sales": {       "date_histogram": {         "field": "sold_date",         "interval": "quarter",         "format": "yyyy-MM-dd",         "min_doc_count": 0,         "extended_bounds": {           "min": "2019-01-01",           "max": "2020-12-31"         }       },       "aggs": {         "income": {           "sum": {             "field": "price"           }         }       }     }   } }

返回结果

查看代码
 #! Deprecation: [interval] on [date_histogram] is deprecated, use [fixed_interval] or [calendar_interval] in the future. {   "took" : 6,   "timed_out" : false,   "_shards" : {     "total" : 1,     "successful" : 1,     "skipped" : 0,     "failed" : 0   },   "hits" : {     "total" : {       "value" : 8,       "relation" : "eq"     },     "max_score" : null,     "hits" : [ ]   },   "aggregations" : {     "sales" : {       "buckets" : [         {           "key_as_string" : "2019-01-01",           "key" : 1546300800000,           "doc_count" : 0,           "income" : {             "value" : 0.0           }         },         {           "key_as_string" : "2019-04-01",           "key" : 1554076800000,           "doc_count" : 1,           "income" : {             "value" : 3000.0           }         },         {           "key_as_string" : "2019-07-01",           "key" : 1561939200000,           "doc_count" : 2,           "income" : {             "value" : 2700.0           }         },         {           "key_as_string" : "2019-10-01",           "key" : 1569888000000,           "doc_count" : 3,           "income" : {             "value" : 5000.0           }         },         {           "key_as_string" : "2020-01-01",           "key" : 1577836800000,           "doc_count" : 2,           "income" : {             "value" : 10500.0           }         },         {           "key_as_string" : "2020-04-01",           "key" : 1585699200000,           "doc_count" : 0,           "income" : {             "value" : 0.0           }         },         {           "key_as_string" : "2020-07-01",           "key" : 1593561600000,           "doc_count" : 0,           "income" : {             "value" : 0.0           }         },         {           "key_as_string" : "2020-10-01",           "key" : 1601510400000,           "doc_count" : 0,           "income" : {             "value" : 0.0           }         }       ]     }   } }

Java代码

    // 计算每个季度的销售总额     @Test     public void testAggsAndDateHistogram() throws IOException {         //1 构建请求         SearchRequest searchRequest=new SearchRequest("tvs");         //请求体         SearchSourceBuilder searchSourceBuilder=new SearchSourceBuilder();         searchSourceBuilder.size(0);         searchSourceBuilder.query(QueryBuilders.matchAllQuery());         DateHistogramAggregationBuilder dateHistogramAggregationBuilder =                  AggregationBuilders.dateHistogram("date_histogram")                 .field("sold_date")                 .calendarInterval(DateHistogramInterval.QUARTER)                 .format("yyyy-MM-dd")                 .minDocCount(0)                 .extendedBounds(new ExtendedBounds("2019-01-01", "2020-12-31"));         SumAggregationBuilder sumAggregationBuilder =                  AggregationBuilders.sum("income").field("price");         dateHistogramAggregationBuilder.subAggregation(sumAggregationBuilder);         searchSourceBuilder.aggregation(dateHistogramAggregationBuilder);         //请求体放入请求头         searchRequest.source(searchSourceBuilder);         //2 执行         SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);         Aggregations aggregations = searchResponse.getAggregations();         ParsedDateHistogram date_histogram = aggregations.get("date_histogram");         List<? extends Histogram.Bucket> buckets = date_histogram.getBuckets();         for (Histogram.Bucket bucket : buckets) {             String keyAsString = bucket.getKeyAsString();             System.out.println("keyAsString:"+keyAsString);             long docCount = bucket.getDocCount();             System.out.println("docCount:"+docCount);              Aggregations aggregations1 = bucket.getAggregations();             Sum income = aggregations1.get("income");             double value = income.getValue();             System.out.println("value:"+value);             System.out.println("====================");         }     }

返回结果

ElasticSearch7.3学习(二十九)----聚合实战之使用Java api实现电视案例

 

发表评论

相关文章