搜索引擎之倒排索引淺析

来源:https://www.cnblogs.com/wupeixuan/archive/2020/03/03/12405554.html
-Advertisement-
Play Games

上一篇文章 "ElasticSearch 術語" 中提到了倒排索引,那麼這篇文章就來講解下什麼是倒排索引,倒排索引的數據結構以及 ElasticSearch 中的倒排索引。 倒排索引 倒排索引(Inverted Index) 也常被稱為反向索引,是搜索引擎中非常重要的數據結構,為什麼說它重要呢,我們 ...


上一篇文章 ElasticSearch 術語中提到了倒排索引,那麼這篇文章就來講解下什麼是倒排索引,倒排索引的數據結構以及 ElasticSearch 中的倒排索引。

倒排索引

倒排索引(Inverted Index) 也常被稱為反向索引,是搜索引擎中非常重要的數據結構,為什麼說它重要呢,我們首先拿一本書《重構 改善既有代碼的設計》舉個例子:

如果一本書沒有目錄的話,理論上也是可以讀的,只是合上書下次再次閱讀的時候,就有些耗費時間了。

通過給一本書加目錄頁,可以快速瞭解這本書的大致內容分佈以及每個章節的頁碼數,這樣在查詢內容的時候效率就會非常高了,所以書的目錄就是書本內容的簡單索引。

目錄頁

想象一下你要搜索 case語句 這個關鍵詞在這本書的頁碼,你應該怎麼辦呢?有些技術類的書籍會在最後提供索引頁,這本書的索引頁如下:

索引頁

只需要從索引頁中查找 case語句,就可以查找到關鍵詞在書本中的頁碼位置了。

看完這個例子,讓我們來把圖書和搜索引擎做個簡單的類比:

圖書當中的目錄頁就相當正向索引(Forward Index)索引頁就相當於倒排索引的簡單實現,在搜索引擎中,正向索引指的是文檔 ID 到文檔內容和單詞的關聯,倒排索引就是單詞到文檔 ID 的關係

下麵來看一個很簡單的例子:

文檔 ID 文檔內容
1 Mastering ElasticSearch
2 ElasticSearch Server
3 ElasticSearch Essentials

如上有三篇文檔,每篇文檔的內容都是關於 ElasticSearch 的三本書,那我們思考下怎麼樣變為一個倒排索引呢?

Term Count DocumentId:Position
ElasticSearch 3 1:1,2:0,3:0
Mastering 1 1:0
Server 1 2:1
Essentials 1 3:1

把書中內容出現所以的詞都分成不同的關鍵詞(Term),排列在第一欄,分別是 ElasticSearchMasteringServerEssentials;第二欄是統計了關鍵詞在所有內容中出現的次數,比如 ElasticSearch 在內容中出現了三次,就記為 3;第三欄標註的是文檔 ID 和文檔出現的位置,比如 ElasticSearch 在第 1,2,3 文檔中都出現了,在第一個文檔所處的位置是第二個,所以標註的為 1。

以上就是簡單的正排索引和倒排索引的結構,下麵讓我們來看下倒排索引的數據結構:

倒排索引數據結構

倒排索引的核心分為兩部分,第一部分為單詞詞典(Term Dictionary),記錄所有文檔的單詞以及單詞到倒排列表的關聯關係。在前面的例子中,單詞的量並不是很多,但是在實際生產中,單詞量會非常大,所以實際會採用 B+ 樹和哈希拉鏈法去存儲單詞的詞典,以滿足高性能的插入與查詢。

第二部分是倒排列表(Posting List),它記錄了單詞對應文檔的結合,倒排列表是由倒排索引項(Posting) 組成,倒排索引項包含:

  • 文檔 ID:用於獲取原始信息
  • 詞頻(TF,Term Frequency):該單詞在文檔中出現的次數,用於相關性評分
  • 位置(Position):單詞在文檔中分詞的位置,用於語句搜索(Phrase Query)
  • 偏移(Offset):記錄單詞的開始結束位置,實現高亮顯示(比如用 GitHub 搜索的時候,搜索的關鍵詞會高亮顯示)

下麵我們來用一張圖來整體看下倒排索引:

一個倒排索引是由單詞詞典(Term Dictionary)和倒排列表(Posting List)組成的,單詞詞典會記錄倒排列表中每個單詞的偏移位置。比如當搜索 Allen 的時候,首先會通過單詞詞典快速定位到 Allen,然後從 Allen 這裡拿到在倒排列表中的偏移,快速定位到在倒排列表中的位置,從而真正拿到倒排索引項 [12,15](這裡只是列了下 Document ID,其實是像上面講的包含 4 項信息的項),拿到這個項可以去索引上拿到原始信息,可以去計算打分排序返回給用戶。

再瞭解了倒排索引的數據結構後,讓我們來看下 ES 中的倒排索引吧!

ElasticSearch 倒排索引

那麼在 ElasticSearch 中的文檔是基於 Json 格式的,其中一個文檔包含多個欄位,每個欄位都會有自己的倒排索引。在 Mapping 中可以去設置對某些欄位不做索引,這樣做可以節省存儲空間,但同時也會導致這個欄位無法搜索了。

比如一個文檔,其中包含兩個欄位 usernamejob

{
    "username":"wupx",
    "job":"programmer"
}

在構建索引的時候是根據欄位構建的,那麼 ES 中 username 會有一個倒排索引,job 也會有一個倒排索引。

總結

這篇文章主要介紹了什麼是倒排索引以及它的數據結構,下一篇文章將會學習如何在 ElasticSearch 中分詞來形成倒排索引。

參考文獻

Elasticsearch核心技術與實戰

https://dwz.cn/ELv7FvuX


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 完成SRAM晶元的測試,需要設計測試電路板。測試電路板主要提供測試介面和電源。晶元的控制信號和數據信號由紅色颶風II-Xilinx FPGA 開發板提供,使用ISE13.2 軟體建立測試工程,編寫Verilog 測試程式(主要包括按照時序提供分頻後的測試時鐘、數據信號和控制信號),通過JTAG 下載 ...
  • 自 MySQL5.1.6起,增加了一個非常有特色的功能–事件調度器(Event Scheduler),可以用做定時執行某些特定任務,來取代原先只能由操作系統的計劃任務來執行的工作。事件調度器有時也可稱為臨時觸發器(temporal triggers),因為事件調度器是基於特定時間周期觸發來執行某些任 ...
  • 使用方法: 使用示例: ...
  • ntpdate 系統時間、hwclock 硬體時間1、判斷當前時間是否準確[root@Ecology-APP ~]# date2020年 03月 03日 星期二 10:13:02 CST 2、檢查是否安裝ntpdate[root@Ecology-APP ~]# ntpdate-bash: ntpda ...
  • 字元串按位置切片 ${var:offset:length} offset:從第幾個開始切 length:切多長。可以是負數(從最右面開始切多長,註意負號和冒號之間必須有空格)。 字元串模式 模式: :代表0個或多個任意字元。 ?:代表0個或1個任意字元。 字元串按模式切片(只能從行首或行尾開始切,不 ...
  • i.MXRT1010的市場定位類似於傳統8位MCU或入門級32位MCU,它跟i.MXRT1015/1020/1050一樣內部只集成了一個雙通道8bit的FlexSPI模塊,從低成本開發角度考慮外掛的晶元應該越少越好,因此本文主要介紹單Flash連接,不再像前面幾款i.MXRT晶元那樣去額外介紹雙Fl... ...
  • Windows歷年高危漏洞介紹和分析 一、漏洞介紹: 1.漏洞: <1>.漏洞:是影響網路安全的重要因素; <2>.漏洞利用:成為惡意攻擊的最常用手段; <3>.漏洞攻擊:產業化、低成本化、手段多樣化、低門檻趨勢; <4>.信息化時代:無論個人/企業,都面臨嚴峻的漏洞威脅; <5>.Windows、 ...
  • Redis做為單機緩存使用建議 前言 由於原來項目使用的緩存中間件無法在國產麒麟操作系統裡面使用,準備在項目中引入redis做為單機緩存。 配置優化建議 配置redis服務以守護進程啟動 Redis預設不是以守護進程的方式運行,可以通過將配置項daemonize修改為yes,這樣啟動redis-se ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...