倒排索引基礎

2021-09-06 05:24:02 字數 2436 閱讀 2185

一)單詞-文件矩陣

搜尋引擎的索引其實就是實現單詞-文件矩陣的具體資料結構,具體可以包括:倒排索引、簽名檔案、字尾樹等。常見的當然就是倒排索引了,lucene也是基於倒排索引實現的。

二)倒排索引

1.倒排索引的組成

倒排索引通常有詞彙表記錄表組成。

詞彙表:文件集合中所包含的不同單詞的集合。

記錄表:對於詞彙表中的每乙個單詞,包含這個單詞的文件編號構成的乙個列表(有可能還會儲存些其他資訊,例如單詞在文件中的位置資訊)。

2.使用倒排索引(檢索)

這樣的結構怎麼用於檢索?

通常我們將詞彙表和記錄表分開儲存,詞彙表檔案中包含每個單詞指向記錄表檔案的指標。先在詞彙表中找到需要檢索的單詞,然後取出對應的記錄表。如果查詢中只有乙個單詞,取出記錄表即可,如果查詢中包含多個單詞,取出多個記錄表還需要做合併(交集或者並集)。

死做結果肯定可以出來,但是這裡效率必須強調。怎麼快速的找到單詞然後獲取記錄表內容呢?如果你的詞表不是很大(主存可以容納得下),那麼排序陣列、b樹、trie樹、雜湊都是可選的資料結構,雜湊速度肯定毋庸置疑,b樹、trie樹可以處理字首查詢和範圍查詢。lucene中不考慮將整個詞表存入主存,他的詞表檔案分成兩個,類似兩層跳躍表,中間採用二分查詢。

3.建立索引

一般分成三種方式:

3.1.兩遍文件遍歷方法(2-pass in-memory inversion)

這種方式完全是依賴記憶體的。第一遍掃瞄所有文件,計算每個單詞的tf,然後計算所有單詞tf的總和,這個總和值直接關係到最終索引所需的記憶體大小。在記憶體中,建立有序陣列用來儲存單詞,建立一塊連續的儲存空間(由tf總和控制)用來儲存倒排索引,並且每個單詞通過「指標」指向其對應的倒排列表其實位置。第二遍掃瞄就是建立每個單詞的倒排列表資訊。當所有文件掃面結束後,再以某種方式儲存起來。

這種方式的缺點是:1)兩遍掃瞄,效率低下;2)完全依賴記憶體,對規模大點的文件集無能為力;3)不支援動態更新索引。

3.2.排序法(sort-based inversion)

為了解決兩遍文件遍歷方法的缺陷,排序法只在記憶體中開闢固定大小的空間用來建立索引,當空間消耗光時將其寫入磁碟,然後清空記憶體空間對其他文件進行索引,直至索引完全部文件。排序法將單詞全部儲存在記憶體中,並且不停收集倒排項(倒排項包括:單詞id,文件id,單詞頻率等資訊),當空間消耗光時,對所有的倒排項按照單詞id、文件id進行排序,排序好後將其寫入臨時檔案。此時清空倒排項所占用的記憶體空間,然後重複上述工作。注意單詞id是事先排好序的。在一開始,我們不會將全部的單詞載入進入記憶體,是在遍歷的過程中文件中出現了才加入記憶體。因此隨著遍歷,單詞所占用的空間越來越大,倒排項所占用的空間越來越小,也就是說越到後面一次遍歷的文件數量就越少,臨時檔案也就越小。

當遍歷完整個文件集後,我們便得到了一堆的臨時檔案(儲存了倒排項),接下來就要將這些檔案進行「整合」。由於這些倒排項都排好序了,因此這個工作相對簡單,就是將同乙個單詞的倒排項進行合併。

3.3.歸併法(merge-based inversion)

排序法最致命的乙個問題就是將全部單詞放到記憶體裡,如果單詞量特別大,以至於記憶體放不下那就望塵莫及了!歸併法可以很好的解決這個問題,歸併法也在記憶體中開闢一塊固定大小的空間,對於一篇文件就將其轉換成標準的記憶體倒排索引結構,假設在記憶體空間的限制下,將n篇文件建立好了單獨的記憶體倒排索引結構,然後進行合併形成乙個索引段,寫入磁碟,清空記憶體。這裡的記憶體索引、索引段只是在文件數量規模上有所區別,結構上完全一致。在這個過程中同樣需要對單詞進行排序,方便後期的合併。

當遍歷完整個文件集合後,我們同樣得到了一堆臨時檔案(索引段),和排序法類似,我們將同一單詞的倒排列表進行合併即可。

lucene採用的就是這種方式。

4.動態索引

索引建立完成後,如果後期不需要對其進行調整(增、刪),那麼稱之為靜態索引,反之為動態索引。

動態索引又將牽涉到實時索引(實時檢索)等問題,這裡不展開描述實時的問題。

動態索引包含三個部分:磁碟索引檔案、記憶體臨時索引、已刪除文件列表。

記憶體臨時索引和歸併法中的記憶體索引乙個意思,將新加的文件臨時放在記憶體中。以刪除文件列表記錄刪除文件的id。檢索時同時查詢磁碟索引檔案和記憶體臨時索引,然後通過已刪除文件列表進行過濾。當記憶體臨時索引達到一定閾值時將其合併到磁碟索引檔案。

5.索引更新策略

索引更新主要包括完全重新更新(complete re-build)和增量更新(再合併策略re-merge、原地更新策略in-place)。lucene中使用的是re-merge策略。

重點:1.詞彙表的儲存和查詢(資料結構)

排序陣列、b樹、trie樹、雜湊

倒排索引基礎

搜尋引擎的索引 單詞 文件矩陣是表達兩者之間所具有的一種包含關係的概念模型,圖3 1展示了其含義。圖3 1的每列代表乙個文件,每行代表乙個單詞,打對勾的位置代表包含關係。圖3 1 單詞 文件矩陣 從縱向即文件這個維度來看,每列代表文件包含了哪些單詞,比如文件1包含了詞彙1和詞彙4,而不包含其它單詞。...

倒排索引原理 機器學習基礎 倒排索引與搜尋引擎

在介紹倒排索引之前,我們先來看看什麼是索引。索引是資料庫當中的概念,維基百科中的說法是 資料庫索引,是資料庫管理系統中乙個排序的資料結構,以協助快速查詢 更新資料庫表中資料 可以簡單地把索引當成是字典裡的檢索目錄,我們比如我們要查乙個叫 index 的單詞,通過目錄,可以快速地找到字母i開始的位置。...

倒排索引 和 倒排表

為什麼我們要說倒排索引呢?因為倒排索引是目前 搜尋引擎公司最對搜尋引擎最常用的儲存方式.也是搜尋引擎的核心內容 在搜尋引擎實際的引用之中,有時需要按照關鍵字的某些值查詢記錄,所以我們是按照關鍵字建立索引,這個索引我們就稱之為 倒排索引,而帶有倒排索引的檔案我們又稱作 倒排索引檔案也可以叫它為 倒排檔...