欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

ES結(jié)合java代碼聚合查詢詳細示例

 更新時間:2023年05月06日 08:48:15   作者:磚廠老干部  
es查詢有一個很常用的一種叫聚合查詢,相當于mysql中的分組group by 后拿各組數(shù)量進行統(tǒng)計,實現(xiàn)起來也是很簡單,下面這篇文章主要給大家介紹了關(guān)于ES結(jié)合java代碼聚合查詢的相關(guān)資料,需要的朋友可以參考下

思路不清晰的小伙伴可以先在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)文章

  • Java拆裝箱深度剖析

    Java拆裝箱深度剖析

    這篇文章主要為大家深度剖析了Java拆箱裝箱的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • MyBatis類型轉(zhuǎn)換模塊的實現(xiàn)

    MyBatis類型轉(zhuǎn)換模塊的實現(xiàn)

    MyBatis是一個持久層框架ORM框架,實現(xiàn)數(shù)據(jù)庫中數(shù)據(jù)和Java對象中的屬性的雙向映射,那么不可避免的就會碰到類型轉(zhuǎn)換的問題,本文主要介紹了MyBatis類型轉(zhuǎn)換模塊的實現(xiàn),感興趣的可以了解一下
    2023-09-09
  • Java啟用Azure Linux虛擬機診斷設(shè)置

    Java啟用Azure Linux虛擬機診斷設(shè)置

    這篇文章主要介紹了Java啟用Azure Linux虛擬機診斷設(shè)置,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-05-05
  • 聊聊finally中的代碼一定會執(zhí)行嗎

    聊聊finally中的代碼一定會執(zhí)行嗎

    通常在面試中,只要是疑問句一般答案都是“否定”的,因為如果是“確定”和“正?!钡?那面試官就沒有必要再問了嘛,本文想和大家聊聊finally中的代碼一定會執(zhí)行嗎?,感興趣的朋友跟著小編一起來看看吧
    2023-12-12
  • Java 實現(xiàn)萬年歷總結(jié)

    Java 實現(xiàn)萬年歷總結(jié)

    這篇文章主要介紹了Java 萬年歷實現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下
    2016-09-09
  • 如何使用IDEA2022.1?創(chuàng)建Spring?Boot項目

    如何使用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ù)只顯示一條的問題

    這篇文章主要介紹了解決mybatis一對多關(guān)聯(lián)查詢多條數(shù)據(jù)只顯示一條的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • java 設(shè)計模式之State(狀態(tài)模式)

    java 設(shè)計模式之State(狀態(tài)模式)

    這篇文章主要介紹了java 設(shè)計模式之State(狀態(tài)模式)的相關(guān)資料,一個類的行為基于它的狀態(tài)的改變而改變。狀態(tài)模式歸屬于行為型模式,需要的朋友可以參考下
    2017-08-08
  • RocketMQ消息發(fā)送與消息類別詳解

    RocketMQ消息發(fā)送與消息類別詳解

    這篇文章主要介紹了RocketMQ消息發(fā)送與消息類別詳解,事務(wù)消息的生產(chǎn)者執(zhí)行本地事務(wù),并根據(jù)事務(wù)執(zhí)行的結(jié)果選擇是否提交或回滾事務(wù),
    如果事務(wù)執(zhí)行成功并選擇提交事務(wù),則產(chǎn)生注冊成功消息,進入下一步,需要的朋友可以參考下
    2023-09-09
  • 基于java下載中g(shù)etContentLength()一直為-1的一些思路

    基于java下載中g(shù)etContentLength()一直為-1的一些思路

    下面小編就為大家?guī)硪黄趈ava下載中g(shù)etContentLength()一直為-1的一些思路。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06

最新評論