簡單理解倒排索引

倒排索引是整個搜索系統的核心,上一篇中討論了關係型數據庫不適合作全文檢索。本文討論討論3個問題,咱們常說的文檔是指什麼,正排索引是什麼,倒排索引是什麼。算法

 

1、文檔(document)數據庫

 

若是拿數據庫來比較的話,在數據庫中一行數據表明一條完整的信息。solr是一個文檔類型的存儲和檢索引擎,因此solr處理的每一條的數據都是一個文檔(document),這個文檔能夠是一篇文章文章,一個簡歷,或者一整本書。微信

 

在數據庫中,使用column來定義一列數據,一樣在solr中使用field來定義具備相同屬性的數據。一個文檔能夠有一個或者多個field。post

 

數據庫中,每個column須要定義一個類型,number,varchar等。一樣在solr中,這些field須要一個type:string ,tokenized text,Boolean,date/time,long等。solr須要知道如何去處理她收到的內容。學習

 

solr中一個文檔的定義搜索引擎

 

solr和數據庫作了一個對比,到此咱們有些好奇,solr仍然須要定義field,定義field type,如何體現它的非結構化的索引與查詢呢。blog

 

微觀上看,搜索引擎仍然須要咱們數據進行歸類,抽取共同點來建索引。好比要給10w本電子書建立一個索引,須要剝離出書名,做者,出版年份,內容等。但從宏觀上看,搜索引擎只是須要這些信息來建立索引,提供查詢,而真正的內容或者說整個文檔(document)仍然是以一個文件的形式存儲在磁盤中的。索引

 

2、正排索引token

 

部份內容摘自《走進搜索引擎》文檔

 

假定存在文檔docId=1 內容是「走進搜索引擎,學習搜索引擎」,分詞結果爲「走進/搜索引擎/學習/搜索引擎」。

獲得以下索引結構

結論:正排索引是經過文檔編號去查找索引詞,找到對應的文檔。全文檢索是經過關鍵詞來檢索,因此正排索引不能知足全文檢索的要求。

 

3、倒排索引

 

依然使用「buying a home」 的例子

 

若是存在一個右邊這樣子的字典(字典裏面會有一些處理,好比buy = buying,purchase = buy),在查找時找到這些詞對應的文檔編號,最後作並集運算,就能夠查找出所有的文檔。

 

這種以關鍵詞和文檔編號集合,鍵的索引結構稱之爲倒排索引

 

倒排索引分爲兩個部分

 

1)不一樣索引詞(index term)組成的索引表,稱爲「詞典」(lexicon),其中保存了各類詞彙,以及這些詞彙的統計信息(例如出現的頻率),這些信息用於各類排名算法(Ranking Algorithm)[Salton 1989;witten 1994]

 

2)由每一個索引詞出現過的文檔集合,以及命中位置等信息構成,也稱爲記錄表(posting file)或者記錄列表(posting list)。

上例中的倒排索引表結構以下:

抽象以下:

名詞解釋

wordId:索引詞ID號

nDocs:匹配該索引詞的文檔的數量

偏移量:文檔在記錄文件內的偏移量

docId:文檔編號

NHits:某個索引詞在文檔中出現的次數

HitList:某個索引詞在文檔中出現的位置,即相對於正文的偏移量

 

總結:

正排索引能夠理解成一個定義在文檔空間到索引詞組空間的一個映射,任意一個文檔對應惟一的一組索引詞

 

倒排索引能夠理解成一個定義在索引詞空間到文檔組空間的一個映射,任意一個索引詞對應惟一的一組該索引詞命中的文檔

 

因此順着文檔—>正排索引—>倒排索引這個過程能夠實現一個索引詞能經過倒排索引找到其命中的文檔,

以及位置信息便可實現全文檢索

 

 

預告:solr是如何使用倒排索引進行索引和查詢的

獲取最新的文章可關注微信公衆號

相關文章
相關標籤/搜索