国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Spring Boot 整合 分布式搜索引擎 Elastic Search 實(shí)現(xiàn) 數(shù)據(jù)聚合

這篇具有很好參考價(jià)值的文章主要介紹了Spring Boot 整合 分布式搜索引擎 Elastic Search 實(shí)現(xiàn) 數(shù)據(jù)聚合。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

?引言

本文參考黑馬 分布式Elastic search

Elasticsearch是一款非常強(qiáng)大的開源搜索引擎,具備非常多強(qiáng)大功能,可以幫助我們從海量數(shù)據(jù)中快速找到需要的內(nèi)容

本篇文章將講解 Elastic Search 如何實(shí)現(xiàn)數(shù)據(jù)聚合,以及 在項(xiàng)目實(shí)戰(zhàn)中如何通過數(shù)據(jù)聚合實(shí)現(xiàn)業(yè)務(wù)需求并完成功能。

一、數(shù)據(jù)聚合

?簡(jiǎn)介

以下為官方 解釋:

聚合可以進(jìn)行各種組合以構(gòu)建復(fù)雜的數(shù)據(jù)匯總。

可以看作是在一組文檔上建立分析信息的工作單元,統(tǒng)計(jì)一些文檔集。聚合可以將一些獨(dú)立的功能單元可以被混合在一起來滿足你的需求,是一種單獨(dú)的語法。
kibana的可視化看板就是非常經(jīng)典的聚合功能的體現(xiàn)

簡(jiǎn)單的來說:

聚合 可以讓我們極其方便的實(shí)現(xiàn)對(duì)數(shù)據(jù)的統(tǒng)計(jì)、分析、運(yùn)算。例如:

  • 什么品牌的手機(jī)最受歡迎?
  • 這些手機(jī)的平均價(jià)格、最高價(jià)格、最低價(jià)格?
  • 這些手機(jī)每月的銷售情況如何?

實(shí)現(xiàn)這些統(tǒng)計(jì)功能的比數(shù)據(jù)庫(kù)的sql要方便的多,而且查詢速度非常快,可以實(shí)現(xiàn)實(shí)時(shí)搜索效果。

聚合就是類似于垃圾分類,干濕分離,每個(gè)桶中裝不同的數(shù)據(jù)。

?聚合的分類

聚合主要分為三大類:

  • 桶(Bucket) 聚合:用來對(duì)文檔做分組
    • TermAggregation:按照文檔字段值分組,例如按照品牌值分組、按照國(guó)家分組
    • Date Histogram:按照日期階梯分組,例如一周為一組,或者一月為一組
  • 度量(Metric) 聚合:用以計(jì)算一些值,比如:最大值、最小值、平均值等
    • Avg:求平均值
    • Max:求最大值
    • Min:求最小值
    • Stats:同時(shí)求max、min、avg、sum等
  • 管道(pipeline) 聚合:其它聚合的結(jié)果為基礎(chǔ)做聚合

注意: 參加聚合的字段必須是keyword、日期、數(shù)值、布爾類型

二、DSL實(shí)現(xiàn)數(shù)據(jù)聚合

例如:要統(tǒng)計(jì)所有數(shù)據(jù)中的酒店品牌有幾種,其實(shí)就是按照品牌對(duì)數(shù)據(jù)分組。此時(shí)可以根據(jù)酒店品牌的名稱做聚合,也就是Bucket聚合。

?Bucket聚合

語法如下:

GET /hotel/_search
{
  "size": 0,  // 設(shè)置size為0,結(jié)果中不包含文檔,只包含聚合結(jié)果
  "aggs": { // 定義聚合
    "brandAgg": { //給聚合起個(gè)名字
      "terms": { // 聚合的類型,按照品牌值聚合,所以選擇term
        "field": "brand", // 參與聚合的字段
        "size": 20 // 希望獲取的聚合結(jié)果數(shù)量
      }
    }
  }
}

結(jié)果如圖:

Spring Boot 整合 分布式搜索引擎 Elastic Search 實(shí)現(xiàn) 數(shù)據(jù)聚合,從零到一 搞定 ElasticSearch,spring boot,分布式,搜索引擎,elasticsearch,微服務(wù),原力計(jì)劃

聚合結(jié)果進(jìn)行數(shù)據(jù)排序

默認(rèn)情況下,Bucket聚合會(huì)統(tǒng)計(jì)Bucket內(nèi)的文檔數(shù)量,記為 count,并且按照 _count降序排序

我們可以指定 order屬性,自定義聚合的排序方式:

GET /hotel/_search
{
  "size": 0, 
  "aggs": {
    "brandAgg": {
      "terms": {
        "field": "brand",
        "order": {
          "_count": "asc" // 按照_count升序排列
        },
        "size": 20
      }
    }
  }
}

Spring Boot 整合 分布式搜索引擎 Elastic Search 實(shí)現(xiàn) 數(shù)據(jù)聚合,從零到一 搞定 ElasticSearch,spring boot,分布式,搜索引擎,elasticsearch,微服務(wù),原力計(jì)劃

限定聚合范圍

默認(rèn)情況下,Bucket聚合是對(duì)索引庫(kù)的所有文檔做聚合,但真實(shí)場(chǎng)景下,用戶會(huì)輸入搜索條件,因此聚合必須是對(duì)搜索結(jié)果聚合。那么聚合必須添加限定條件。

我們可以限定要聚合的文檔范圍,只要添加query條件即可:

GET /hotel/_search
{
  "query": {
    "range": {
      "price": {
        "lte": 200 // 只對(duì)200元以下的文檔聚合
      }
    }
  }, 
  "size": 0, 
  "aggs": {
    "brandAgg": {
      "terms": {
        "field": "brand",
        "size": 20
      }
    }
  }
}

Spring Boot 整合 分布式搜索引擎 Elastic Search 實(shí)現(xiàn) 數(shù)據(jù)聚合,從零到一 搞定 ElasticSearch,spring boot,分布式,搜索引擎,elasticsearch,微服務(wù),原力計(jì)劃

?Metric聚合

我們對(duì)酒店按照品牌分組,形成了一個(gè)個(gè)桶。現(xiàn)在我們需要對(duì)桶內(nèi)的酒店做運(yùn)算,獲取每個(gè)品牌的用戶評(píng)分的min、max、avg等值。

這就要用到Metric聚合了,例如stat聚合:就可以獲取min、max、avg等結(jié)果。

語法如下:

GET /hotel/_search
{
  "size": 0, 
  "aggs": {
    "brandAgg": { 
      "terms": { 
        "field": "brand", 
        "size": 20
      },
      "aggs": { // 是brands聚合的子聚合,也就是分組后對(duì)每組分別計(jì)算
        "score_stats": { // 聚合名稱
          "stats": { // 聚合類型,這里stats可以計(jì)算min、max、avg等
            "field": "score" // 聚合字段,這里是score
          }
        }
      }
    }
  }
}

這次的score_stats聚合是在 brandAgg 的聚合內(nèi)部嵌套的子聚合。因?yàn)槲覀冃枰诿總€(gè)桶分別計(jì)算。

另外,我們還可以給聚合結(jié)果做個(gè)排序,例如按照每個(gè)桶的酒店平均分做排序:

Spring Boot 整合 分布式搜索引擎 Elastic Search 實(shí)現(xiàn) 數(shù)據(jù)聚合,從零到一 搞定 ElasticSearch,spring boot,分布式,搜索引擎,elasticsearch,微服務(wù),原力計(jì)劃

聚合小結(jié)

aggs代表聚合,與query同級(jí),此時(shí)query的作用是

  • 限定聚合的的文檔范圍

聚合必須的三要素:

  • 聚合名稱
  • 聚合類型
  • 聚合字段

聚合可配置屬性有:

  • size:指定聚合結(jié)果數(shù)量
  • order:指定聚合結(jié)果排序方式
  • field:指定聚合字段

三、RestAPI實(shí)現(xiàn)數(shù)據(jù)聚合

API語法

聚合條件與query條件同級(jí)別,因此需要使用request.source()來指定聚合條件。

聚合條件的語法:

Spring Boot 整合 分布式搜索引擎 Elastic Search 實(shí)現(xiàn) 數(shù)據(jù)聚合,從零到一 搞定 ElasticSearch,spring boot,分布式,搜索引擎,elasticsearch,微服務(wù),原力計(jì)劃

聚合的結(jié)果也與查詢結(jié)果不同,API也比較特殊。不過同樣是JSON逐層解析:

Spring Boot 整合 分布式搜索引擎 Elastic Search 實(shí)現(xiàn) 數(shù)據(jù)聚合,從零到一 搞定 ElasticSearch,spring boot,分布式,搜索引擎,elasticsearch,微服務(wù),原力計(jì)劃

?業(yè)務(wù)需求

需求:在搜索頁(yè)面的品牌、城市等信息不應(yīng)該是在頁(yè)面寫死,而是通過聚合索引庫(kù)中的酒店數(shù)據(jù)得來的

Spring Boot 整合 分布式搜索引擎 Elastic Search 實(shí)現(xiàn) 數(shù)據(jù)聚合,從零到一 搞定 ElasticSearch,spring boot,分布式,搜索引擎,elasticsearch,微服務(wù),原力計(jì)劃

需求分析:

目前,頁(yè)面的城市列表、星級(jí)列表、品牌列表都是寫死的,并不會(huì)隨著搜索結(jié)果的變化而變化。但是用戶搜索條件改變時(shí),搜索結(jié)果會(huì)跟著變化。

例如:用戶搜索“天安門”,那搜索的酒店肯定是在虹橋附近,因此,城市只能是上海,此時(shí)城市列表中就不應(yīng)該顯示其他城市信息了。

也就是說,搜索結(jié)果中包含哪些城市,頁(yè)面就應(yīng)該列出哪些城市;搜索結(jié)果中包含哪些品牌,頁(yè)面就應(yīng)該列出哪些品牌。

如何得知搜索結(jié)果中包含哪些品牌?如何得知搜索結(jié)果中包含哪些城市?

使用聚合功能,利用Bucket聚合,對(duì)搜索結(jié)果中的文檔基于品牌分組、基于城市分組,就能得知包含哪些品牌、哪些城市了。

因?yàn)槭菍?duì)搜索結(jié)果聚合,因此聚合是限定范圍的聚合,也就是說聚合的限定條件跟搜索文檔的條件一致。

查看瀏覽器可以發(fā)現(xiàn),前端其實(shí)已經(jīng)發(fā)出了這樣的一個(gè)請(qǐng)求:

Spring Boot 整合 分布式搜索引擎 Elastic Search 實(shí)現(xiàn) 數(shù)據(jù)聚合,從零到一 搞定 ElasticSearch,spring boot,分布式,搜索引擎,elasticsearch,微服務(wù),原力計(jì)劃

因此,返回的類型應(yīng)該是以下

Spring Boot 整合 分布式搜索引擎 Elastic Search 實(shí)現(xiàn) 數(shù)據(jù)聚合,從零到一 搞定 ElasticSearch,spring boot,分布式,搜索引擎,elasticsearch,微服務(wù),原力計(jì)劃

結(jié)果是一個(gè)Map結(jié)構(gòu):

  • key是字符串,城市、星級(jí)、品牌、價(jià)格
  • value是集合,例如多個(gè)城市的名稱

?業(yè)務(wù)代碼實(shí)現(xiàn)

HotelController中添加一個(gè)方法,遵循下面的要求:

  • 請(qǐng)求方式:POST
  • 請(qǐng)求路徑:/hotel/filters
  • 請(qǐng)求參數(shù):RequestParams,與搜索文檔的參數(shù)一致
  • 返回值類型:Map<String, List<String>>

代碼:

    @PostMapping("filters")
    public Map<String, List<String>> getFilters(@RequestBody RequestParams params){
        return hotelService.getFilters(params);
    }

這里調(diào)用了IHotelService中的getFilters方法,尚未實(shí)現(xiàn)。

IHotelService中定義新方法:

Map<String, List<String>> filters(RequestParams params);

HotelService中實(shí)現(xiàn)該方法:

@Override
public Map<String, List<String>> filters(RequestParams params) {
    try {
        // 1.準(zhǔn)備Request
        SearchRequest request = new SearchRequest("hotel");
        // 2.準(zhǔn)備DSL
        // 2.1.query
        buildBasicQuery(params, request);
        // 2.2.設(shè)置size
        request.source().size(0);
        // 2.3.聚合
        buildAggregation(request);
        // 3.發(fā)出請(qǐng)求
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);
        // 4.解析結(jié)果
        Map<String, List<String>> result = new HashMap<>();
        Aggregations aggregations = response.getAggregations();
        // 4.1.根據(jù)品牌名稱,獲取品牌結(jié)果
        List<String> brandList = getAggByName(aggregations, "brandAgg");
        result.put("品牌", brandList);
        // 4.2.根據(jù)品牌名稱,獲取品牌結(jié)果
        List<String> cityList = getAggByName(aggregations, "cityAgg");
        result.put("城市", cityList);
        // 4.3.根據(jù)品牌名稱,獲取品牌結(jié)果
        List<String> starList = getAggByName(aggregations, "starAgg");
        result.put("星級(jí)", starList);

        return result;
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

private void buildAggregation(SearchRequest request) {
    request.source().aggregation(AggregationBuilders
                                 .terms("brandAgg")
                                 .field("brand")
                                 .size(100)
                                );
    request.source().aggregation(AggregationBuilders
                                 .terms("cityAgg")
                                 .field("city")
                                 .size(100)
                                );
    request.source().aggregation(AggregationBuilders
                                 .terms("starAgg")
                                 .field("starName")
                                 .size(100)
                                );
}

private List<String> getAggByName(Aggregations aggregations, String aggName) {
    // 4.1.根據(jù)聚合名稱獲取聚合結(jié)果
    Terms brandTerms = aggregations.get(aggName);
    // 4.2.獲取buckets
    List<? extends Terms.Bucket> buckets = brandTerms.getBuckets();
    // 4.3.遍歷
    List<String> brandList = new ArrayList<>();
    for (Terms.Bucket bucket : buckets) {
        // 4.4.獲取key
        String key = bucket.getKeyAsString();
        brandList.add(key);
    }
    return brandList;
}

?效果圖

Spring Boot 整合 分布式搜索引擎 Elastic Search 實(shí)現(xiàn) 數(shù)據(jù)聚合,從零到一 搞定 ElasticSearch,spring boot,分布式,搜索引擎,elasticsearch,微服務(wù),原力計(jì)劃

?小結(jié)

以上就是【Bug 終結(jié)者】對(duì) Spring Boot 整合 分布式搜索引擎 Elastic Search 實(shí)現(xiàn) 搜索、分頁(yè)與結(jié)果過濾 的簡(jiǎn)單介紹,ES搜索引擎無疑是最優(yōu)秀的分布式搜索引擎,使用它,可大大提高項(xiàng)目的靈活、高效性! 技術(shù)改變世界?。?!

如果這篇【文章】有幫助到你,希望可以給【Bug 終結(jié)者】點(diǎn)個(gè)贊??,創(chuàng)作不易,如果有對(duì)【后端技術(shù)】、【前端領(lǐng)域】感興趣的小可愛,也歡迎關(guān)注?????? 【Bug 終結(jié)者】??????,我將會(huì)給你帶來巨大的【收獲與驚喜】??????!文章來源地址http://www.zghlxwxcb.cn/news/detail-677515.html

到了這里,關(guān)于Spring Boot 整合 分布式搜索引擎 Elastic Search 實(shí)現(xiàn) 數(shù)據(jù)聚合的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Spring Cloud學(xué)習(xí)(十一)【深入Elasticsearch 分布式搜索引擎03】

    Spring Cloud學(xué)習(xí)(十一)【深入Elasticsearch 分布式搜索引擎03】

    聚合(aggregations)可以實(shí)現(xiàn)對(duì)文檔數(shù)據(jù)的統(tǒng)計(jì)、分析、運(yùn)算。聚合常見的有三類: 桶(Bucket)聚合:用來對(duì)文檔做分組 TermAggregation:按照文檔字段值分組 Date Histogram:按照日期階梯分組,例如一周為一組,或者一月為一組 度量(Metric)聚合:用以計(jì)算一些值,比如:最大值

    2024年01月23日
    瀏覽(63)
  • Spring Boot與Redisson的整合。分布式鎖

    Spring Boot與Redisson的整合可以幫助您在Spring Boot應(yīng)用程序中使用分布式鎖、緩存等功能。下面是一些基本步驟來整合Spring Boot與Redisson: 添加Maven/Gradle依賴: 在您的Spring Boot項(xiàng)目的 pom.xml (Maven)或 build.gradle (Gradle)文件中添加Redisson的依賴。 Maven依賴示例: Gradle依賴示例:

    2024年02月12日
    瀏覽(21)
  • 分布式搜索引擎——elasticsearch搜索功能

    分布式搜索引擎——elasticsearch搜索功能

    Elasticsearch提供了基于JSON的DSL (Domain Specific Language)來定義查詢。常見的查詢類型包括: 查詢所有:查詢出所有數(shù)據(jù),一般測(cè)試用。例如:match_all 全文檢索(full text)查詢:利用分詞器對(duì)用戶輸入內(nèi)容分詞,然后去倒排索引庫(kù)中匹配。例如: match_query multi_match_query 精確查詢:根據(jù)精確詞條

    2024年02月05日
    瀏覽(35)
  • 分布式搜索引擎ElasticSearch——搜索功能

    分布式搜索引擎ElasticSearch——搜索功能

    DSL查詢分類 DSL官方文檔 全文檢索查詢 精確查詢 地理查詢 復(fù)合查詢 Function Score Query function score query Boolean Query 排序 分頁(yè) 官方文檔 高亮 快速入門 match,term,range,bool查詢 排序和分頁(yè) 高亮顯示 就是在前面抽取的解析代碼中進(jìn)一步添加關(guān)于高亮的解析部分,因?yàn)閔ighlight和so

    2024年02月01日
    瀏覽(28)
  • 分布式搜索引擎

    分布式搜索引擎

    elasticsearch的查詢依然是基于JSON風(fēng)格的DSL來實(shí)現(xiàn)的。 Elasticsearch提供了基于JSON的DSL(Domain Specific Language)來定義查詢。常見的查詢類型包括: 查詢所有 :查詢出所有數(shù)據(jù),一般測(cè)試用。例如:match_all 全文檢索(full text)查詢 :利用分詞器對(duì)用戶輸入內(nèi)容分詞,然后去倒排索

    2024年02月10日
    瀏覽(25)
  • 【分布式搜索引擎03】

    【分布式搜索引擎03】

    **聚合(aggregations)**可以讓我們極其方便的實(shí)現(xiàn)對(duì)數(shù)據(jù)的統(tǒng)計(jì)、分析、運(yùn)算。例如: 什么品牌的手機(jī)最受歡迎? 這些手機(jī)的平均價(jià)格、最高價(jià)格、最低價(jià)格? 這些手機(jī)每月的銷售情況如何? 實(shí)現(xiàn)這些統(tǒng)計(jì)功能的比數(shù)據(jù)庫(kù)的sql要方便的多,而且查詢速度非???,可以實(shí)現(xiàn)近

    2024年02月05日
    瀏覽(39)
  • 分布式搜索引擎--認(rèn)識(shí)

    分布式搜索引擎--認(rèn)識(shí)

    elasticsearch的作用 elasticsearch是一款非常強(qiáng)大的開源搜索引擎,具備非常多強(qiáng)大功能,可以幫助我們從海量數(shù)據(jù)中快速找到需要的內(nèi)容 。 elasticsearch結(jié)合kibana、Logstash、Beats,也就是elastic stack(ELK)。被廣泛應(yīng)用在日志數(shù)據(jù)分析、實(shí)時(shí)監(jiān)控等領(lǐng)域。 而elasticsearch是elastic stack的核

    2024年01月18日
    瀏覽(24)
  • 【分布式搜索引擎02】

    elasticsearch的查詢依然是基于JSON風(fēng)格的DSL來實(shí)現(xiàn)的。 Elasticsearch提供了基于JSON的DSL(Domain Specific Language)來定義查詢。常見的查詢類型包括: 查詢所有 :查詢出所有數(shù)據(jù),一般測(cè)試用。例如:match_all 全文檢索(full text)查詢 :利用分詞器對(duì)用戶輸入內(nèi)容分詞,然后去倒排索

    2024年02月01日
    瀏覽(41)
  • 分布式搜索引擎----elasticsearch

    分布式搜索引擎----elasticsearch

    目錄 1、初識(shí)elasticsearch 1.1、什么是elasticsearch 1.2.ELK技術(shù)棧 2、正向索引和倒排索引 2.1、正向索引 2.2、倒排索引 2.3、正向索引和倒排索引的區(qū)別 3、elasticsearch中的概念理解 3.1、文檔和字段 3.2、索引和映射 3.3、mysql與elasticsearch ????????elasticsearch是一款非常強(qiáng)大的開源搜索

    2024年02月11日
    瀏覽(58)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包