最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2023年05月06日 08:48:15   作者:磚廠老干部  
es查詢有一個很常用的一種叫聚合查詢,相當(dāng)于mysql中的分組group by 后拿各組數(shù)量進(jìn)行統(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是精準(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)文章

  • 解決MyBatis報錯:There is no getter for property named'Xxx'in'class xxx.xxx.Xxx'

    解決MyBatis報錯:There is no getter for 

    這篇文章主要介紹了解決MyBatis報錯:There is no getter for property named'Xxx'in'class xxx.xxx.Xxx'問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • xxl-job的部署及springboot集成使用示例詳解

    xxl-job的部署及springboot集成使用示例詳解

    XXL-Job是一個分布式任務(wù)調(diào)度平臺,可進(jìn)行任務(wù)調(diào)度、管理和監(jiān)控,并提供任務(wù)分片、失敗重試、動態(tài)分配等功能,這篇文章主要介紹了xxl-job的部署及springboot集成使用,需要的朋友可以參考下
    2023-06-06
  • 深入了解JVM字節(jié)碼增強技術(shù)

    深入了解JVM字節(jié)碼增強技術(shù)

    這篇文章主要介紹了深入了解JVM字節(jié)碼增強技術(shù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-11-11
  • 詳解Jackson的基本用法

    詳解Jackson的基本用法

    Java生態(tài)圈中有很多處理JSON和XML格式化的類庫,Jackson是其中比較著名的一個。雖然JDK自帶了XML處理類庫,但是相對來說比較低級,使用本文介紹的Jackson等高級類庫處理起來會方便很多
    2021-06-06
  • Java之TreeSet和TreeMap的兩種排序方式解讀

    Java之TreeSet和TreeMap的兩種排序方式解讀

    這篇文章主要介紹了Java之TreeSet和TreeMap的兩種排序方式解讀,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Java?CyclicBarrier錯誤使用的實例

    Java?CyclicBarrier錯誤使用的實例

    文章描述了一個Java程序使用CyclicBarrier實現(xiàn)兩個線程交替打印字母和數(shù)字時遇到的問題,由于線程執(zhí)行順序不當(dāng),導(dǎo)致輸出結(jié)果與預(yù)期不符,通過調(diào)整線程的等待和打印順序,解決了問題,文章還提供了一個控制流圖來詳細(xì)解釋修改前后的程序邏輯
    2025-01-01
  • springboot HandlerIntercepter攔截器修改request body數(shù)據(jù)的操作

    springboot HandlerIntercepter攔截器修改request body數(shù)據(jù)的操作

    這篇文章主要介紹了springboot HandlerIntercepter攔截器修改request body數(shù)據(jù)的操作,具有很好的參考價值,希望對大家有所幫助。
    2021-06-06
  • java多線程和并發(fā)包入門示例

    java多線程和并發(fā)包入門示例

    這篇文章主要寫了java多線程的使用方法和java并發(fā)包簡單入門的示例,大家可以參考使用
    2013-11-11
  • SpringBoot @Validated注解實現(xiàn)參數(shù)分組校驗的方法實例

    SpringBoot @Validated注解實現(xiàn)參數(shù)分組校驗的方法實例

    這篇文章主要給大家介紹了關(guān)于SpringBoot @Validated注解實現(xiàn)參數(shù)分組校驗的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • 關(guān)于javaWeb中405錯誤的解決方法

    關(guān)于javaWeb中405錯誤的解決方法

    下面小編就為大家?guī)硪黄P(guān)于javaWeb中405錯誤的解決方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05

最新評論

刚察县| 鲁山县| 云林县| 甘德县| 萝北县| 峨眉山市| 城口县| 玛纳斯县| 萍乡市| 会同县| 修文县| 龙岩市| 台湾省| 张家界市| 大厂| 汝阳县| 嘉祥县| 甘孜县| 巴东县| 上饶市| 乌拉特后旗| 蚌埠市| 潞城市| 综艺| 酒泉市| 五指山市| 福建省| 吉木乃县| 苏州市| 德钦县| 随州市| 大新县| 资溪县| 麻栗坡县| 民和| 黎城县| 沈阳市| 浦北县| 靖边县| 朝阳县| 黄平县|