ES結(jié)合java代碼聚合查詢詳細(xì)示例
思路不清晰的小伙伴可以先在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是精準(zhǔn)查詢,模糊查詢可以去掉
查詢完成后這是聚合的結(jié)構(gòu)

pom文件中引入依賴es依賴,在這里就不詳細(xì)介紹了,首先在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ù)添加到指定的集合當(dāng)中,這個獲取的就相當(dāng)于是es當(dāng)中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就相當(dāng)于es當(dāng)中獲取下一層級因為我設(shè)定的brand和type都是一個層的所以都使用bucket來獲取參數(shù)
get的變量就是相當(dāng)于es中設(shè)置的名稱然后我們拿到下面的key的值加入到我們的集合當(dāng)中
注意一下這是基于上一層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當(dāng)中設(shè)定好的層級關(guān)系一級一級的獲取后在添加到我們設(shè)定好的集合當(dāng)中
把其他的層級都一步一步獲取出來
//獲取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);
}最后在添加到實體類的對象當(dāng)中
//添加對象中數(shù)據(jù) result.getProductInfoList().addAll(productInfoList); result.getBrands().addAll(brandVOList); result.getAttrs().addAll(attrList); result.getTypes().addAll(typeList);
最后查詢,就獲取到了我們聚合后的值了,在根據(jù)業(yè)務(wù)進(jìn)行下一步的操作
最后展示一下所有的代碼
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)給以往的版本略微的不同,細(xì)心的小編在此記錄下,需要的朋友可以參考下2022-08-08
解決mybatis一對多關(guān)聯(lián)查詢多條數(shù)據(jù)只顯示一條的問題
這篇文章主要介紹了解決mybatis一對多關(guān)聯(lián)查詢多條數(shù)據(jù)只顯示一條的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12
java 設(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

