Lucerne倒排索引原理

Lucerne使用的是倒排文件索引結構。該結構及相應的生成算法以下:    算法

設有兩篇文章1和2:url

文章1的內容爲:Tom lives in Guangzhou,I live in Guangzhou too.    文章2的內容爲:He once lived in Shanghai.spa

<1>取得關鍵詞.net

因爲lucene是基於關鍵詞索引和查詢的,首先咱們要取得這兩篇文章的關鍵詞,一般咱們須要以下處理措施:   指針

a.咱們如今有的是文章內容,即一個字符串,咱們先要找出字符串中的全部單詞,即分詞。英文單詞因爲用空格分隔,比較好處理。中文單詞間是連在一塊兒的須要特殊的分詞處理。    索引

b.文章中的」in」, 「once」 「too」等詞沒有什麼實際意義,中文中的「的」「是」等字一般也無具體含義,這些不表明概念的詞能夠過濾掉   ci

c.用戶一般但願查「He」時能把含「he」,「HE」的文章也找出來,因此全部單詞須要統一大小寫。   字符串

d.用戶一般但願查「live」時能把含「lives」,「lived」的文章也找出來,因此須要把「lives」,「lived」還原成「live」   get

e.文章中的標點符號一般不表示某種概念,也能夠過濾掉   it

在lucene中以上措施由Analyzer類完成。 通過上面處理後,

文章1的全部關鍵詞爲:[tom] [live] [guangzhou] [i] [live] [guangzhou]     文章2的全部關鍵詞爲:[he] [live] [shanghai]

<2>創建倒排索引

有了關鍵詞後,咱們就能夠創建倒排索引了。上面的對應關係是:「文章號」對「文章中全部關鍵詞」。倒排索引把這個關係倒過來,變成: 「關鍵詞」對「擁有該關鍵詞的全部文章號」。

文章1,2通過倒排後變成   

關鍵詞          文章號   
guangzhou        1   
he               2   
i                1   
live             1,2   
shanghai         2   
tom              1   

 

一般僅知道關鍵詞在哪些文章中出現還不夠,咱們還須要知道關鍵詞在文章中出現次數和出現的位置,一般有兩種位置:

a.字符位置,即記錄該詞是文章中第幾個字符(優勢是關鍵詞亮顯時定位快);

b.關鍵詞位置,即記錄該詞是文章中第幾個關鍵詞(優勢是節約索引空間、詞組(phase)查詢快),lucene中記錄的就是這種位置。   

加上「出現頻率」和「出現位置」信息後,咱們的索引結構變爲:   

 

關鍵詞            文章號[出現頻率]              出現位置   
guangzhou           1[2]                      36   
he                  2[1]                      1   
i                   1[1]                      4   
live                1[2]                      25, 
                    2[1]                      2   
shanghai            2[1]                      3   
tom                 1[1]                      1   

 

以live 這行爲例咱們說明一下該結構:live在文章1中出現了2次,文章2中出現了一次,它的出現位置爲「2,5,2」這表示什麼呢?咱們須要結合文章號和出現頻率來分析,文章1中出現了2次,那麼「2,5」就表示live在文章1中出現的兩個位置,文章2中出現了一次,剩下的「2」就表示live是文章2中第 2個關鍵字。   

以上就是lucene索引結構中最核心的部分。咱們注意到關鍵字是按字符順序排列的(lucene沒有使用B樹結構),所以lucene能夠用二元搜索算法快速定位關鍵詞

<3>實現

實現時,lucene將上面三列分別做爲詞典文件(Term Dictionary)、頻率文件(frequencies)、位置文件 (positions)保存。其中詞典文件不只保存有每一個關鍵詞,還保留了指向頻率文件和位置文件的指針,經過指針能夠找到該關鍵字的頻率信息和位置信息。   

Lucene中使用了field的概念,用於表達信息所在位置(如標題中,文章中,url中),在建索引中,該field信息也記錄在詞典文件中,每一個關鍵詞都有一個field信息(由於每一個關鍵字必定屬於一個或多個field)。

<4>壓縮算法

爲了減少索引文件的大小,Lucene對索引還使用了壓縮技術。

首先,對詞典文件中的關鍵詞進行了壓縮,關鍵詞壓縮爲<前綴長度,後綴>,例如:當前詞爲「阿拉伯語」,上一個詞爲「阿拉伯」,那麼「阿拉伯語」壓縮爲<3,語>。

其次大量用到的是對數字的壓縮,數字只保存與上一個值的差值(這樣能夠減少數字的長度,進而減小保存該數字須要的字節數)。例如當前文章號是16389(不壓縮要用3個字節保存),上一文章號是16382,壓縮後保存7(只用一個字節)。

相關文章
相關標籤/搜索