倒排文件索引(Inverted File Index)的建立
建立索引
目前主流的索引技術(shù)有三種:倒排文件、后綴數(shù)組和簽名。后綴數(shù)組的方法雖然快,但是其維護困難,代價相當高,不適合做引擎的索引。簽名是一種很好的索引方式,但倒排文件的速度和性能已經(jīng)超過了簽名。倒排文件是一種在各大搜索引擎中被主要使用的索引的方式,并且它也是搜索引擎中一個核心的技術(shù)。
5.2.1? 倒排文件索引(Inverted File Index)的建立
倒排索引文件是一種面向單詞的索引機制,每個文件都可以用一系列關(guān)鍵字來表示。一個典型的倒排索引主要由詞匯表(也叫索引項)和事件表(也叫文件鏈表)兩部分組成。詞匯表是用來存放分詞詞典的,通常稱存放詞匯表的文件為索引文件;事件表是用來存放這個文件中對應詞匯表中詞匯出現(xiàn)的位置和次數(shù)的,通常稱存放出現(xiàn)位置的文件為位置文件。
1.倒排文件的建立
(1)順排文件的建立
假設有網(wǎng)頁P1,P2,……,Pn,給每個網(wǎng)頁文件賦予一個編號Pid,給每個關(guān)鍵字賦予一個編號keyi,假設key是網(wǎng)頁文件中的一個關(guān)鍵字,ni表示該關(guān)鍵字在網(wǎng)頁文件中出現(xiàn)的次數(shù),<hit1,hit2,…,hitn>表示該關(guān)鍵字在網(wǎng)頁文件中的位置信息。首先將網(wǎng)頁內(nèi)容切分成一系列關(guān)鍵字:Pi={Key1,key2,…,keyn}。建立以下順排文件:
P1={[n1,Key1(hit1,hit2,…,hitn)],…,[nx,keyi(hit1,hit2,…,hitx)] }
P2={[n1,Key1(hit1,hit2,…,hitn)],…,[nn,keyk(hit1,hit2,…,hitn)] }
…………
Pn={[n1,Key1(hit1,hit2,…,hitn)],…,[ny,keyj(hit1,hit2,…,hity)] }
例如,對以下兩段文字進行順排文件操作。
“隨著經(jīng)濟的發(fā)展,人們對生活的品質(zhì)要求越來越高。特別是在視覺欣賞方面,更是追求精益求精。如何把模糊的圖像變得清晰,把暗淡的色彩變得色彩鮮艷是一個非常值得研究的課題。并且在數(shù)字電視、掃描儀、醫(yī)療圖像、計算機視覺、衛(wèi)星監(jiān)測、航空攝像等方面對圖像的清晰度有著廣泛的需求。目前基于網(wǎng)格和密度的聚類方法已經(jīng)滲透到各個領域,且得到了令人意想不到的效果。本文是將基于網(wǎng)格和密度的聚類方法運用到模糊圖像中,從而對圖像進行增色處理。”
“數(shù)字圖像處理又稱為計算機圖像處理,它是指將圖像信號轉(zhuǎn)換成數(shù)字信號并利用計算機對其進行處理的過程。數(shù)字圖像處理最早出現(xiàn)于20世紀50年代,當時的電子計算機已經(jīng)發(fā)展到一定水平,人們開始利用計算機來處理圖形和圖像信息。數(shù)字圖像處理作為一門學科大約形成于20世紀60年代初期。早期的圖像處理的目的是改善圖像的質(zhì)量,它以人為對象,以改善人的視覺效果為目的。”
假設第一段文字是一個網(wǎng)頁P1的全部內(nèi)容,段首的起始位置為1。第二段文字是第二個網(wǎng)頁P2的全部內(nèi)容,段首的起始位置為1。
對網(wǎng)頁進行自動分詞,得到關(guān)鍵字以及關(guān)鍵字在網(wǎng)頁文件中出現(xiàn)的位置信息。順排文件的結(jié)果為:
P1={[1,經(jīng)濟(3)],[1,發(fā)展(6)],……,[2,視覺(26,93)],……,[5,圖像(46,88,107,177,182)],……,[1,處理(189)]}
P2={[4,數(shù)字(1,29,48,101)],[8,圖像(3,13,21,49,96,103,130,140)],……,[1,視覺(156)],……,[2,目的(135,161)]}
(2)實現(xiàn)倒排文件的原理
順排文件是以網(wǎng)頁來索引關(guān)鍵字的,即形式為(網(wǎng)頁→關(guān)鍵字),不符合搜索引擎的需要。因此,需進行倒排處理,以關(guān)鍵字來索引網(wǎng)頁,即形式為(關(guān)鍵字→網(wǎng)頁):
Keyi→{[Pid1,ni1(hit1,hit2,…,hitni1)],…,[Pidn,nin(hit1,hit2,…,hitnin)]}
對以上順排文件中建立的兩個實例網(wǎng)頁P1和P2的順排文件進行倒排,倒排文件的結(jié)果為:
經(jīng)濟→{[P1,1(3)]}
發(fā)展→{[P1,1(6)],[P2,1(74)]}
……
視覺→{[P1,2(26,93)],[P2,1(156)]}
……
圖像→{[P1,5(46,88,107,177,182)],[P2,8(3,13,21,49,96,103,130,140)]}
……
綜上所述,倒排文件的實現(xiàn)過程是:先得到順排文件,然后根據(jù)順排文件得到倒排文件,從而實現(xiàn)由關(guān)鍵字來索引網(wǎng)頁。
(3)倒排文件的優(yōu)化之一—位圖文件
在實際中,一般索引項并不存儲實際的關(guān)鍵字,而存儲它的一個編號值(kid),這樣可以有效節(jié)約存儲空間。對于文件鏈表(Posting),只存儲網(wǎng)頁文件編號(Pid)和網(wǎng)頁文件編號加上該關(guān)鍵字在文件中出現(xiàn)的位置信息。
其中Pid1,…,Pidn表示包含關(guān)鍵字ki的所有網(wǎng)頁文件集合,考慮到文件鏈表進行布爾運算時,速度不是很快,以及使用文件鏈表要消耗大量內(nèi)存等問題,一般采用位圖(Bitmap)文件來實現(xiàn)倒排索引。Bitmap的優(yōu)點是布爾運算非常快,直接用對應的bit位作運算就可以了。想要得到同時包含某幾個關(guān)鍵字的網(wǎng)頁,那么直接把它們對應的網(wǎng)頁文件位圖向量進行與運算,就可以知道在哪些文件中同時包含了這幾個關(guān)鍵字。在文件數(shù)目不是很多的情況下,只存儲命中信息,實現(xiàn)了命中信息和非命中信息(比如關(guān)鍵字在文件中的位置,關(guān)鍵字在文件中出現(xiàn)的頻率等)的分離,可以大大提高索引的效率。
把由網(wǎng)頁文件向量Pi=<key1,key2,…,keyn>構(gòu)成的“網(wǎng)頁→關(guān)鍵字”,轉(zhuǎn)化成“關(guān)鍵字→網(wǎng)頁”。轉(zhuǎn)換方法是根據(jù)網(wǎng)頁文件向量構(gòu)成“網(wǎng)頁-關(guān)鍵字”陣列,如圖5-2所示,并用Bitmap作為存儲結(jié)構(gòu),形成倒排矩陣A,如圖5-3所示。
倒排矩陣中的Aij元素取值為0,表示網(wǎng)頁Pj中沒有關(guān)鍵字ki;倒排矩陣中的Aij元素取值為1,表示網(wǎng)頁Pj中有關(guān)鍵字ki。以此可以得到包含某關(guān)鍵字的網(wǎng)頁的文件集合,然后根據(jù)文件鏈表得到此關(guān)鍵字在網(wǎng)頁中的出現(xiàn)位置信息。
| ? |
Bitmap文件實現(xiàn)的倒排矩陣在海量數(shù)據(jù)環(huán)境下是比較稀疏的,必須對它進行壓縮,并且保證在解壓的過程中,速度也比較快,這樣可以大大提高索引的性能,也節(jié)省了大量的存儲空間。目前比較成熟的位圖壓縮算法主要有Delta encoding、Variable-length encoding、Gamma codes等。
雖然它們都是比較成熟的算法,但是要么實現(xiàn)起來比較復雜;要么壓縮效率很高,但是解壓的過程要消耗較長的時間,這對于搜索引擎的實時響應要求很高的系統(tǒng)是不適合的。
2.改善倒排文件性能的方法
倒排文件的時間代價主要取決于詞匯表的組織方式,詞匯表文件通常較小且比較固定,對于未登錄詞和數(shù)詞可以按字建索引;倒排文件的空間代價主要取決于對事件表的壓縮能力,事件表的壓縮能減少I/O操作,也能提高部分時間性能。詞匯表文件的組織方式通常采用Hash散列表,按字母表順序有序排列,采用Trie樹、B樹等查找樹。事件表的壓縮通常采用Bitmap文件壓縮或差值壓縮(Delta Compression)詞匯表的哈希存儲,根據(jù)給定的關(guān)鍵字,散列成一個整數(shù),用該整數(shù)作為詞匯的訪問地址。
倒排文件的優(yōu)點是:實現(xiàn)簡單,響應時間快,支持復雜查詢,適合商用搜索引擎。缺點是:建立索引要消耗很大的磁盤、內(nèi)存空間;當網(wǎng)頁更新后,索引的維護代價也比較大
.建立倒排文件索引的舉例——Lucene索引下面講解一個倒排文件索引的例子—Lucene倒排索引。Lucene是一個高性能的Java全文檢索工具包,它使用的是倒排文件索引結(jié)構(gòu)。該結(jié)構(gòu)及相應的生成算法如下。
假設有3篇文章:
文章1的內(nèi)容為:I was a student, i came from chengdu.
文章2的內(nèi)容為:My father is a teacher, and i am a student.
文章3的內(nèi)容為:Chengdu is my hometown. my father’s hometown is wuhan.
Lucene是基于關(guān)鍵字索引和查詢的。首先取得這3篇文章的關(guān)鍵字,通常需要如下處理措施(在Lucene中以下措施由Analyzer類完成):
1)需要把3篇文章的內(nèi)容切分成一個個單詞,作為索引關(guān)鍵字的候選集。英文中單詞與單詞之間有空格,分詞比較好處理,但中文字與字之間沒有空隔,是連在一起的,所以中文分詞處理要麻煩。
2)需要將文章中分離出來的沒有實際意義的單詞過濾掉。比如a、from、and,中文中的“的”、“也”、“啊”等通常無具體含義的詞可以去掉。還要過濾掉標點符號。
3)單詞需要統(tǒng)一大小寫。
4)查找與當前關(guān)鍵字相關(guān)聯(lián)的其他關(guān)鍵字,即統(tǒng)一單詞不同的時態(tài)。如“came”、“coming”統(tǒng)一成“come”,再進行查找。
經(jīng)過上面處理后,3篇文章的所有關(guān)鍵字為:
文章1:[i] [am] [student] [i] [come] [chengdu]
文章2:[my] [father] [is] [teacher] [i] [am] [student]
文章3:[chengdu] [is] [my] [hometown] [my] [father] [hometown] [is] [wuhan]
有了關(guān)鍵字后,就可以建立倒排索引了。上面的對應關(guān)系是順排的,即“文章號→關(guān)鍵字”,倒排處理為“關(guān)鍵字→文章號”。文章1、2、3經(jīng)過倒排后變成如表5-1所示。
表5-1? 倒排文件
| 關(guān)??鍵??字 | 文??章??號 |
| i | 1,2 |
| am | 1,2 |
| student | 1,2 |
| come | 1 |
| chengdu | 1,3 |
| my | 2,3 |
| father | 2,3 |
| is | 2,3 |
| teacher | 2 |
| hometown | 3 |
| wuhan | 3 |
加上“出現(xiàn)頻率”和“出現(xiàn)位置”信息后,索引結(jié)構(gòu)變?yōu)槿绫?-2所示。
表5-2? 索引結(jié)構(gòu)
| 關(guān)??鍵??字 | 文章號[出現(xiàn)頻率] | 出?現(xiàn)?位?置 |
| i | 1[2],2[1] | [1,4,5] |
| am | 1[1],2[1] | [2,6] |
| student | 1[1],2[1] | [3,7] |
| come | 1[1] | [5] |
| chengdu | 1[1],3[1] | [6,1] |
| my | 2[1],3[2] | [1,3,5] |
| father | 2[1],3[1] | [2, 6] |
| is | 2[1],3[2] | [3,2,8] |
| teacher | 2[1] | [4] |
| hometown | 3[2] | [4,7] |
| wuhan | 3[1] | [9] |
以my這行為例來說明一下該結(jié)構(gòu)。my在文章2中出現(xiàn)了1次,文章3中出現(xiàn)了2次,它的出現(xiàn)位置為“1,3,5”,結(jié)合文章號和出現(xiàn)頻率來分析,文章2中出現(xiàn)了1次,那么“1”就表示my在文章2中出現(xiàn)的一個位置,文章3中出現(xiàn)了2次,剩下的“3,5”就表示my是文章3中第3個和第5個關(guān)鍵字。
以上便是Lucene索引結(jié)構(gòu)中最核心的部分。關(guān)鍵字是按字符順序排列的(Lucene沒有使用B樹結(jié)構(gòu)),因此Lucene可以用二元搜索算法快速定位關(guān)鍵字。
實現(xiàn)時Lucene將上面三列分別作為詞典文件(Term Dictionary)、頻率文件(Frequencies Dictionary)、位置文件(Positions Dictionary)保存(將事件表分為兩個文件)。其中詞典文件不僅保存有每個關(guān)鍵字,還保留了指向頻率文件和位置文件的指針,通過指針可以找到該關(guān)鍵字的頻率信息和位置信息。
Lucene中使用了field的概念,用于表達信息所在位置(如標題中、文章中、url中),在建索引中,該field信息也記錄在詞典文件中,每個關(guān)鍵字都有一個field信息(因為每個關(guān)鍵字一定屬于一個或多個field)。
為了減小索引文件的大小,Lucene對索引還使用了壓縮技術(shù)。首先,對詞典文件中的關(guān)鍵字進行了壓縮,關(guān)鍵字壓縮為<前綴長度,后綴>。例如:當前詞為“馬來西亞語”,上一個詞為“馬來西亞”,那么“馬來西亞語”壓縮為<4,語>。其次大量用到的是對數(shù)字的壓縮,數(shù)字只保存與上一個值的差值(這樣可以減小數(shù)字的長度,進而減少保存該數(shù)字需要的字節(jié)數(shù))。例如,當前文章號是14569(不壓縮要用3個字節(jié)保存),上一文章號是145704,壓縮后保存5(只用一個字節(jié))。
總結(jié)
以上是生活随笔為你收集整理的倒排文件索引(Inverted File Index)的建立的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ipsec NAT-T与穿透
- 下一篇: Kalileo中DiagramGroup