ES結(jié)合java代碼聚合查詢詳細示例
思路不清晰的小伙伴可以先在es中把聚合代碼寫出來
{ "aggs": { "brandAgg": { "terms": { "field": "brandName.keyword" }, "aggs": { "typeAgg": { "terms": { "field": "typeTwoName.keyword" } }, "ruleAgg": { "terms": { "field": "ruleName.keyword" }, "aggs": { "ruleValueAgg": { "terms": { "field": "ruleAttrValue.keyword" } } } } } } }
注:字段名稱加keyword是精準查詢,模糊查詢可以去掉
查詢完成后這是聚合的結(jié)構(gòu)
pom文件中引入依賴es依賴,在這里就不詳細介紹了,首先在java中構(gòu)建對象
//構(gòu)建對象 SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
在java代碼中先把要聚合的名稱創(chuàng)建出來
根據(jù)剛剛的es代碼設(shè)置java中的terms名稱和field后面的名稱相對應(yīng)
//構(gòu)建聚合名稱 TermsAggregationBuilder brandAgg = AggregationBuilders.terms("brandAgg").field("brandName.keyword"); TermsAggregationBuilder typeAgg = AggregationBuilders.terms("typeAgg").field("typeTwoName.keyword"); TermsAggregationBuilder ruleAgg = AggregationBuilders.terms("ruleAgg").field("ruleName.keyword"); TermsAggregationBuilder ruleValueAgg = AggregationBuilders.terms("ruleValueAgg").field("ruleAttrValue.keyword");
這里是根據(jù)es代碼中創(chuàng)建的層級關(guān)系來依次分配
//根據(jù)聚合分配層級 brandAgg.subAggregation(typeAgg); brandAgg.subAggregation(ruleAgg); ruleAgg.subAggregation(ruleValueAgg); //添加最外層聚合 searchSourceBuilder.aggregation(brandAgg);
創(chuàng)建實體類來接參
/*=====================聚合分析=====================*/ /** * 查詢到的所有商品所涉及的所有品牌 */ private Set<BrandVO> brands = new HashSet<>(); /** * 查詢到的所有商品所涉及的所有分類 */ private Set<TypeVO> types = new HashSet<>(); /** * 查詢到的所有商品所涉及的所有屬性(規(guī)格) */ private Set<AttrVO> attrs = new HashSet<>(); @Data public static class BrandVO { private Long brandId; private String brandName; private String brandImg; } @Data public static class TypeVO { private Long TypeId; private String TypeName; } @Data public static class AttrVO { private Long attrId; private String attrName; private List<String> attrValue; } @Data public static class BreadCrumbsVO { private String attrName; private String attrValue; private String link; }
在方法中把參數(shù)先備好
//定義參數(shù) Set<SearchResult.BrandVO> brandVOList = new HashSet<>(); Set<SearchResult.TypeVO> typeList = new HashSet<>(); Set<SearchResult.AttrVO> attrList = new HashSet<>();
首先獲取最外層的參數(shù)
有一點需要更改的 回調(diào)參數(shù)是Aggregations需要改成Terms才能調(diào)取方法
//獲取聚合參數(shù) Aggregations brandAggregations = response.getAggregations(); //獲取品牌 Terms brandGations = brandAggregations.get("brandAgg");
循環(huán)獲取參數(shù)添加到指定的集合當中,這個獲取的就相當于是es當中key的值
for (Terms.Bucket bucket : brandGations.getBuckets()) { //添加品牌 SearchResult.BrandVO brandVO = new SearchResult.BrandVO(); brandVO.setBrandName(bucket.getKeyAsString()); brandVOList.add(brandVO); }
因為我最外層只有一個分組,所以在循環(huán)中繼續(xù)獲取數(shù)據(jù)
這個bucket就相當于es當中獲取下一層級因為我設(shè)定的brand和type都是一個層的所以都使用bucket來獲取參數(shù)
get的變量就是相當于es中設(shè)置的名稱然后我們拿到下面的key的值加入到我們的集合當中
注意一下這是基于上一層for循環(huán)中嵌套的
//獲取類型 Aggregations aggregations = bucket.getAggregations(); Terms typeGations = aggregations.get("typeAgg"); //添加類型 for (Terms.Bucket typeGationsBucket : typeGations.getBuckets()) { SearchResult.TypeVO typeVO = new SearchResult.TypeVO(); typeVO.setTypeName(typeGationsBucket.getKeyAsString()); typeList.add(typeVO); }
接下來就簡單了,根據(jù)es當中設(shè)定好的層級關(guān)系一級一級的獲取后在添加到我們設(shè)定好的集合當中
把其他的層級都一步一步獲取出來
//獲取spu Terms ruleGations = aggregations.get("ruleAgg"); //添加spu for (Terms.Bucket ruleGationsBucket : ruleGations.getBuckets()) { SearchResult.AttrVO attrVO = new SearchResult.AttrVO(); attrVO.setAttrName(ruleGationsBucket.getKeyAsString()); //獲取sku Aggregations attrValueAggregations = ruleGationsBucket.getAggregations(); Terms ruleValueGations = attrValueAggregations.get("ruleValueAgg"); //添加sku for (Terms.Bucket ruleValueGationsBucket : ruleValueGations.getBuckets()) { ArrayList<String> attrValueList = new ArrayList<>(); for (String attrValue : ruleValueGationsBucket.getKeyAsString().split(",")) { attrValueList.add(attrValue); } attrVO.setAttrValue(attrValueList); } attrList.add(attrVO); }
最后在添加到實體類的對象當中
//添加對象中數(shù)據(jù) result.getProductInfoList().addAll(productInfoList); result.getBrands().addAll(brandVOList); result.getAttrs().addAll(attrList); result.getTypes().addAll(typeList);
最后查詢,就獲取到了我們聚合后的值了,在根據(jù)業(yè)務(wù)進行下一步的操作
最后展示一下所有的代碼
SearchResult result = new SearchResult(); try { //構(gòu)建對象 SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); //構(gòu)建聚合名稱 TermsAggregationBuilder brandAgg = AggregationBuilders.terms("brandAgg").field("brandName.keyword"); TermsAggregationBuilder typeAgg = AggregationBuilders.terms("typeAgg").field("typeTwoName.keyword"); TermsAggregationBuilder ruleAgg = AggregationBuilders.terms("ruleAgg").field("ruleName.keyword"); TermsAggregationBuilder ruleValueAgg = AggregationBuilders.terms("ruleValueAgg").field("ruleAttrValue.keyword"); //根據(jù)聚合分配層級 brandAgg.subAggregation(typeAgg); brandAgg.subAggregation(ruleAgg); ruleAgg.subAggregation(ruleValueAgg); //添加最外層聚合 searchSourceBuilder.aggregation(brandAgg); //定義參數(shù) Set<SearchResult.BrandVO> brandVOList = new HashSet<>(); Set<SearchResult.TypeVO> typeList = new HashSet<>(); Set<SearchResult.AttrVO> attrList = new HashSet<>(); //獲取聚合參數(shù) Aggregations brandAggregations = response.getAggregations(); //獲取品牌 Terms brandGations = brandAggregations.get("brandAgg"); for (Terms.Bucket bucket : brandGations.getBuckets()) { //添加品牌 SearchResult.BrandVO brandVO = new SearchResult.BrandVO(); brandVO.setBrandName(bucket.getKeyAsString()); brandVOList.add(brandVO); //獲取類型 Aggregations aggregations = bucket.getAggregations(); Terms typeGations = aggregations.get("typeAgg"); //添加類型 for (Terms.Bucket typeGationsBucket : typeGations.getBuckets()) { SearchResult.TypeVO typeVO = new SearchResult.TypeVO(); typeVO.setTypeName(typeGationsBucket.getKeyAsString()); typeList.add(typeVO); } //獲取spu Terms ruleGations = aggregations.get("ruleAgg"); //添加spu for (Terms.Bucket ruleGationsBucket : ruleGations.getBuckets()) { SearchResult.AttrVO attrVO = new SearchResult.AttrVO(); attrVO.setAttrName(ruleGationsBucket.getKeyAsString()); //獲取sku Aggregations attrValueAggregations = ruleGationsBucket.getAggregations(); Terms ruleValueGations = attrValueAggregations.get("ruleValueAgg"); //添加sku for (Terms.Bucket ruleValueGationsBucket : ruleValueGations.getBuckets()) { ArrayList<String> attrValueList = new ArrayList<>(); for (String attrValue : ruleValueGationsBucket.getKeyAsString().split(",")) { attrValueList.add(attrValue); } attrVO.setAttrValue(attrValueList); } attrList.add(attrVO); } } //添加對象中數(shù)據(jù) result.getProductInfoList().addAll(productInfoList); result.getBrands().addAll(brandVOList); result.getAttrs().addAll(attrList); result.getTypes().addAll(typeList); } }catch (Exception ex){ log.error("檢索ES失敗: {}", ex); }
總結(jié)
到此這篇關(guān)于ES結(jié)合java代碼聚合查詢的文章就介紹到這了,更多相關(guān)ES結(jié)合java聚合查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何使用IDEA2022.1?創(chuàng)建Spring?Boot項目
這篇文章主要介紹了如何使用IDEA2022.1?創(chuàng)建Spring?Boot項目,大家在使用idea開發(fā)工具時發(fā)現(xiàn)給以往的版本略微的不同,細心的小編在此記錄下,需要的朋友可以參考下2022-08-08解決mybatis一對多關(guān)聯(lián)查詢多條數(shù)據(jù)只顯示一條的問題
這篇文章主要介紹了解決mybatis一對多關(guān)聯(lián)查詢多條數(shù)據(jù)只顯示一條的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12java 設(shè)計模式之State(狀態(tài)模式)
這篇文章主要介紹了java 設(shè)計模式之State(狀態(tài)模式)的相關(guān)資料,一個類的行為基于它的狀態(tài)的改變而改變。狀態(tài)模式歸屬于行為型模式,需要的朋友可以參考下2017-08-08基于java下載中g(shù)etContentLength()一直為-1的一些思路
下面小編就為大家?guī)硪黄趈ava下載中g(shù)etContentLength()一直為-1的一些思路。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-06-06