【實戰 ES】實戰 Elasticsearch:快速上手與深度實踐-1.2.2倒排索引原理與分詞器(Analyzer)

👉 點擊關注不迷路
👉 點擊關注不迷路
👉 點擊關注不迷路


文章大綱

  • 1.2.2倒排索引原理與分詞器(`Analyzer`)
    • 1. `倒排索引:搜索引擎的基石`
      • 1.1 正排索引 vs 倒排索引
        • 示例數據對比:
      • 1.2 倒排索引核心結構
        • 壓縮效果對比(`1億文檔場景`):
      • 1.3 性能優化策略
    • 2. 分詞器(`Analyzer`)工作機制
      • 2.1 分詞器三層處理流程
      • 2.2 內置分詞器對比
        • 分詞性能測試(處理10萬條商品標題):
      • 2.3 中文分詞深度解決方案
    • 3. 聯合應用實戰案例
      • 3.1 電商搜索優化
      • 3.2 日志多語言處理
      • 3.3 敏感詞過濾系統
    • 4. 性能對比與最佳實踐
      • 4.1 `倒排索引配置建議`
      • 4.2 分詞器選擇指南
      • 4.3 聯合優化最佳實踐

1.2.2倒排索引原理與分詞器(Analyzer


1. 倒排索引:搜索引擎的基石

1.1 正排索引 vs 倒排索引

索引類型數據結構典型查詢場景時間復雜度
正排索引文檔ID → 字段內容已知ID查內容(SELECT *O(1)
倒排索引詞項 → [文檔ID列表]關鍵詞搜索(WHERE text LIKEO(log n) + O(m)
示例數據對比:
  • 文檔集合
文檔ID標題
1Elasticsearch實戰
2搜索引擎核心技術
  • 正排索引
    在這里插入圖片描述

  • 倒排索引
    在這里插入圖片描述

1.2 倒排索引核心結構

  • 倒排索引 = 詞項字典(Term Dictionary) + 倒排列表(Posting List
    在這里插入圖片描述
壓縮效果對比(1億文檔場景):
存儲方式原始大小壓縮后大小查詢速度
未壓縮文檔ID列表400MB-120ms
Roaring Bitmaps400MB15MB45ms
  • Roaring Bitmaps:是一種用于高效存儲和操作稀疏位圖(bitmap)的數據結構,通過將一個大的位圖分割成多個 16 位的桶(bucket),每個桶對應一個 16 位的鍵值。
    • 優勢
      • 節省空間:對于稀疏位圖,Roaring Bitmaps 比傳統的位圖存儲方式節省大量的內存空間。
      • 高效操作:支持快速的并集、交集、差集等操作,操作速度快。
      • 易于擴展:可以方便地處理大規模的位圖數據。
    • 存儲方式
      • 數組存儲:當桶中元素較少時,使用一個短整型數組來存儲這些元素。
      • 位圖存儲:當桶中元素較多時,使用傳統的位圖(bitmap)來存儲。
        在這里插入圖片描述

1.3 性能優化策略

    1. 索引分片(Sharding
    • 將大索引切分為多個分片并行處理
    • 示例:10億文檔索引分為20個分片,查詢性能提升8倍
    1. 段合并(Segment Merge
    • 后臺自動合并小段為更大段
    • 減少打開文件數,提升IO效率
    • 典型合并策略:Tiered Merge Policy
      • Tiered Merge Policy(分層合并策略)是 Elasticsearch 等搜索引擎中用于管理索引段(Segment)合并的一種策略。
      • 在搜索引擎中,新的數據寫入時會生成新的索引段,隨著時間推移,索引段數量會增多,這會影響查詢性能,因此需要對這些索引段進行合并。
      • Tiered Merge Policy 采用分層的方式來管理和合并這些索引段,以平衡合并成本和查詢性能。
    • 工作原理
      • 分層存儲將索引段按照大小劃分為不同的層,每一層中的索引段大小相近。較小的索引段位于較低的層,較大的索引段位于較高的層。
      • 合并規則:當某一層的索引段數量超過一定閾值時,會觸發合并操作,將該層的多個索引段合并成一個或多個較大的索引段,并將其提升到上一層。
        在這里插入圖片描述
    1. 禁用不需要的特性
    PUT /logs
    {"mappings": {"_doc": {"properties": {"message": {"type": "text","norms": false,      // 禁用評分因子存儲"index_options": "freqs"  // 不存儲位置信息}}}}
    }
    

2. 分詞器(Analyzer)工作機制

2.1 分詞器三層處理流程

在這里插入圖片描述

示例:處理"Elasticsearch's 中文分詞"

    1. 字符過濾器:去除HTML標簽、替換縮寫(如將’s替換為空)
      → “Elasticsearch 中文分詞”
    1. 分詞器:按空格/標點切分
      → [“Elasticsearch”, “中文”, “分詞”]
    1. Token過濾器:轉小寫、移除停用詞
      → [“elasticsearch”, “中文”, “分詞”]

2.2 內置分詞器對比

分詞器類型處理邏輯中文支持示例輸入 → 輸出
Standard按Unicode文本分割,轉小寫“Elasticsearch實戰” → [“elasticsearch”, “實戰”]
Simple非字母字符切分,保留大寫“Hello-World” → [“Hello”, “World”]
Whitespace按空格切分,保留原始大小寫“Hello World” → [“Hello”, “World”]
IK(中文增強)智能語義切分優秀“搜索引擎” → [“搜索”, “引擎”, “搜索引擎”]
分詞性能測試(處理10萬條商品標題):
分詞器耗時(秒)內存占用(GB)準確率(F1值)
Standard4.21.80.62
IK6.72.50.89
Jieba5.92.10.91

2.3 中文分詞深度解決方案

  • 痛點分析

    • 歧義切分(如"南京市長江大橋" → 南京/市長/江大橋 或 南京市/長江/大橋)
    • 新詞識別(如網絡用語"奧利給")
  • IK分詞器實戰配置

PUT /news
{"settings": {"analysis": {"analyzer": {"ik_smart_custom": {"type": "custom","tokenizer": "ik_smart","filter": ["lowercase", "stopwords_filter"]}},"filter": {"stopwords_filter": {"type": "stop","stopwords": ["的", "是", "了"]}}}}
}

3. 聯合應用實戰案例

3.1 電商搜索優化

  • 需求:提升"女士冬季羽絨服"搜索準確率
  • 解決方案
      1. 使用IK分詞器配置同義詞
    "filter": {"synonym_filter": {"type": "synonym","synonyms": ["羽絨服 => 羽絨衣, 羽絨外套"]}
    }
    
      1. 倒排索引存儲詞項位置信息
    "mappings": {"properties": {"title": {"type": "text","index_options": "offsets"  // 存儲位置信息用于短語匹配}}
    }
    
  • 效果
  • 搜索召回率提升37%
  • 相關商品點擊率(CTR)從22%提升至41%

3.2 日志多語言處理

  • 場景:國際業務日志含中/英/日文本
  • 配置方案
PUT /logs
{"settings": {"analysis": {"analyzer": {"multi_lang": {"type": "custom","char_filter": ["html_strip"],"tokenizer": "standard","filter": ["lowercase","cjk_width"  // 全角轉半角(處理日語)]}}}}
}
  • 處理效果
    • 日文文本 “エラーメッセージ” → [“エラーメッセージ”]
    • 中文文本 “錯誤信息” → [“錯”, “誤”, “信”, “息”]

3.3 敏感詞過濾系統

  • 實現方案
      1. 自定義字符過濾器
    "char_filter": {"sensitive_filter": {"type": "mapping","mappings": ["傻X => **", "垃圾 => **"]}
    }
    
      1. 分詞器鏈中應用
    "analyzer": {"safe_analyzer": {"char_filter": ["sensitive_filter"],"tokenizer": "ik_smart"}
    }
    
  • 測試結果
  • 原始文本:“這個產品簡直是垃圾!”
  • 處理后詞項:[“這個”, “產品”, “簡直”, “是”, “**”]

4. 性能對比與最佳實踐

4.1 倒排索引配置建議

場景推薦配置預期收益
高頻短語查詢啟用index_options: positions短語查詢速度提升3倍
大文本存儲禁用_source字段 + 開啟best_compression存儲空間減少40%
實時性要求高設置refresh_interval: 30s寫入吞吐量提升120%

4.2 分詞器選擇指南

場景推薦分詞器關鍵特性
中文搜索IK分詞器細粒度切分 + 新詞識別
多語言混合標準分詞器 + 小寫過濾基礎分詞 + 統一規范化
代碼/日志分析白名單分詞器保留特殊符號(如HTTP_200

4.3 聯合優化最佳實踐

    1. 冷熱數據分層
    • 熱數據:SSD存儲 + 高副本數(保障查詢性能)
    • 冷數據:HDD存儲 + 禁用副本(降低成本)
      在這里插入圖片描述
    1. 混合索引策略
    PUT /products
    {"settings": {"index": {"number_of_shards": 6,"number_of_replicas": 1,"analysis": { ... }}},"mappings": {"dynamic_templates": [{"strings_as_keywords": {"match_mapping_type": "string","mapping": { "type": "keyword" }}}]}
    }
    
    1. 監控與調優
    • 使用_analyzeAPI測試分詞效果
      GET /_analyze
      {"analyzer": "ik_smart","text": "自然語言處理技術"
      }
      
    • 通過indices.stats接口監控索引性能

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

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

相關文章

Springboot項目本地連接并操作MySQL數據庫

目錄 前提 準備工作 用cmd在本地創建數據庫、表: 1.創建springboot項目(已有可跳過) 2.編輯Mybatis配置 3.連接數據庫 4.創建模型類,用于與數據庫里的數據表相連 5.創建接口mapper,定義對數據庫的操作 6.創建…

《寶塔 Nginx SSL 端口管理實戰指南:域名解析、端口沖突與后端代理解析》

📢 Nginx & SSL 端口管理分析 1?? 域名解析與 SSL 申請失敗分析 在使用寶塔申請 www.mywebsite.test 的 SSL 證書時,遇到了解析失敗的問題。最初,我認為 www 只是一個附加的前綴,不屬于域名的關鍵部分,因此只為…

java和Springboot和vue開發的企業批量排班系統人臉識別考勤打卡系統

演示視頻: https://www.bilibili.com/video/BV1KU9iYsEBU/?spm_id_from888.80997.embed_other.whitelist&t52.095574&bvidBV1KU9iYsEBU 主要功能: 管理員管理員工,采集員工人臉特征值存入數據庫,可選擇多個員工批量排班…

DeepSeek學習規劃

DeepSeek是一個專注于深度學習和人工智能技術研究與應用的平臺,旨在通過系統化的學習和實踐,幫助用戶掌握深度學習領域的核心知識和技能。為了在DeepSeek平臺上高效學習,制定一個科學合理的學習規劃至關重要。以下是一個詳細的學習規劃&#…

打開 Windows Docker Desktop 出現 Docker Engine Stopped 問題

一、關聯文章: 1、Docker Desktop 安裝使用教程 2、家庭版 Windows 安裝 Docker 沒有 Hyper-V 問題 3、安裝 Windows Docker Desktop - WSL問題 二、問題解析 打開 Docker Desktop 出現問題,如下: Docker Engine Stopped : Docker引擎停止三、解決方法 1、檢查服務是否…

突破Ajax跨域困境,解鎖前端通信新姿勢

一、引言 在當今的 Web 開發領域,前后端分離的架構模式已經成為主流,它極大地提升了開發效率和項目的可維護性。在這種開發模式下,前端通過 Ajax 技術與后端進行數據交互,然而,跨域問題卻如影隨形,成為了開…

Mercury、LLaDA 擴散大語言模型

LLaDA 參考: https://github.com/ML-GSAI/LLaDA https://ml-gsai.github.io/LLaDA-demo/ 在線demo: https://huggingface.co/spaces/multimodalart/LLaDA Mercury 在線demo: https://chat.inceptionlabs.ai/ 速度很快生成

Rust~String、str、str、String、Box<str> 或 Box<str>

Rust語言圣經中定義 str Rust 語言類型大致分為兩種:基本類型和標準庫類型,前者由語言特性直接提供,后者在標準庫中定義 str 是唯一定義在 Rust 語言特性中的字符串,但也是幾乎不會用到的字符串類型 str 字符串是 DST 動態大小…

大數據SQL調優專題——底層調優

引入 上一篇我們提到了調優的常見切入點,核心就是通過數據產出情況發現問題,借助監控等手段收集信息排查瓶頸在哪,最后結合業務理解,等價重寫思路去解決問題。 在實際工作場景中,去保證數據鏈路產出SLA的時候&#x…

Hue 編譯異常:ImportError: cannot import name ‘six‘ from ‘urllib3.packages‘

個人博客地址:Hue 編譯異常:ImportError: cannot import name six from urllib3.packages | 一張假鈔的真實世界 在編譯Hue的時候出現錯誤信息如下: Running /home/zhangjc/ysten/git/ysten-hue/build/env/bin/hue makemigrations --noinpu…

計算機網絡——詳解TCP三握四揮

文章目錄 前言一、三次握手1.1 三次握手流程1.2 tcp為什么需要三次握手建立連接? 二、四次揮手2.1 四次揮手流程2.2 為什么是四次,不是三次?2.3 為什么要等待2msl?2.4 TCP的保活計時器 前言 TCP和UDP是計算機網絡結構中運輸層的兩…

# C# 中堆(Heap)與棧(Stack)的區別

在 C# 中,堆和棧是兩種不同的內存分配機制,它們在存儲位置、生命周期、性能和用途上存在顯著差異。理解堆和棧的區別對于優化代碼性能和內存管理至關重要。 1. 棧(Stack) 1.1 定義 棧是一種后進先出(LIFO&#xff0…

如何把圖片或者圖片地址存到 MySQL 數據庫中以及如何將這些圖片數據通過 JSP 顯示在網頁中

如何優雅地管理圖片:從MySQL數據庫存儲到JSP展示的全流程解析 在互聯網時代,一張引人入勝的圖片往往能為網站帶來巨大的流量。而作為開發者的我們,如何高效地管理和展示這些圖片資源則成為了一項重要的技術挑戰。今天,我們就一起…

「拼好幀」小黃鴨 Lossless Scaling 軟件介紹與下載

「拼好幀」小黃鴨 Lossless Scaling 軟件介紹與下載 在游戲和視頻播放時,你是否遇到過分辨率不匹配、畫質模糊的問題?今天給大家介紹一款神器——Lossless Scaling(拼好幀),也被玩家們親切地稱為“小黃鴨”&#xff0…

科普|無人機專業術語

文章目錄 前言一、飛控二、電調三、通道四、2S、3S、4S電池五、電池后面C是什么意思?六、電機的型號七、什么是電機的KV值?八、螺旋槳的型號九、電機與螺旋槳的搭配 前言 無人機飛控系統控制飛行姿態,電調控制電機轉速,遙控器通道控制飛行動作。電池C…

和鯨科技攜手四川氣象,以 AI 的力量賦能四川氣象一體化平臺建設

氣象領域與農業、能源、交通、環境科學等國計民生關鍵領域緊密相連,發揮著不可替代的重要作用。人工智能技術的迅猛發展,為氣象領域突破困境帶來了新的契機。AI 技術能夠深度挖掘氣象大數據中蘊含的復雜信息,助力人類更精準地把握自然規律&am…

Linux mount命令

Linux mount命令是經常會使用到的命令,它用于掛載Linux系統外的文件。 一、掛載功能介紹 掛載方法:mount DECE MOUNT_POINT 命令使用格式:mount [-fnrsvw] [-t vfstype] [-o options] device dir device:指明要掛載的設備&…

《Operating System Concepts》閱讀筆記:p177-p178

《Operating System Concepts》學習第 18 天,p177-p178 總結,總計 2 頁。 一、技術總結 1.implicit thread A programming model that transfers the creation and management of threading from application developers to compilers and run-time l…

Redis緩存一致性難題:如何讓數據庫和緩存不“打架”?

標題:Redis緩存一致性難題:如何讓數據庫和緩存不“打架”?(附程序員脫發指南) 導言:當數據庫和緩存成了“異地戀” 想象一下:你剛在美團下單了一份麻辣小龍蝦,付款后刷新頁面&#…

委托者模式(掌握設計模式的核心之一)

目錄 問題: 舉例: 總結:核心就是利用Java中的多態來完成注入。 問題: 今天刷面經,刷到裝飾者模式,又進階的發現委托者模式,發現還是不理解,特此記錄。 舉例: ?老板?…