【索引壓縮】前端
信息檢索系統中的兩個主要數據結構:詞典及倒排索引。下面將介紹對這兩個數據結構的各類壓縮技術,這些技術對於構建高效的 IR 系統很是關鍵。 進行壓縮的一個優勢顯而易見:它可以節省磁盤空間。要達到 1∶4 的壓縮比是很是容易的,也就是說能夠下降 75%的索引存儲開銷。算法
索引壓縮還有兩個隱含的優勢。第一是能增長高速緩存(caching)技術的利用率。在搜索 系統中,詞典中某些條目及其索引每每比其餘條目及其索引的使用更頻繁。例如,若是將一個頻 繁使用的查詢詞項 t 的倒排記錄表放到高速緩存中,那麼對僅由 t 構成的查詢進行應答所須要的 計算徹底能夠在內存中完成。若是採用壓縮技術,那麼高速緩存中就能夠放更多的信息。當查詢詞項 t 的信息放在高速緩存時,處理查詢 t 便再也不須要進行磁盤操做,而只需將其倒排記錄表在內存中解壓縮便可。所以,咱們能充分減小 IR 系統的應答時間。因爲內存比磁盤更貴,因此, 相對於磁盤空間的減小,採用高速緩存技術帶來的速度提高是採用壓縮技術的更主要的緣由。 緩存
第二個隱含的優勢是,壓縮可以加快數據從磁盤到內存的傳輸速度。高效的解壓縮算法在現代硬件上運行至關快,這樣將壓縮的數據塊傳輸到內存並解壓所須要的總時間每每會比將未壓縮的數據塊傳輸到內存要快。舉例來講,即便會增長在內存進行解壓縮的開銷,咱們也能夠 經過加載一個小不少的壓縮倒排記錄表來減小 I/O 時間。所以,在大部分狀況下,使用壓縮倒排記錄表的檢索系統會比沒用壓縮的系統的運行速度要快。 數據結構
若是壓縮的主要目的是爲了節省磁盤空間,那麼壓縮算法的速度就不用特別考慮。可是, 若是要提升高速緩存利用率和磁盤到內存的傳輸率,則解壓縮的速度必需要快。本章介紹的壓縮算法都很是高效,均可以達到上面提到的索引壓縮的所有 3 個目標。 編碼
【將詞典當作單一字符串的壓縮方法】spa
採用定長方法來存儲詞項存在着明顯的空間浪費。 一種解決上述缺陷的方法是,將全部的詞項存成一個長字符串,並給每一個詞項增長一個定位指針,它在指向下一詞項的指針同時也標識着 當前詞項的結束。 (就是目前構架中的var_data)指針
實際上,按照詞典順序排序的連續詞項之間每每具備公共前綴。所以,能夠採用一種稱爲前端編碼(front coding)的技術。 公共前綴被識別出來以後,後續的詞項中即可以使用一個特殊的字符來表示這段前綴。blog
【倒排記錄表的壓縮】排序
想象一下在文檔 集中遍歷文檔來尋找某個高頻詞項(如 computer)的過程:咱們會找到一篇包含 computer 的文 檔,而後可能會跳過幾篇不包含它的文檔,以後又會找到另外一篇包含 computer 的文檔。這個過 程能夠不斷循環下去(參見表 5-3)。這裏面最關鍵的思路就是(一些詞項對應的)倒排記錄表 中文檔 ID 之間的間距(gap)不大,所以能夠考慮用比 20 比特短不少的位數來表示它。實際上, 對於一些高頻詞(如 the 和 and)來講,絕大部分間距都是 1。固然,對於只在文檔集中出現一 兩次的罕見詞(如表 5-3 中的 arachnocentric),其間距的數量級和文檔 ID 的數目是同樣的,因 此仍然須要 20 比特。爲了對這種間距分佈的狀況進行空間壓縮,須要使用一種變長編碼方法, 它能夠對短間距採用更短的位數來表示。 索引
【可變字節碼】
VB(Variable byte, 可變字節)編碼利用整數個字節來對間距編碼。字節的後 7 位是間距的有效編碼區,而第 1 位是延續位(continuation bit)。若是該位爲 1,則代表本字節是某個間距編 碼的最後一個字節,不然不是。要對一個可變字節編碼進行解碼,能夠讀入一段字節序列,其中前面的字節的延續位都爲 0,而最後一個字節的延續位爲 1。根據上述標識能夠把每一個字節的 7 位部分抽取出來並鏈接在一塊兒造成編碼。