【Elasticsearch】es初識,在項目架構中的用途,與mysql和kafka的配合使用,

ES是一個開源的高擴展的分布式全文檢索引擎

在項目已有mysql增刪改查的情況下,新增kafka,es流程

用戶新增/修改商家(寫MySQL)
↓
Kafka 生產者發送商家數據消息
↓
Kafka 消費者監聽消息 → 寫入 Elasticsearch
↓
前端搜索商家時 → 查詢 Elasticsearch(不是 MySQL)

這個 Kafka + Elasticsearch 的寫入同步 + 搜索解耦架構 是目前絕大多數中大型互聯網企業的標準做法


一、為什么不能只查 MySQL而引入es查詢?

傳統做法的問題:

比如你在前端搜索商家名稱“李大壯”,如果查的是 MySQL:

SELECT * FROM merchant WHERE name LIKE '%李大壯%' OR description LIKE '%李大壯%' LIMIT 10;

問題:

  • :LIKE + 多字段模糊查詢在數據量大時性能非常差;
  • 不智能:MySQL 的模糊匹配不支持分詞、不支持排序打分;
  • 不靈活:無法實現“相關度排序”“拼音搜索”“短語匹配”等搜索場景。

所以,企業通常引入 Elasticsearch(簡稱 ES)來替代 MySQL 作為 搜索引擎


二、為什么 MySQL 改動不直接同步到 Elasticsearch,而是先發 Kafka?

這是你最關鍵的問題:為什么加一層 Kafka?

原因一:解耦系統,避免寫 ES 出錯影響主業務

  • 如果你直接在寫 MySQL 后同時寫 ES,那么:

    • 如果 ES 掛了、網絡抖動、接口異常等,會導致整個商家創建流程失敗;
    • Kafka 相當于消息緩沖器 + 解耦層,即便 ES 掛了,Kafka 消息還能繼續收集,等恢復后繼續消費。

原因二:可支持異步、并發、大吞吐處理

  • Kafka 是高吞吐分布式系統,支持水平擴展(通過分區);
  • 消費者可以并行處理,批量寫入 ES,系統更加穩定、可擴展。

原因三:可拓展更多下游系統,不只是 Elasticsearch

未來你可能還需要這些:

  • 同步商家數據到 Redis 緩存(做秒級展示);
  • 觸發推送服務(比如新商家上線通知);
  • 同步用戶畫像系統、數據倉庫。

如果有 Kafka,你只需要新增一個消費者;
如果沒有 Kafka,你要改源代碼、邏輯復雜,非常不利于維護。


三、流程總結:企業為什么這樣做?

階段系統作用
1MySQL業務主庫,負責存儲真實、結構化的數據
2Kafka消息中間件,做異步解耦、緩沖和流式處理
3Elasticsearch專用于搜索,支持全文檢索、相關度評分等搜索功能
4前端直接查 ES,提升搜索速度、支持搜索功能增強

四、圖示結構(簡化):

      用戶操作前端↓后端寫 MySQL(商家表)↓┌────→ Kafka ←────┐│                 │Kafka Consumer     │(可以多個系統消費)↓                 ↓
ElasticSearch     Redis/OLAP等其他系統↓
前端搜索

es查詢使用案例

query := map[string]interface{}{// DSL 查詢主體"query": map[string]interface{}{"bool": map[string]interface{}{ // bool 組合查詢(企業中常用)"must": []interface{}{ // must 表示“必須匹配”的條件,全部滿足才返回map[string]interface{}{"multi_match": map[string]interface{}{ // 多字段模糊匹配"query":  in.Keyword, // 用戶輸入的搜索關鍵詞(如“口腔”)"fields": []string{"name", "business", "address"},"type":   "most_fields", // type: most_fields → 各字段各自打分后相加,適合字段內容差異大;另一個選項 cross_fields 更適合字段語義接近。},},},"filter": filters, // 精準過濾器(如按省市區篩選,不能容忍模糊匹配)"should": []interface{}{ // 加分項,提升命中相關性map[string]interface{}{"match_phrase": map[string]interface{}{ "name": in.Keyword, // 要求關鍵詞“完整連續地”出現在 name 中才能加分(如“牙科診所”)},},map[string]interface{}{"match_phrase": map[string]interface{}{"business": in.Keyword, // business 完整短語匹配},},},// 注:should 不設置 minimum_should_match 時,不滿足不會過濾掉,只是不加分},},// 分頁設置"from": (in.Page - 1) * in.PerPage, // 從第幾條開始取數據(起始位置)"size": in.PerPage,                // 每頁返回多少條// 排序設置"sort": []interface{}{map[string]interface{}{"order_score": "desc", // 業務字段排序:order_score 是你在 merchant 映射里定義的字段,值越大代表權重越高。// 通常用于控制:優質商家排前面(如人工打分、運營配置)},},
}// -----------------
// 構造查詢DSL// DSL:Domain-Specific Language(領域特定語言)// 這里表示一段用于構建或解析 Elasticsearch 查詢語句的邏輯query := map[string]interface{}{"query": map[string]interface{}{"bool": map[string]interface{}{"must": []interface{}{map[string]interface{}{"multi_match": map[string]interface{}{ // multi_match 該字段使得查詢支持不同類型的匹配模式// type 參數控制多字段匹配的方式,主要有兩種:"query":  in.Keyword,"fields": []string{"name", "business", "address"},"type":   "most_fields", // 1.most_fields:把多個字段匹配結果 分開 算分,最后相加// 2.cross_fields:把多個字段 和在一起 匹配(適合同一個詞,可能出現在name和business這種的情況)// 分數(score):Elasticsearch內部計算的相關度分值,用于衡量文檔與查詢的匹配程度,// 數值越大說明匹配越好,搜索結果排序默認會根據這個分數降序排列。},},},"filter": filters,// 其中should字段,主要作用是在滿足上述條件下,增加相關度,縮小搜索范圍。"should": []interface{}{ // should:表示“或”關系,滿足should中條件的文檔會被加分,提高其相關度排序,// 但文檔不一定非要滿足should中的條件才能匹配整個查詢(除非設置minimum_should_match)。// 下面2map的效果:如果傳入的name和business是能完全匹配的,則會獲得更高的相關度評分。map[string]interface{}{"match_phrase": map[string]interface{}{ // match_phrase 是短語匹配,要求查詢詞,是順序的不拆分的,否則匹配失敗。"name": in.Keyword,},},map[string]interface{}{"match_phrase": map[string]interface{}{"business": in.Keyword,},},},},},"from": (in.Page - 1) * in.PerPage,"size": in.PerPage,"sort": []interface{}{ // 按照評分排序map[string]interface{}{"order_score": "desc"}, // 降序},}

https://github.com/0voice

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/88506.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/88506.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/88506.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【DataWhale組隊學習】AI辦公實踐與應用-數據分析

AI辦公:數據分析 1. 使用大模型進行數據分析的常見流程 把數據扔給AI讓AI自動分析,并告訴你結果 下面我們對上面兩個步驟進行詳細說明 2. 使用大模型進行數據分析 2.1 將數據扔給大模型 2.1.1 選擇合適的辦公大模型 要使用大模型進行數據分析時&a…

5G 浪潮:發展全景、困境突圍與未來航向

在當今數字化浪潮中,5G 技術宛如一顆璀璨的明星,照亮了各個行業前行的道路。自 5G 正式商用以來,它不僅深刻改變了人們的生活方式,更在工業、農業、交通等領域掀起了一場數字化轉型的革命。本文將深入探討 5G 技術的原理、發展現狀…

理論加案例,一文讀懂數據分析中的分類建模

一、什么是分類 分類,是數據建模領域的重要分支,你每天也都會接觸。 手機垃圾短信過濾,就是分類算法給短信打的標簽,比如0代表正常短信,1代表垃圾短信。 在醫學領域,根據影像檢查判斷腫瘤是良性還是惡性。…

數組題解——二分查找【LeetCode】

704. 二分查找 算法邏輯分析 初始化邊界 left 設為0&#xff0c;right 設為len(nums)&#xff0c;表示左閉右開區間 [left, right)。這意味著搜索區間包含下標left&#xff0c;但不包含下標right。 循環條件 while left < right:&#xff0c;只要left小于right&#xff0c…

Function AI 工作流發布:以 AI 重塑企業流程自動化

作者&#xff1a;寒斜 在 AI 技術飛速發展的今天&#xff0c;企業的流程自動化方式也正在發生深刻變革。過去&#xff0c;流程自動化往往依賴于人工配置和固定規則&#xff0c;難以適應復雜、多變的業務場景。而如今&#xff0c;隨著 LLM&#xff0c;Agent&#xff0c;MCP 等節…

【單元測試】單元測試的定義和作用

介紹 ?單元測試不僅是對函數進行測試&#xff0c;還包括對類、組件等最小可測試單元的測試?。單元測試是對軟件中的最小可測試單元進行驗證的過程&#xff0c;這些單元可以是函數、方法、類或組件等。單元測試的主要目的是確保這些最小單元在隔離的環境中能夠正確地實現其功…

AI 輔助生成 Mermaid 流程圖

文章目錄 背景Mermaid使用 AI 編寫 Mermaid應用 背景 在 markdown 文檔中雖然可以插入圖片&#xff0c;但是也需要管理圖片&#xff0c;一旦圖片位置變了&#xff0c;文檔中的圖片就無法顯示。圖片占用空間較大&#xff0c;對于在線文檔&#xff0c;為了加載速度&#xff0c;能…

定位坐標系深度研究報告

一、引言 定位坐標系是用于描述地理位置的數學工具&#xff0c;其發展與人類對地球形狀的認知和技術需求密切相關。早期的定位依賴于天文觀測&#xff08;如經緯度&#xff09;&#xff0c;現代則結合衛星技術&#xff08;如GPS&#xff09;和數學投影方法&#xff08;如墨卡托…

數字孿生技術引領UI前端設計潮流:沉浸式體驗的新篇章

hello寶子們...我們是艾斯視覺擅長ui設計、前端開發、數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩! 當虛擬世界與物理現實的邊界逐漸模糊&#xff0c;數字孿生技術正以燎原之勢重構 UI 前端設計的…

VR油庫虛擬仿真系統:開啟智慧油庫新時代

在科技快速發展的當下&#xff0c;VR 技術在多行業廣泛應用&#xff0c;以沉浸式等特點重塑行業模式。油庫作為石油儲存與轉運關鍵樞紐&#xff0c;傳統運營管理依賴人工經驗和常規設備&#xff0c;存在安全風險高、培訓成本大等問題。在此背景下&#xff0c;油庫引入 VR 虛擬仿…

Oracle獲取前100條記錄

在Oracle數據庫中&#xff0c;獲取前100條記錄可以通過多種方式實現&#xff0c;最常見的方法是使用ROWNUM或者在較新版本的Oracle中使用FETCH FIRST子句。以下是幾種常見的方法&#xff1a; 方法1&#xff1a;使用ROWNUM ROWNUM是Oracle特有的一個偽列&#xff0c;用于為結果…

【開源庫 | libpng】使用 libpng 讀寫 png 文件詳細教程(附帶源碼)

&#x1f601;博客主頁&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客內容&#x1f911;&#xff1a;&#x1f36d;嵌入式開發、Linux、C語言、C、數據結構、音視頻&#x1f36d; &#x1f923;本文內容&#x1f923;&a…

Nuttx之nxsched_add_readytorun(non-SMP)

聲明&#xff1a;此處代碼分析&#xff0c;來源與 nuttx 12.8.0版本。 在分析之前&#xff0c;需要一圖鎮樓。 /***************************************************************************** Name: nxsched_add_readytorun** Description:* This function adds a TCB …

Nuttx之nxsched_add_blocked

聲明&#xff1a;此處代碼分析&#xff0c;來源與 nuttx 12.8.0版本。 在分析之前&#xff0c;需要一圖鎮樓。 /***************************************************************************** Name: nxsched_add_blocked** Description:* This function adds a TCB to o…

python 包含虛擬環境venv項目的移動

python 包含虛擬環境venv項目的移動 在ubuntu環境下&#xff0c;移動一個包含venv虛擬環境的項目后&#xff0c;在執行時會報錯: 錯誤1&#xff1a; Traceback (most recent call last):File "app.py", line 2, in <module>from flask import Flask, request…

WPF中實現TreeView的SelectedItem雙向綁定到ViewModel

WPF中實現TreeView的SelectedItem雙向綁定到ViewModel WPF中實現TreeView的SelectedItem雙向綁定到ViewModel問題背景解決方案一&#xff1a;附加行為&#xff08;推薦&#xff09;實現步驟優點 解決方案二&#xff1a;通過IsSelected屬性綁定實現步驟注意事項 兩種方案對比補充…

類型轉換運算符重載

C 類型轉換函數詳解 類型轉換函數是C中用于實現類類型與其他類型之間相互轉換的特殊成員函數&#xff0c;分為兩種主要形式&#xff1a;轉換構造函數和類型轉換運算符。 1. 轉換構造函數 (Conversion Constructor) 基本概念 轉換構造函數是一種特殊的構造函數&#xff0c;它…

ES10(ES2019)新特性整理

一、Array.prototype.flat() 和 flatMap()&#xff08;數組扁平化&#xff09; &#xff08;1&#xff09;flat(depth) 將嵌套數組“拉平”到指定深度&#xff08;默認 depth1&#xff09;。 const arr [1, [2, [3]]]; arr.flat(); // [1, 2, [3]]&#xff08;默認深度 …

基于 LCD1602 的超聲波測距儀設計與實現:從原理到應用

具體材料可在主頁資源里下載 超聲波測距技術作為非接觸式測量的重要手段&#xff0c;在工業檢測、智能家居、機器人避障等領域有著廣泛應用。本文將詳細介紹一款基于 STC89C51 單片機與 LCD1602 顯示屏的超聲波測距系統&#xff0c;從硬件架構到軟件實現&#xff0c;完整呈現一…

2.5G/5G/10G自協商An

IEEE 802.3 協議中&#xff0c;**2.5GBASE-T、5GBASE-T 和 10GBASE-T** 的鏈路自協商&#xff08;auto-negotiation&#xff0c;簡稱 AN&#xff09;是在物理層&#xff08;PHY&#xff09;完成的。它的作用是&#xff1a; * **讓連接雙方&#xff08;主機和對端&#xff09;自…