Lucene 初學者實戰(二)正排索引與倒排索引
Lucene:基於傳統全文檢索引擎的倒排索引,並實現了分塊索引。與倒排所引相對立的是正排索引,也成為正向所引。本文將簡單介紹。
1 正排索引(forward index)
由key查詢實體的過程,是正排索引.
在搜尋引擎中每個檔案都對應一個檔案ID,檔案內容被表示為一系列關鍵詞的集合 Map< id,list< item>>,能夠由id快速找到內容的一個數據結構。
2 倒排索引(inverted index)
由item查詢key的過程,是倒排索引。
倒排索引可以理解為Map< item, list< id>>,能夠由查詢詞快速找到包含這個查詢詞的檔案的資料結構。倒排索引主要由兩個部分組成:“單詞詞典”和“倒排檔案”。
倒排索引基本概念
文件(Document):一般搜尋引擎的處理物件是網際網路網頁,而文件這個概念要更寬泛些,代表以文字形式存在的儲存物件,相比網頁來說,涵蓋更多種形式,比如Word,PDF,html,XML等不同格式的檔案都可以稱之為文件。
文件集合(Document Collection):由若干文件構成的集合稱之為文件集合。比如海量的網際網路網頁或者說大量的電子郵件都是文件集合的具體例子。
文件編號(Document ID):將文件集合內每個文件賦予一個唯一的內部編號,以此編號來作為這個文件的唯一標識,這樣方便內部處理,每個文件的內部編號即稱之為“文件編號”,後文有時會用DocID來便捷地代表文件編號。
單詞編號(Word ID):與文件編號類似,搜尋引擎內部以唯一的編號來表徵某個單詞,單詞編號可以作為某個單詞的唯一表徵。
單詞詞典(Lexicon):搜尋引擎的通常索引單位是單詞,單詞詞典是由文件集合中出現過的所有單詞構成的字串集合,單詞詞典內每條索引項記載單詞本身的一些資訊以及指向“倒排列表”的指標。
倒排列表(PostingList):倒排列表記載了出現過某個單詞的所有文件的文件列表及單詞在該文件中出現的位置資訊,每條記錄稱為一個倒排項(Posting)。根據倒排列表,即可獲知哪些文件包含某個單詞。
倒排檔案(Inverted File):所有單詞的倒排列表往往順序地儲存在磁碟的某個檔案裡,這個檔案即被稱之為倒排檔案,倒排檔案是儲存倒排索引的物理檔案。
關於這些概念之間的關係,通過下圖可以比較清晰的看出來。
3 簡單舉例
針對倒排所引和正排索引,做簡單介紹,例如以下兩個文件:
文件1:word1,word2,word3......
文件2:word2,word3,word5....
文件1和文件2 手續經過分詞並記錄詞語在文件的位置和出現的次數,之後得到兩個詞語集合。
正排索引的結構如下:
“文件1”的ID > 單詞1:出現次數,出現位置列表;單詞2:出現次數,出現位置列表;
“文件2”的ID > 單詞1:出現次數,出現位置列表;單詞2:出現次數,出現位置列表;
倒排索引的結構如下:
4 實際舉例
文件編號(id) | 文件內容 |
---|---|
1 | 我喜歡數學 |
2 | 我喜歡程式設計 |
3 | 我考試數學成績很好 |
4 | 程式設計太難了 |
分詞之後的正排索引Map< id, list< item>>
文件編號(id) | 分詞後的集合(list< item>) |
---|---|
1 | {我,喜歡,數學} |
2 | {我,喜歡,程式設計} |
3 | {我,考試,數學,成績,很好} |
4 | {程式設計,太難了} |
分詞後倒排索引
- 簡單的倒排索引Map< item,list< id>>
編號 | 單詞(item) | 倒排列表(list< id>) |
---|---|---|
1 | 我 | 1,2,3 |
2 | 喜歡 | 1,2 |
3 | 數學 | 1,3 |
4 | 程式設計 | 2,4 |
5 | 考試 | 3 |
6 | 成績 | 3 |
7 | 很好 | 3 |
8 | 太難了 | 4 |
-
有單詞頻率資訊(TF)的倒排索引Map< item,list< (id;TF)>>
在單詞對應的倒排列表中不僅記錄了文件編號,還記載了單詞頻率資訊,即這個單詞在某個文件中的出現次數,之所以要記錄這個資訊,是因為詞頻資訊在搜尋結果排序時,計算查詢和文件相似度是很重要的一個計算因子,將其記錄在倒排列表中,以方便後續排序時進行分值計算。
編號 | 單詞(item) | 倒排列表(list< (id;TF)>); |
---|---|---|
1 | 我 | (1;1),(2;1),(3;1) |
2 | 喜歡 | (1;1),(2,1) |
3 | 數學 | (1;1),(3;1) |
4 | 程式設計 | (2;1),(4;1) |
5 | 考試 | (3;1) |
6 | 成績 | (3;1) |
7 | 很好 | (3;1) |
8 | 太難了 | (4;1) |
- 有單詞頻率和出現位置(pos)資訊的倒排索引Map< item,list<(id;TF;< pos>)>>
編號 | 單詞(item) | 倒排列表(list<(id;TF;< pos>)>); |
---|---|---|
1 | 我 | (1;1;<1>),(2;1;<1>,(3;1;<1>) |
2 | 喜歡 | (1;1;<2>),(2;1;<2>) |
3 | 數學 | (1;1;<3>),(3;1;<3>) |
4 | 程式設計 | (2;1;<3>),(4;1;<1>) |
5 | 考試 | (3;1;<3>) |
6 | 成績 | (3;1;<4>) |
7 | 很好 | (3;1;<5>) |
8 | 太難了 | (4;1;<2>) |
- 單詞詞典(實際執行過程中,單詞詞典是在記憶體中)
編號 | 單詞(item) |
---|---|
1 | 我 |
2 | 喜歡 |
3 | 數學 |
4 | 程式設計 |
5 | 考試 |
6 | 成績 |
7 | 很好 |
8 | 太難了 |
5.對比
(1)倒排所有主要的作用就是召回,正排索引的作用主要是排序(計算分數)
(2)對一個大型搜尋引擎,召回只是最基本、最簡單的功能,所以倒排所引只佔整個搜尋index的20%--30%;相反正排索引真正佔70--80%(其中排序的正排又佔大頭)
參考
2.什麼是倒排索引?