@RequestMapping(value = "test/es/agg/shopGoods", method = RequestMethod.GET)
public void shopGoods() throws Exception {
RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(HttpHost.create("127.0.0.1:19200")));
// 店铺聚合名和字段
String shop_term = "shop_term";
String shopId = "shop_id";
//商品聚合名和字段
String goods_top = "goods_top";
String goodsIdSort = "good_id";
AggregationBuilder shopData = AggregationBuilders.terms(shop_term).size(1000).field(shopId).minDocCount(4);//.order(BucketOrder.count(true))
AggregationBuilder subShopData = AggregationBuilders.topHits(goods_top).fetchSource(new String[]{"good_id"}, new String[]{}).docValueField("goodsId")
.size(4)
.sort(SortBuilders.fieldSort(goodsIdSort)
.order(SortOrder.DESC));//文档只获取商品id字段
shopData.subAggregation(subShopData);
// 定义请求对象
SearchSourceBuilder builder = new SearchSourceBuilder();
builder.aggregation(shopData);
// 打印返回数据
SearchRequest searchRequest = new SearchRequest("yourIndexName");
searchRequest.source().size(0); // 不需要实际的文档内容,只关心聚合结果
// searchSourceBuilder.fetchSource(true);
FieldSortBuilder shopIdOrder = new FieldSortBuilder("shopId").order(SortOrder.DESC);
builder.sort(shopIdOrder);
searchRequest.source(builder);
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
Aggregations aggregations = searchResponse.getAggregations();
Terms brandTerms = aggregations.get(shop_term);
List<? extends Terms.Bucket> buckets = brandTerms.getBuckets() ;
for(Terms.Bucket bucket : buckets){
String shopId= bucket.getKeyAsString() ;
System.out.println(shopId) ;
Aggregations aggregationsSub = bucket.getAggregations();
ParsedTopHits searchHits = aggregationsSub.get(goods_top);
if(null!=searchHits){
searchHits.getHits();
searchHits.getHits().getHits()[0].getSourceAsMap();//goods_id
}
}
}
springboot elasticsearch 聚合查询 每个店铺统计出4个商品
于 2024-05-21 17:59:17 首次发布