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

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

 更新時(shí)間:2023年05月06日 08:48:15   作者:磚廠老干部  
es查詢有一個(gè)很常用的一種叫聚合查詢,相當(dāng)于mysql中的分組group by 后拿各組數(shù)量進(jìn)行統(tǒng)計(jì),實(shí)現(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)建實(shí)體類來接參

 
    /*=====================聚合分析=====================*/
    /**
     * 查詢到的所有商品所涉及的所有品牌
     */
    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ǎn)需要更改的 回調(diào)參數(shù)是Aggregations需要改成Terms才能調(diào)取方法

//獲取聚合參數(shù)
Aggregations brandAggregations = response.getAggregations();
//獲取品牌
Terms brandGations = brandAggregations.get("brandAgg");

循環(huán)獲取參數(shù)添加到指定的集合當(dāng)中,這個(gè)獲取的就相當(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);
}

 因?yàn)槲易钔鈱又挥幸粋€(gè)分組,所以在循環(huán)中繼續(xù)獲取數(shù)據(jù)

這個(gè)bucket就相當(dāng)于es當(dāng)中獲取下一層級因?yàn)槲以O(shè)定的brand和type都是一個(gè)層的所以都使用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);
}

 最后在添加到實(shí)體類的對象當(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報(bào)錯(cuò):There is no getter for property named'Xxx'in'class xxx.xxx.Xxx'

    解決MyBatis報(bào)錯(cuò):There is no getter for 

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

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

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

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

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

    詳解Jackson的基本用法

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

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

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

    Java?CyclicBarrier錯(cuò)誤使用的實(shí)例

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

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

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

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

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

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

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

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

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

最新評論

垣曲县| 宁化县| 延长县| 邵阳县| 邳州市| 东阿县| 高碑店市| 土默特左旗| 江达县| 油尖旺区| 高淳县| 泾源县| 肥乡县| 华阴市| 灵寿县| 福泉市| 金堂县| 酒泉市| 抚宁县| 新巴尔虎右旗| 陇川县| 乡宁县| 高密市| 从化市| 通辽市| 崇信县| 辉南县| 汕头市| 宾阳县| 平乡县| 惠州市| 怀柔区| 临邑县| 福泉市| 兖州市| 彰化县| 张家港市| 当雄县| 香港| 册亨县| 调兵山市|