動態

詳情 返回 返回

【Spring開發】SpringCloud服務端高級框架第10篇:分佈式搜索引擎01,0.學習目標【附代碼文檔】 - 動態 詳情

🏆🏆🏆教程全知識點簡介:微服務保護、服務異步通信、消息中間件部署、分佈式事務、搜索引擎、緩存、數據同步以及相關組件的安裝配置等技術要點。在微服務保護方面,介紹了 Sentinel 的基礎知識,包括雪崩問題、超時處理、艙壁模式、斷路器機制,以及不同服務保護技術的對比;講解了流量控制(簇點鏈路、流控模式、熱點參數限流)、隔離與降級(FeignClient 整合 Sentinel、線程隔離)、授權規則(自定義異常結果)及規則持久化(規則管理模式與 pull 模式),並演示了基於 Nacos 的規則持久化改造。服務異步通信部分探討了消息可靠性(生產者消息確認、Return 回調、ConfirmCallback)、死信交換機、TTL 隊列等高級應用。RabbitMQ 部署指南涵蓋了單機部署、DelayExchange 插件安裝、集羣部署、鏡像模式等內容。分佈式事務部分介紹了 CAP 定理、BASE 理論、常見解決方案,Seata 的基礎與部署(TC 服務部署、Nacos 配置、數據庫表創建)、多種事務模式(XA 模式及優缺點、四種模式對比)和高可用架構。分佈式搜索引擎章節講解了 Elasticsearch 的原理(ELK 技術棧、倒排索引)、索引庫與文檔操作、RestAPI 與 RestClient 的使用、排序與高亮、酒店搜索案例(分頁、競價排名、ad標記、算分函數)、自動補全、數據同步(同步調用、監聽 binlog)、集羣搭建與腦裂問題、分片存儲測試,以及單點 ES、Kibana、IK 分詞器安裝。緩存部分介紹了 Redis 持久化(RDB 與 AOF 對比)、單機安裝 Redis、Redis 集羣、多級緩存(JVM 進程緩存、Caffeine)、請求參數處理、Tomcat 查詢、HTTP 工具與 CJSON 工具類、Redis 緩存查詢。數據同步與網關部分包括 Canal 安裝(開啓 MySQL 主從、設置權限)、OpenResty 安裝(開發庫、目錄結構、環境變量配置)及運行流程。

<!-- start:bj1 -->

📚📚👉👉👉本站這篇博客:   https://segmentfault.com/a/1190000047235729    中查看

📚📚👉👉👉本站這篇博客:   https://segmentfault.com/a/1190000047225271    中查看

<!-- end:bj1 -->

✨ 本教程項目亮點

🧠 知識體系完整:覆蓋從基礎原理、核心方法到高階應用的全流程內容
💻 全技術鏈覆蓋:完整前後端技術棧,涵蓋開發必備技能
🚀 從零到實戰:適合 0 基礎入門到提升,循序漸進掌握核心能力
📚 豐富文檔與代碼示例:涵蓋多種場景,可運行、可複用
🛠 工作與學習雙參考:不僅適合系統化學習,更可作為日常開發中的查閲手冊
🧩 模塊化知識結構:按知識點分章節,便於快速定位和複習
📈 長期可用的技術積累:不止一次學習,而是能伴隨工作與項目長期參考

🎯🎯🎯全教程總章節


🚀🚀🚀本篇主要內容

分佈式搜索引擎01

-- elasticsearch基礎

0.學習目標

1.初識elasticsearch

1.1.瞭解ES

1.1.1.elasticsearch的作用

elasticsearch是一款非常強大的開源搜索引擎,具備非常多強大功能,可以幫助 從海量數據中快速找到需要的內容

例如:

  • 在GitHub搜索代碼

  • 在電商網站搜索產品

  • 在百度搜索答案

  • 在打車軟件搜索附近的車

1.1.2.ELK技術棧

elasticsearch結合kibana、Logstash、Beats,也就是elastic stack(ELK)。被廣泛應用在日誌數據分析、實時監控等領域:

而elasticsearch是elastic stack的核心,負責存儲、搜索、分析數據。

1.1.3.elasticsearch和lucene

elasticsearch底層是基於lucene來實現的。

Lucene是一個Java語言的搜索引擎類庫,是Apache公司的頂級項目,由DougCutting於1999年研發。官網地址:https://lucene.apache.org/

elasticsearch的發展歷史:

  • 2004年Shay Banon基於Lucene開發了Compass
  • 2010年Shay Banon 重寫了Compass,取名為Elasticsearch。

1.1.4.為什麼不是其他搜索技術?

目前比較知名的搜索引擎技術排名:

雖然在早期,Apache Solr是最主要的搜索引擎技術,但隨着發展elasticsearch已經漸漸超越了Solr,獨佔鰲頭:

1.1.5.總結

什麼是elasticsearch?

  • 一個開源的分佈式搜索引擎,可以用來實現搜索、日誌統計、分析、系統監控等功能

什麼是elastic stack(ELK)?

  • 是以elasticsearch為核心的技術棧,包括beats、Logstash、kibana、elasticsearch

什麼是Lucene?

  • 是Apache的開源搜索引擎類庫,提供了搜索引擎的核心API

1.2.倒排索引

MyBatis 配置

倒排索引的概念是基於MySQL這樣的正向索引而言的。

1.2.1.正向索引

Spring Integration 文檔

那麼什麼是正向索引呢?例如給下表(tb_goods)中的id創建索引:

如果是根據id查詢,那麼直接走索引,查詢速度非常快。

但如果是基於title做模糊查詢,只能是逐行掃描數據,流程如下:

1)用户搜索數據,條件是title符合"%手機%"

2)逐行獲取數據,比如id為1的數據

3)判斷數據中的title是否符合用户搜索條件

4)如果符合則放入結果集,不符合則丟棄。回到步驟1

JSON-B API

逐行掃描,也就是全表掃描,隨着數據量增加,其查詢效率也會越來越低。當數據量達到數百萬時,就是一場災難。

1.2.2.倒排索引

倒排索引中有兩個非常重要的概念:

  • 文檔(Document):用來搜索的數據,其中的每一條數據就是一個文檔。例如一個網頁、一個產品信息
  • 詞條(Term):對文檔數據或用户搜索數據,利用某種算法分詞,得到的具備含義的詞語就是詞條。例如:我是中國人,就可以分為:我、是、中國人、中國、國人這樣的幾個詞條

創建倒排索引是對正向索引的一種特殊處理,流程如下:

  • 將每一個文檔的數據利用算法分詞,得到一個個詞條
  • 創建表,每行數據包括詞條、詞條所在文檔id、位置等信息
  • 因為詞條唯一性,可以給詞條創建索引,例如hash表結構索引

如圖:

Bouncy Castle 文檔

倒排索引的搜索流程如下(以搜索"華為手機"為例):

1)用户輸入條件"華為手機"進行搜索。

2)對用户輸入內容分詞,得到詞條:華為手機

3)拿着詞條在倒排索引中查找,可以得到包含詞條的文檔id:1、2、3。

4)拿着文檔id到正向索引中查找具體文檔。

如圖:

雖然要先查詢倒排索引,再查詢倒排索引,但是無論是詞條、還是文檔id都建立了索引,查詢速度非常快!無需全表掃描。

1.2.3.正向和倒排

那麼為什麼一個叫做正向索引,一個叫做倒排索引呢?

  • 正向索引是最傳統的,根據id索引的方式。但根據詞條查詢時,必須先逐條獲取每個文檔,然後判斷文檔中是否包含所需要的詞條,是根據文檔找詞條的過程
  • 倒排索引則相反,是先找到用户要搜索的詞條,根據詞條得到保護詞條的文檔的id,然後根據id獲取文檔。是根據詞條找文檔的過程

是不是恰好反過來了?

那麼兩者方式的優缺點是什麼呢?

正向索引

  • 優點:

    • 可以給多個字段創建索引
    • 根據索引字段搜索、排序速度

2.索引庫操作

索引庫就類似數據庫表,mapping映射就類似表的結構。

要向es中存儲數據,必須先創建“庫”和“表”。

2.1.mapping映射屬性

mapping是對索引庫中文檔的約束,常見的mapping屬性包括:

  • type:字段數據類型,常見的簡單類型有:

    • 字符串:text(可分詞的文本)、keyword(精確值,例如:品牌、國家、ip地址)
    • 數值:long、integer、short、byte、double、float、
    • 布爾:boolean
    • 日期:date
    • 對象:object
  • index:是否創建索引,默認為true
  • analyzer:使用哪種分詞器
  • properties:該字段的子字段

ModelMapper 文檔

例如下面的json文檔:

{
    "age": 21,
    "weight": 52.1,
    "isMarried": false,
    "info": "黑馬程序員Java講師",
    "email": "zy@itcast.cn",
    "score": [99.1, 99.5, 98.9],
    "name": {
        "firstName": "雲",
        "lastName": "趙"
    }
}

對應的每個字段映射(mapping):

  • age:類型為 integer;參與搜索,因此需要index為true;無需分詞器
  • weight:類型為float;參與搜索,因此需要index為true;無需分詞器
  • isMarried:類型為boolean;參與搜索,因此需要index為true;無需分詞器
  • info:類型為字符串,需要分詞,因此是text;參與搜索,因此需要index為true;分詞器可以用ik_smart
  • email:類型為字符串,但是不需要分詞,因此是keyword;不參與搜索,因此需要index為false;無需分詞器
  • score:雖然是數組,但是 只看元素的類型,類型為float;參與搜索,因此需要index為true;無需分詞器
  • name:類型為object,需要定義多個子屬性

    • name.firstName;類型為字符串,但是不需要分詞,因此是keyword;參與搜索,因此需要index為true;無需分詞器
    • name.lastName;類型為字符串,但是不需要分詞,因此是keyword;參與搜索,因此需要index為true;無需分詞器

2.2.索引庫的CRUD

這裏 統一使用Kibana編寫DSL的方式來演示。

2.2.1.創建索引庫和映射

基本語法:
  • 請求方式:PUT
  • 請求路徑:/索引庫名,可以自定義
  • 請求參數:mapping映射

格式:

PUT /索引庫名稱
{
  "mappings": {
    "properties": {
      "字段名":{
        "type": "text",
        "analyzer": "ik_smart"
      },
      "字段名2":{
        "type": "keyword",
        "index": "false"
      },
      "字段名3":{
        "properties": {
          "子字段": {
            "type": "keyword"
          }
        }
      },
      // ...略
    }
  }
}
示例:
PUT /heima
{
  "mappings": {
    "properties": {
      "info":{
        "type": "text",
        "analyzer": "ik_smart"
      },
      "email":{
        "type": "keyword",
        "index": "falsae"
      },
      "name":{
        "properties": {
          "firstName": {
            "type": "keyword"
          }
        }
      },
      // ... 略
    }
  }
}

Swagger/OpenAPI

2.2.2.查詢索引庫

基本語法

  • 請求方式:GET
  • 請求路徑:/索引庫名
  • 請求參數:無

Spring Boot API 文檔

格式

GET /索引庫名

示例

2.2.3.修改索引庫

倒排索引結構雖然不復雜,但是一旦數據結構改變(比如改變了分詞器),就需要重新創建倒排索引,這簡直是災難。因此索引庫一旦創建,無法修改mapping

雖然無法修改mapping中已有的字段,但是卻允許添加新的字段到mapping中,因為不會對倒排索引產生影響。

語法説明

PUT /索引庫名/_mapping
{
  "properties": {
    "新字段名":{
      "type": "integer"
    }
  }
}

示例

Thymeleaf 文檔

2.2.4.刪除索引庫

語法:

  • 請求方式:DELETE
  • 請求路徑:/索引庫名
  • 請求參數:無

Spring Cloud Gateway 文檔

格式:

DELETE /索引庫名

在kibana中測試:

2.2.5.總結

索引庫操作有哪些?

  • 創建索引庫:PUT /索引庫名
  • 查詢索引庫:GET /索引庫名
  • 刪除索引庫:DELETE /索引庫名
  • 添加字段:PUT /索引庫名/_mapping

🚀✨ (未完待續)項目系列下一章

📚下一篇 將進入更精彩的環節!
🔔 記得收藏 & 關注,第一時間獲取更新!
🍅 一起見證整個系列逐步成型的全過程。

Add a new 評論

Some HTML is okay.