1。背景本文档简单记录一个在es中使用bucket脚本进行聚合的例子。2.需求假设我们有一个简单的汽车销量数据,它记录了每个月售出的brand品牌汽车的salesVolume数量。这里需要汇总brand=BMW汽车的月销量比例3.数据准备3.1mappingPUT/index_bucket_script{"mappings":{"properties":{"month":{"type":"keyword"},"brand":{"type":"keyword"},"salesVolume":{"type":"integer"}}}}3.2插入数据PUT/index_bucket_script/_bulk{"index":{"_id":1}}{"month":"2023-01","brand":"BMW","salesVolume":100}{"index":{"_id":3}}{"month":"2023-02","brand":"Volkswagen","salesVolume":80}{"index":{"_id":4}}{"month":"2023-02","brand":"BMW","salesVolume":20}注:2023-02的数据这里插入了2个品牌的数据。4.bucket_script聚合语法5.聚合5.1按月分组排序GETindex_bucket_script/_search{"query":{"match_all":{}},"size":0,"aggs":{"按月分组":{"terms":{"field":"month","order":{"_key":"asc"}}}}}5.2统计每个月卖了多少辆车GETindex_bucket_script/_search{"query":{"match_all":{}},"size":0,"aggs":{"Groupbymonth":{"terms":{"field":"month","order":{"_key":"asc"}},"aggs":{"统计每个月卖出多少辆汽车":{"sum":{"field":"salesVolume"}}}}}}5.3统计每个月卖出多少辆宝马车GETindex_bucket_script/_search{“查询”:{“匹配所有”:{}},"size":0,"aggs":{"Groupbymonth":{"terms":{"field":"month","order":{"_key":"asc"}},"aggs":{"统计每个月卖出多少辆汽车":{"sum":{"field":"salesVolume"}},"统计每个月卖出多少辆宝马":{"filter":{"term":{"brand":"BMW"}},"aggs":{"每月销售的宝马汽车数量":{"sum":{"field":"salesVolume"}}}}}}}}5.4宝马车月销量比例5.4.1dslGETindex_bucket_script/_search{"query":{"match_all":{}},"size":0,"aggs":{"Groupbymonth":{"terms":{"field":"month","order":{"_key":"asc"}},"aggs":{"统计每个月卖多少辆车":{"sum":{"field":"salesVolume"}},"统计每个月卖出多少辆宝马车":{"filter":{"term":{"brand":"BMW"}},"aggs":{"宝马每月销量":{"sum":{"field":"salesVolume"}}}},"宝马每月销量占比":{"bucket_script":{"buckets_path":{"fenzi":"统计每月销售宝马数量>每月销售宝马数量","fenmu":"统计每月销售多少辆汽车"},"script":"params.fenzi/params.fenmu*100"}}}}}}5.4.2java@Test@DisplayName("宝马汽车月销量统计")publicvoidtest01()throwsIOException{SearchRequestrequest=SearchRequest.of(searchRequest->searchRequest.index(INDEX_PERSON).query(query->query.matchAll(matchAll->matchAll)).size(0).aggregations("Groupbymonth",monthAggr->monthAggr.terms(terms->terms.field("month").order(NamedValue.of("_key",SortOrder.Asc))).aggregations("统计每个月卖了多少辆车",agg1->agg1.sum(sum->sum.field("salesVolume"))).aggregations("统计每个月卖出了多少宝马车",agg2->agg2.filter(filter->filter.term(term->term.field("brand").value("BMW"))).aggregations("每月销售的BMW车辆数量",agg3->agg3.sum(sum->sum.field("salesVolume")))).aggregations("宝马汽车月销量占比",rateAggr->rateAggr.bucketScript(bucketScript->bucketScript.bucketsPath(path->path.dict(newHashMap
