Elasticsearch (ES)相關

在ES中,已經有Term Index,那還會走倒排索引嗎

你這個問題問得很到位 👍。我們分清楚 Term Index倒排索引 在 Elasticsearch (ES) 里的關系:


1. 倒排索引(Inverted Index)

  • 是 Lucene/ES 檢索的核心。
  • 文檔 → 詞項 → Posting List(包含出現在哪些 doc、位置等)。
  • 當你搜索一個 term 時,最終還是要從倒排索引里取出匹配文檔 ID。

2. Term Dictionary / Term Index

  • Term Dictionary 就是所有 term 的字典表,按字典序組織。

  • 如果直接存,可能會很大(幾百萬甚至上億個 term)。

  • 為了加速查找,Lucene 會給 Term Dictionary 建立 Term Index(類似于一個 FST 前綴樹)。

    • 作用是:快速定位某個 term 在 Term Dictionary 中的位置
    • 比如你要查 “apple”,Term Index 能快速告訴你 “apple” 在字典大概哪一段,而不用順序掃描。

3. 查詢流程(簡化版)

  1. 用戶查詢 "apple"
  2. 先查 Term Index:快速定位 “apple” 在 Term Dictionary 的范圍。
  3. 從 Term Dictionary 找到準確的 term
  4. 拿到這個 term 的倒排表(Posting List)
  5. 根據 Posting List 找出對應的文檔 ID。

4. 回答你的問題

👉 有 Term Index,不代表不走倒排索引

  • Term Index 只是用來 加速找到 term 的入口,本質上還是要回到 倒排索引(Posting List) 去取文檔。

  • 所以兩者關系是:

    • Term Index → 幫你定位 term
    • 倒排索引 → 真正返回文檔

? 一句話總結
ES 中,Term Index 是 倒排索引的入口加速結構,最終查文檔時一定會走倒排索引。

就是說Term Index不會完全匹配到,只會返回有共同前綴的第一個Term Dictionary?之后在利用倒排索引進行二分查找?

👌 你理解的方向對,但我幫你捋清楚細節:


1. Term Index 的本質

  • Term Index 在 Lucene 里一般是 FST(Finite State Transducer)有窮狀態機
  • 它不是存所有 term,而是存 稀疏采樣的前綴 → Term Dictionary 的跳轉位置
  • 所以 Term Index 的作用是:快速定位到 Term Dictionary 中的某個位置,而不是直接給出完整匹配。

2. 查詢過程(舉例)

假設 Term Dictionary 里有這些 term:

apple
applet
application
banana
band

當你查 "application"

  1. Term Index 先根據前綴找到 "app" 開頭的一個錨點(比如指向 "apple" 這一段)。
  2. 然后在 Term Dictionary 里做精確比較/二分查找,直到找到 "application"
  3. 一旦找到 term,就能取出它對應的 Posting List(倒排表)

3. 回答你的問題

? 你說的“只會返回有共同前綴的第一個 Term Dictionary”是對的,但有個補充:

  • Term Index 會定位到 最接近的一個錨點
  • 然后 Lucene 在 Term Dictionary 中繼續查找(可能是二分查找,也可能是順序掃描,取決于實現)。
  • 找到確切的 term 后,才會去讀 倒排索引(Posting List)

4. 類比理解

  • Term Index:像書的目錄,告訴你某個字母開頭的詞在哪一頁。
  • Term Dictionary:具體的詞表,按字典序排好。
  • 倒排索引:每個詞對應的“在哪些文章里出現”。

所以 Term Index 永遠只是入口,最終要靠 Term Dictionary 精確匹配,拿到 Posting List 才能查文檔。

我想的是,按照你給的例子中appli這個前綴似乎是獨一無二的,總能找到,就算是applet,apple他們也是有區分度的。那么,唯一的可能就是,Term Index不會無限細分下去,比如到app,就不再往下分了,這樣只能搜索到apple

你抓住關鍵點了 👍,正是這樣。

Lucene 里的 Term Index(通常是 FST),不會把所有 term 的路徑都完整存進去,否則就和 Term Dictionary 本身沒區別了,浪費空間。


1. Term Index 不會無限細分

  • 它是 稀疏索引,只存一部分前綴作為“跳點”。

  • 比如詞表里有:

    apple
    applet
    application
    
  • Term Index 可能只存到 “app”,指向這段 term。

  • 并不會繼續區分到 "appl" / "appli" 這種更細的層級。


2. 查找過程

  1. 你查 "application" → 先用 FST 找 "app" 的錨點。
  2. 跳到 Term Dictionary 對應區間(可能是 "apple" 開頭的地方)。
  3. 然后在這片字典里做二分 / 順序查找,直到找到 "application"

3. 為什么這樣設計?

  • 節省內存:如果所有前綴都存,就和存一整個 Trie 差不多,太大。
  • 查找效率:稀疏索引 + Term Dictionary 二分查找,綜合性能更高。
  • 平衡:只要能快速定位到“足夠小的一段”就夠了,沒必要直接精確定位到某個 term。

? 所以你理解對了

  • Term Index 不會無限細分,它只保證能定位到某個“最近的前綴區間”;
  • 真正的精確匹配還是要靠 Term Dictionary(而不是 Term Index 本身)。

那一般會細分都幾個字符

好問題 👍,你已經完全抓到 Lucene Term Index 的實現細節了。


1. Term Index(FST)的細分程度

在 Lucene/ES 里,這個“細分到幾個字符”不是寫死的,而是通過 采樣策略決定的。

  • Lucene 在構建索引時,不會給每個 term 都建一個索引節點,而是按間隔采樣
  • 這個采樣的粒度由參數控制,主要是:

termIndexInterval

  • 含義:在 Term Dictionary 中,每隔多少個 term,往 FST 里加一個跳點。
  • 默認值(Lucene 9.x):32
  • 也就是說:Term Index 大約每隔 32 個 term 才存一個 entry

2. 影響

  • 如果 term 很多,比如 320,000 個 term,Term Index 里大概只有 10,000 個跳點。
  • 這樣就不會無限細分到 applappli 這種級別,而是存一些“代表性前綴”。
  • 查找時,先通過 FST 定位到最接近的跳點,然后再在 Term Dictionary 里做二分/順序查找。

3. 舉個例子

假設 Term Dictionary 里有這些詞(簡化):

apple
applet
application
apply
banana
band
...
  • 如果 termIndexInterval = 2,那么 Term Index 可能只存:

    • "apple"
    • "application"
    • "banana"
  • 你要查 "applet" 的時候,FST 會定位到 "apple" 這一段,然后在 Term Dictionary 里再順序/二分找到 "applet"


4. 回答你的問題

👉 一般不會細分到具體幾個字符,而是按 term 間隔采樣

  • 默認:32 個 term 采樣一次
  • 所以“細分程度”取決于字典里 term 的分布,而不是固定的字符長度。

? 一句話總結
Term Index 不是按字符數來細分,而是 每隔一定數量的 term(默認 32)建立一個跳點。最終的精確匹配仍然要依賴 Term Dictionary。

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

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

相關文章

pre-commit run --all-files 報錯:http.client.RemoteDisconnected

報錯完整信息初步原因是這樣 報錯是 Python 的 http.client.RemoteDisconnected,意思是 在用 urllib 請求遠程 URL 時,遠程服務器直接斷開了連接,沒有返回任何響應。在你的堆棧里,它出現在 pre-commit 嘗試安裝 Golang 環境的時候…

【C++】STL·List

1. list的介紹及使用 1.1list介紹 List文檔介紹 1.2 list的使用 list中的接口比較多,此處類似,只需要掌握如何正確的使用,然后再去深入研究背后的原理,已 達到可擴展的能力。以下為list中一些常見的重要接口。 1.2.1 list的構造…

圖論2 圖的數據結構表示

目錄 一 圖的數據結構表示 1 鄰接矩陣(Adjacency Matrix) 2 鄰接表(Adjacency List) 3 邊列表(Edge List) 4 十字鏈表(Orthogonal List / Cross-linked List, 十字鏈表) 5 鄰接…

在Excel中刪除大量間隔空白行

在 Excel 中刪除大量間隔空白行,可使用定位空值功能來快速實現。以下是具體方法:首先,選中包含空白行的數據區域。可以通過點擊數據區域的左上角單元格,然后按住鼠標左鍵拖動到右下角最后一個單元格來實現。接著,按下快…

【C 學習】10-循環結構

“知道做不到就是不知道”一、條件循環1. while只要條件為真&#xff08;true&#xff09;&#xff0c;就會重復執行循環體內的代碼。while (條件) {// 循環體&#xff08;要重復執行的代碼&#xff09; }//示例 int i 1; while (i < 5) {printf("%d\n", i);i; …

音視頻的下一站:協議編排、低時延工程與國標移動化接入的系統實踐

一、引言&#xff1a;音視頻的基礎設施化 過去十年&#xff0c;音視頻的兩條主線清晰可辨&#xff1a; 娛樂驅動&#xff1a;直播、電商、短視頻把“實時觀看與互動”變成高頻日常。 行業擴展&#xff1a;教育、會議、安防、政務逐步把“可用、可管、可控”引入產業系統。 …

SAM-Med3D:面向三維醫療體數據的通用分割模型(文獻精讀)

1) 深入剖析:核心方法與圖示(Figure)逐一對應 1.1 單點三維提示的任務設定(Figure 1) 論文首先將3D交互式分割的提示形式從“2D逐片(每片1點,共N點)”切換為“體素級單點(1個3D點)”。Figure 1直觀對比了 SAM(2D)/SAM-Med2D 與 SAM-Med3D(1點/體) 的差異:前兩者…

【Spring】原理解析:Spring Boot 自動配置進階探索與優化策略

一、引言在上一篇文章中&#xff0c;我們對 Spring Boot 自動配置的基本原理和核心機制進行了詳細的分析。本文將進一步深入探索 Spring Boot 自動配置的高級特性&#xff0c;包括如何進行自定義擴展、優化自動配置的性能&#xff0c;以及在實際項目中的應用優化策略。同時&…

OpenCV:圖像直方圖

目錄 一、什么是圖像直方圖&#xff1f; 關鍵概念&#xff1a;BINS&#xff08;區間&#xff09; 二、直方圖的核心作用 三、OpenCV 計算直方圖&#xff1a;calcHist 函數詳解 1. 函數語法與參數解析 2. 基礎實戰&#xff1a;計算灰度圖直方圖 代碼實現 結果分析 3. 進…

docke筆記下篇

本地鏡像發布到阿里云 本地鏡像發布到阿里云流程 鏡像的生成方法 基于當前容器創建一個新的鏡像&#xff0c;新功能增強 docker commit [OPTIONS] 容器ID [REPOSITORY[:TAG]] OPTIONS說明&#xff1a; OPTIONS說明&#xff1a; -a :提交的鏡像作者&#xff1b; -m :提交時的說…

《大數據之路1》筆記2:數據模型

一 數據建模綜述 1.1 為什么要數據建模背景&#xff1a; 隨著DT時代的來臨&#xff0c;數據爆發式增長&#xff0c;如何對數據有序&#xff0c;有結構地分類組織額存儲是關鍵定義&#xff1a; 數據模型時數據組織和存儲的方法&#xff0c;強調從業務、數據存取、使用角度 合理存…

“量子能量泵”:一種基于并聯電池與電容陣的動態直接升壓架構

“量子能量泵”&#xff1a;一種基于并聯電池與電容陣的動態直接升壓架構摘要&#xff1a;本文揭示了一種革命性的高效電源解決方案&#xff0c;旨在徹底解決低電壓、大功率應用中的升壓效率瓶頸與電池一致性難題。該方案摒棄傳統磁性升壓拓撲&#xff0c;創新性地采用并聯電池…

DeepSeek實戰--自定義工具

1. 背景 當前已經有很多AI基礎平臺&#xff08;比如&#xff1a;扣子、Dify&#xff09;&#xff0c;用戶可以快速搭建Agent&#xff0c;那怎樣將已有的接口能力給大模型調用呢 &#xff1f; 今天我們來探索一個&#xff0c;非常高效、快捷的方案&#xff1a;將http接口做成Dif…

“移動零”思路與題解

給定一個數組 nums&#xff0c;編寫一個函數將所有 0 移動到數組的末尾&#xff0c;同時保持非零元素的相對順序。請注意 &#xff0c;必須在不復制數組的情況下原地對數組進行操作。思路講解&#xff1a;舉例如下&#xff1a;實現代碼是&#xff1a;class Solution { public:v…

關于行內元素,行內塊元素和塊級元素

1、什么是行內元素&#xff0c;什么是行內塊元素&#xff0c;什么是塊級元素行內元素的特點&#xff1a;不獨占一行&#xff0c;相鄰元素會在同一行顯示&#xff0c;直到一行排不下才換行。寬度和高度由內容本身決定&#xff0c;無法通過width&#xff0c;height手動設置&#…

?絡請求Axios的概念和作用

Axios 是一個基于 ??Promise?? 的輕量級、高性能 ??HTTP 客戶端庫??&#xff0c;主要用于在瀏覽器和 Node.js 環境中發起 HTTP 請求&#xff08;如 GET、POST、PUT、DELETE 等&#xff09;。它通過簡潔的 API 和強大的功能&#xff0c;簡化了前端與后端之間的數據交互過…

在AgentScope中實現結構化輸出

在AgentScope中實現結構化輸出 概述 在AgentScope框架中&#xff0c;結構化輸出功能允許開發者定義明確的輸出模式&#xff0c;確保AI模型的響應符合預期的格式和約束。本教程將介紹如何使用AgentScope的structured_model參數來實現結構化輸出。 結構化輸出的優勢 數據一致性&a…

Linux 磁盤I/O高占用進程排查指南:從定位到分析的完整流程

在Linux服務器運維工作中&#xff0c;磁盤I/O瓶頸是導致系統性能下降的常見原因之一。當服務器出現響應緩慢、應用卡頓等問題時&#xff0c;及時定位并解決高I/O占用進程就顯得尤為重要。本文將從核心思路出發&#xff0c;通過“確認問題-定位磁盤-鎖定進程-深入分析”四個步驟…

解決React中通過外部引入的css/scss/less文件更改antDesign中Modal組件內部的樣式不生效問題

不生效原因Ant Design 的 Modal 默認通過 ReactDOM.createPortal 掛在 <body> 下&#xff0c;與你的組件樹平級&#xff0c;所以寫在 .module.css / scoped less 里的選擇器根本匹配不到它&#xff0c;就算寫全局樣式&#xff0c;也可能因為權重不足或異步掛載時機而“看…

day41 51單片機最小系統、GPIO控制、時序邏輯器件(74HC138/595)與LED點陣驅動原理

day41 51單片機最小系統、GPIO控制、時序邏輯器件&#xff08;74HC138/595&#xff09;與LED點陣驅動原理一、嵌入式系統基礎概念 1.1 嵌入式系統定義先設計硬件&#xff0c;基于硬件設計軟件實現一個具體的功能 —— 專用的計算機系統硬件/軟件可剪裁&#xff1a;根據功能需求…