在搜索引擎中,數據被爬取后,就會建立index,方便檢索。
在工作中經常會聽到有人問,你這個index是正排的還是倒排的?那么什么是正排呢?什么又是倒排呢?下面是一些簡單的介紹。
網頁A中的內容片段:
Tom is a boy.
Tom is a student too.
網頁B中的內容片段:
Jon works at school.
Tom's teacher is Jon.
正排索引:
正排索引是指文檔ID為key,表中記錄每個關鍵詞出現的次數,查找時掃描表中的每個文檔中字的信息,直到找到所有包含查詢關鍵字的文檔。
假設網頁A的局部文檔ID是 TA, 網頁B的局部文檔ID是 TB。那么對TA進行正排索引建立的表結構是下面這樣的:
從上面的介紹可以看出,正排是以 docid 作為索引的,但是在搜索的時候我們基本上都是用關鍵詞來搜索。所以,試想一下,我們搜一個關鍵字(Tom),當100個網頁的10個網頁含有Tom這個關鍵字。但是由於是正排是doc id 作為索引的,所以我們不得不把100個網頁都掃描一遍,然后找出其中含有Tom的10個網頁。然后再進行rank,sort等。效率就比較低了。尤其當現在網絡上的網頁數已經遠遠超過億這個數量后,這種方式現在並不適合作為搜索的依賴。
不過與之相比的是,正排這種模式容易維護。由於是采用doc 作為key來存儲的,所以新增網頁的時候,只要在末尾新增一個key,然后把詞、詞出現的頻率和位置信息分析完成后就可以使用了。
所有正排的優點是:易維護;缺點是搜索的耗時太長;
倒排索引:
由於正排的耗時太長缺點,倒排就正好相反,是以word作為關鍵索引。表中關鍵字所對應的記錄表項記錄了出現這個字或詞的所有文檔,一個表項就是一個字表段,它記錄該文檔的ID和字符在該文檔中出現的位置情況。
倒排包含兩部分:
1、由不同的索引詞(index term)組成的索引表,稱為“詞典”(lexicon)。其中包含了各種詞匯,以及這些詞匯的統計信息(如出現頻率nDocs),這些統計信息可以直接用於各種排名算法。
2、由每個索引詞出現過的文檔集合,以及命中位置等信息構成。也稱為“記錄表”。就是正排索引產生的那張表。當然這部分可以沒有。具體看自己的業務需求了。
下面是一個簡單的倒排索引構建,只包含第一部分的。
倒排的優缺點和正排的優缺點整好相反。倒排在構建索引的時候較為耗時且維護成本較高,但是搜索耗時短。
初步的介紹就先到這。更深入的研究可以自己搜索一些資料。
參考:
https://blog.csdn.net/zhangzeyuaaa/article/details/48676775
https://blog.csdn.net/GarfieldEr007/article/details/50479074
https://zh.wikipedia.org/zh-hans/%E5%80%92%E6%8E%92%E7%B4%A2%E5%BC%95
https://riteme.github.io/blog/2016-11-29/delta-and-stirling.html(差分序列)