倒排索引

轉自:http://blog.csdn.net/sunboy_2050/article/details/5658427

簡介

  倒排索引源於實際應用中需要根據屬性的值來查找記錄。這種索引表中的每一項都包括一個屬性值和具有該屬性值的各記錄的地址。由於不是由記錄來確定屬性值,而是由屬性值來確定記錄的位置,因而稱爲倒排索引(inverted index)。帶有倒排索引的文件我們稱爲倒排索引文件,簡稱倒排文件(inverted file)。

 

用途
  倒排文件(倒排索引),索引對象是文檔或者文檔集合中的單詞等,用來存儲這些單詞在一個文檔或者一組文檔中的存儲位置,是對文檔或者文檔集合的一種最常用的索引機制。

 

原理
  Lucene倒排索引原理 
  Lucene是一個高性能的java全文檢索工具包,它使用的是倒排文件索引結構。該結構及相應的生成算法如下: 
  0)設有兩篇文章1和2 
  文章1的內容爲:Tom lives in Guangzhou,I live in Guangzhou too. 
  文章2的內容爲:He once lived in Shanghai.
取得關鍵詞
  1)由於lucene是基於關鍵詞索引和查詢的,首先我們要取得這兩篇文章的關鍵詞,通常我們需要如下處理措施 
  a.我們現在有的是文章內容,即一個字符串,我們先要找出字符串中的所有單詞,即分詞。英文單詞由於用空格分隔,比較好處理。中文單詞間是連在一起的需要特殊的分詞處理。 
  b.文章中的”in”, “once” “too”等詞沒有什麼實際意義,中文中的“的”“是”等字通常也無具體含義,這些不代表概念的詞可以過濾掉 
  c.用戶通常希望查“He”時能把含“he”,“HE”的文章也找出來,所以所有單詞需要統一大小寫。 
  d.用戶通常希望查“live”時能把含“lives”,“lived”的文章也找出來,所以需要把“lives”,“lived”還原成“live” 
  e.文章中的標點符號通常不表示某種概念,也可以過濾掉 
  在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] 3,6 
  he 2[1] 1 
  i 1[1] 4 
  live 1[2],2[1] 2,5,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可以用二元搜索算法快速定位關鍵詞。

 

實現
  實現時 lucene將上面三列分別作爲詞典文件(Term Dictionary)、頻率文件(frequencies)、位置文件 (positions)保存。其中詞典文件不僅保存有每個關鍵詞,還保留了指向頻率文件和位置文件的指針,通過指針可以找到該關鍵字的頻率信息和位置信息。 
  Lucene中使用了field的概念,用於表達信息所在位置(如標題中,文章中,url中),在建索引中,該field信息也記錄在詞典文件中,每個關鍵詞都有一個field信息(因爲每個關鍵字一定屬於一個或多個field)。

 

壓縮算法
  爲了減小索引文件的大小,Lucene對索引還使用了壓縮技術。首先,對詞典文件中的關鍵詞進行了壓縮,關鍵詞壓縮爲<前綴長度,後綴>,例如:當前詞爲“阿拉伯語”,上一個詞爲“阿拉伯”,那麼“阿拉伯語”壓縮爲<3,語>。其次大量用到的是對數字的壓縮,數字只保存與上一個值的差值(這樣可以減小數字的長度,進而減少保存該數字需要的字節數)。例如當前文章號是16389(不壓縮要用3個字節保存),上一文章號是16382,壓縮後保存7(只用一個字節)。

 

應用原因
  下面我們可以通過對該索引的查詢來解釋一下爲什麼要建立索引。 
  假設要查詢單詞 “live”,lucene先對詞典二元查找、找到該詞,通過指向頻率文件的指針讀出所有文章號,然後返回結果。詞典通常非常小,因而,整個過程的時間是毫秒級的。 
  而用普通的順序匹配算法,不建索引,而是對所有文章的內容進行字符串匹配,這個過程將會相當緩慢,當文章數目很大時,時間往往是無法忍受的。

 

轉載聲明: 本文轉自 http://baike.baidu.com/view/676861.htm?fr=ala0_1_1(百度百科)

=================================================================================

 

倒排索引介紹

 

倒排索引是一種面向單詞的索引機制,利用它可以提高檢索時的速度。通常情況下,倒排索引結構由“詞典”和“出現情況”兩部分組成。對於每一個單詞,都會有一 個詞彙列表記錄單詞在所有文檔中出現的位置,這些位置可以是單詞的位置(文本中的第幾個單詞)也可以是字符的位置(文本中的第幾個字符)。

如果使用正常的索引結構,建立的是“文檔到單詞”的映射關係,在使用倒排索引技術後,建立的是“單詞到文檔”的映射關係,那麼這兩種映射關係到底有何不同呢?它們各自有什麼有缺點呢?下面舉例向大家說明這兩種映射關係的差別。

假設現在有兩篇文檔:文檔A和文檔B。文檔A的內容是:This is a dog。文檔B的內容是:The dog is a kind of animal。

下面對這兩個文檔建立索引結構。

注意:在這裏只是爲了介紹倒排索引與一般索引的區別,真正的索引格式會比此處介紹得複雜很多。

如果建立的是一般的索引結構,那麼會有如表8-1所示的關係。

從中可以看出,一般的索引結構是以文檔爲標準建立索引結構的,即它記錄的是一篇文檔中所有單詞出現的情況。比如在文檔B中dog,kind,animal均出現了一次。然而,用戶在進行檢索時,都是輸入關鍵字進行查詢,如果使用這種索引結構,在查詢某一關鍵字時往往需要遍歷所有的索引,當索引量非常大時,效率會成爲一個很大的問題。

倒排索引恰恰解決了這個問題,它是以關鍵字爲標準建立索引的。

從表8-2可以看出,倒排索引是以單詞爲標準建立的索引結構,它描述了一個單詞在所有文檔中的出現情況,比如說單詞“dog”在文檔A和文檔B中分別出現了一次,而單詞“kind”只在文檔B中出現了一次。

通過比較可以發現,一般的索引結構建立的是一種“文檔到單詞”的映射關係,而倒排索引建立的則是一種“單詞到文檔”的映射關係。因爲在日常的檢索中,通常都是按照關鍵字進行搜索的,所以,倒排索引可以更好地適合這種檢索機制的需要。這也是倒排索引如今被大規模使用的原因

 

 

轉載聲明: 本文轉自 http://hi.baidu.com/nullzone/blog/item/b0a432df4a823a1149540327.html(百度Hi)

=================================================================================

 

倒排索引,反向索引

 

倒排索引(英語:Inverted index),也常被稱爲反向索引、置入檔案或反向檔案,是一種索引方法,被用來存儲在全文搜索下某個單詞在一個文檔或者一組文檔中的存儲位置的映射。它是文檔檢索系統中最常用的數據結構。

有兩種不同的反向索引形式:
一條記錄的水平反向索引(或者反向檔案索引)包含每個引用單詞的文檔的列表。
一個單詞的水平反向索引(或者完全反向索引)又包含每個單詞在一個文檔中的位置。

後者的形式提供了更多的兼容性(比如短語搜索),但是需要更多的時間和空間來創建。

例子

以英文爲例,下面是要被索引的文本:
T0 = "it is what it is" 
T1 = "what is it" 
T2 = "it is a banana" 

我們就能得到下面的反向文件索引:
 "a":      {2}
 "banana": {2}
 "is":     {0, 1, 2}
 "it":     {0, 1, 2}
 "what":   {0, 1}

檢索的條件"what", "is" 和 "it" 將對應這個集合:。

對相同的文字,我們得到後面這些完全反向索引,有文檔數量和當前查詢的單詞結果組成的的成對數據。 同樣,文檔數量和當前查詢的單詞結果都從零開始。所以,"banana": {(2, 3)} 就是說 "banana"在第三個文檔裏 (T2),而且在第三個文檔的位置是第四個單詞(地址爲 3)。
"a":      {(2, 2)}
"banana": {(2, 3)}
"is":     {(0, 1), (0, 4), (1, 1), (2, 1)}
"it":     {(0, 0), (0, 3), (1, 2), (2, 0)} 
"what":   {(0, 2), (1, 0)}

如果我們執行短語搜索"what is it" 我們得到這個短語的全部單詞各自的結果所在文檔爲文檔0和文檔1。但是這個短語檢索的連續的條件僅僅在文檔1得到。

 

轉載聲明: 本文轉自http://seraph115.javaeye.com/blog/378879 (JavaEye博客)

=================================================================================

 

關於倒排索引、倒排表

 

在搜索引擎實際的應用之中,有時需要按照關鍵字的某些值查找記錄,所以我們是按照關鍵字建立索引,這個索引我們就稱之爲——倒排索引,而帶有倒排索引的文件我們又稱作——倒排索引文件,也可以叫它爲——倒排文件,來實現快速的檢索與高速的效率。

倒排文件:用記錄的非主屬性值(也叫副鍵)來查找記錄而組織的文件叫倒排文件,即次索引。

倒排文件中包括了所有副鍵值,並列出了與之有關的所有記錄主鍵值,主要用於複雜查詢。

用記錄的非主屬性值(也叫副鍵)來查找記錄而組織的文件叫倒排文件,即次索引。

倒排文件中包括了所有副鍵值,並列出了與之有關的所有記錄主鍵值,主要用於複雜查詢。

其主要優點是:

在處理複雜的多關鍵字查詢時,可在倒排表中先完成查詢的交、並等邏輯運算,得到結果後再對記錄進行存取。

這樣不必對每個記錄隨機存取,把對記錄的查詢轉換爲地址集合的運算,從而提高查找速度!

 

轉載聲明: 本文轉自http://blog.sina.com.cn/s/blog_465f50b90100fqko.html (新浪博客)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章