(轉(zhuǎn)載)倒排索引基礎(chǔ)知識

1.單詞——文檔矩陣

單詞-文檔矩陣是表達兩者之間所具有的一種包含關(guān)系的概念模型,圖3-1展示了其含義允睹。圖3-1的每列代表一個文檔,每行代表一個單詞,打?qū)吹奈恢么戆P(guān)系吉拳。

從縱向即文檔這個維度來看,每列代表文檔包含了哪些單詞适揉,比如文檔1包含了詞匯1和詞匯4留攒,而不包含其它單詞。從橫向即單詞這個維度來看嫉嘀,每行代表了哪些文檔包含了某個單詞炼邀。比如對于詞匯1來說,文檔1和文檔4中出現(xiàn)過單詞1剪侮,而其它文檔不包含詞匯1汤善。矩陣中其它的行列也可作此種解讀。

搜索引擎的索引其實就是實現(xiàn)“單詞-文檔矩陣”的具體數(shù)據(jù)結(jié)構(gòu)票彪『斓可以有不同的方式來實現(xiàn)上述概念模型,比如“倒排索引”降铸、“簽名文件”在旱、“后綴樹”等方式。但是各項實驗數(shù)據(jù)表明推掸,“倒排索引”是實現(xiàn)單詞到文檔映射關(guān)系的最佳實現(xiàn)方式桶蝎,所以本章主要介紹“倒排索引”的技術(shù)細節(jié)。

2.倒排索引基本概念

文檔(Document):一般搜索引擎的處理對象是互聯(lián)網(wǎng)網(wǎng)頁谅畅,而文檔這個概念要更寬泛些登渣,代表以文本形式存在的存儲對象,相比網(wǎng)頁來說毡泻,涵蓋更多種形式胜茧,比如Word,PDF仇味,html呻顽,XML等不同格式的文件都可以稱之為文檔。再比如一封郵件丹墨,一條短信廊遍,一條微博也可以稱之為文檔。在本書后續(xù)內(nèi)容贩挣,很多情況下會使用文檔來表征文本信息喉前。

文檔集合(Document Collection):由若干文檔構(gòu)成的集合稱之為文檔集合。比如海量的互聯(lián)網(wǎng)網(wǎng)頁或者說大量的電子郵件都是文檔集合的具體例子王财。

文檔編號(Document ID):在搜索引擎內(nèi)部卵迂,會將文檔集合內(nèi)每個文檔賦予一個唯一的內(nèi)部編號,以此編號來作為這個文檔的唯一標識搪搏,這樣方便內(nèi)部處理狭握,每個文檔的內(nèi)部編號即稱之為“文檔編號”,后文有時會用DocID來便捷地代表文檔編號疯溺。

單詞編號(Word ID):與文檔編號類似论颅,搜索引擎內(nèi)部以唯一的編號來表征某個單詞,單詞編號可以作為某個單詞的唯一表征囱嫩。

倒排索引(Inverted Index):倒排索引是實現(xiàn)“單詞-文檔矩陣”的一種具體存儲形式恃疯,通過倒排索引,可以根據(jù)單詞快速獲取包含這個單詞的文檔列表墨闲。倒排索引主要由兩個部分組成:“單詞詞典”和“倒排文件”今妄。

單詞詞典(Lexicon):搜索引擎的通常索引單位是單詞,單詞詞典是由文檔集合中出現(xiàn)過的所有單詞構(gòu)成的字符串集合,單詞詞典內(nèi)每條索引項記載單詞本身的一些信息以及指向“倒排列表”的指針盾鳞。

倒排列表(PostingList):倒排列表記載了出現(xiàn)過某個單詞的所有文檔的文檔列表及單詞在該文檔中出現(xiàn)的位置信息犬性,每條記錄稱為一個倒排項(Posting)。根據(jù)倒排列表腾仅,即可獲知哪些文檔包含某個單詞乒裆。

倒排文件(Inverted File):所有單詞的倒排列表往往順序地存儲在磁盤的某個文件里,這個文件即被稱之為倒排文件推励,倒排文件是存儲倒排索引的物理文件鹤耍。

關(guān)于這些概念之間的關(guān)系,通過圖3-2可以比較清晰的看出來验辞。

3.倒排索引簡單實例

倒排索引從邏輯結(jié)構(gòu)和基本思路上來講非常簡單稿黄。下面我們通過具體實例來進行說明,使得讀者能夠?qū)Φ古潘饕幸粋€宏觀而直接的感受跌造。

假設(shè)文檔集合包含五個文檔杆怕,每個文檔內(nèi)容如圖3-3所示,在圖中最左端一欄是每個文檔對應(yīng)的文檔編號鼻听。我們的任務(wù)就是對這個文檔集合建立倒排索引财著。

中文和英文等語言不同,單詞之間沒有明確分隔符號撑碴,所以首先要用分詞系統(tǒng)將文檔自動切分成單詞序列撑教。這樣每個文檔就轉(zhuǎn)換為由單詞序列構(gòu)成的數(shù)據(jù)流,為了系統(tǒng)后續(xù)處理方便醉拓,需要對每個不同的單詞賦予唯一的單詞編號伟姐,同時記錄下哪些文檔包含這個單詞,在如此處理結(jié)束后亿卤,我們可以得到最簡單的倒排索引(參考圖3-4)愤兵。在圖3-4中,“單詞ID”一欄記錄了每個單詞的單詞編號排吴,第二欄是對應(yīng)的單詞秆乳,第三欄即每個單詞對應(yīng)的倒排列表。比如單詞“谷歌”钻哩,其單詞編號為1屹堰,倒排列表為{1,2,3,4,5},說明文檔集合中每個文檔都包含了這個單詞街氢。

之所以說圖3-4所示倒排索引是最簡單的扯键,是因為這個索引系統(tǒng)只記載了哪些文檔包含某個單詞,而事實上珊肃,索引系統(tǒng)還可以記錄除此之外的更多信息荣刑。圖3-5是一個相對復(fù)雜些的倒排索引馅笙,與圖3-4的基本索引系統(tǒng)比,在單詞對應(yīng)的倒排列表中不僅記錄了文檔編號厉亏,還記載了單詞頻率信息(TF)董习,即這個單詞在某個文檔中的出現(xiàn)次數(shù),之所以要記錄這個信息叶堆,是因為詞頻信息在搜索結(jié)果排序時阱飘,計算查詢和文檔相似度是很重要的一個計算因子,所以將其記錄在倒排列表中虱颗,以方便后續(xù)排序時進行分值計算。在圖3-5的例子里蔗喂,單詞“創(chuàng)始人”的單詞編號為7忘渔,對應(yīng)的倒排列表內(nèi)容為:(3:1),其中的3代表文檔編號為3的文檔包含這個單詞缰儿,數(shù)字1代表詞頻信息畦粮,即這個單詞在3號文檔中只出現(xiàn)過1次,其它單詞對應(yīng)的倒排列表所代表含義與此相同乖阵。

實用的倒排索引還可以記載更多的信息宣赔,圖3-6所示索引系統(tǒng)除了記錄文檔編號和單詞頻率信息外,額外記載了兩類信息瞪浸,即每個單詞對應(yīng)的“文檔頻率信息”(對應(yīng)圖3-6的第三欄)以及在倒排列表中記錄單詞在某個文檔出現(xiàn)的位置信息儒将。

                    ![](http://upload-images.jianshu.io/upload_images/6910659-fa6232d9abb019f8.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

“文檔頻率信息”代表了在文檔集合中有多少個文檔包含某個單詞,之所以要記錄這個信息对蒲,其原因與單詞頻率信息一樣钩蚊,這個信息在搜索結(jié)果排序計算中是非常重要的一個因子。而單詞在某個文檔中出現(xiàn)的位置信息并非索引系統(tǒng)一定要記錄的蹈矮,在實際的索引系統(tǒng)里可以包含砰逻,也可以選擇不包含這個信息,之所以如此泛鸟,因為這個信息對于搜索系統(tǒng)來說并非必需的蝠咆,位置信息只有在支持“短語查詢”的時候才能夠派上用場。

以單詞“拉斯”為例北滥,其單詞編號為8刚操,文檔頻率為2,代表整個文檔集合中有兩個文檔包含這個單詞碑韵,對應(yīng)的倒排列表為:{(3;1;<4>)赡茸,(5;1;<4>)},其含義為在文檔3和文檔5出現(xiàn)過這個單詞,單詞頻率都為1祝闻,單詞“拉斯”在兩個文檔中的出現(xiàn)位置都是4占卧,即文檔中第四個單詞是“拉斯”遗菠。

圖3-6所示倒排索引已經(jīng)是一個非常完備的索引系統(tǒng),實際搜索系統(tǒng)的索引結(jié)構(gòu)基本如此华蜒,區(qū)別無非是采取哪些具體的數(shù)據(jù)結(jié)構(gòu)來實現(xiàn)上述邏輯結(jié)構(gòu)辙纬。

有了這個索引系統(tǒng),搜索引擎可以很方便地響應(yīng)用戶的查詢叭喜,比如用戶輸入查詢詞“Facebook”贺拣,搜索系統(tǒng)查找倒排索引,從中可以讀出包含這個單詞的文檔捂蕴,這些文檔就是提供給用戶的搜索結(jié)果譬涡,而利用單詞頻率信息、文檔頻率信息即可以對這些候選搜索結(jié)果進行排序啥辨,計算文檔和查詢的相似性涡匀,按照相似性得分由高到低排序輸出,此即為搜索系統(tǒng)的部分內(nèi)部流程溉知,具體實現(xiàn)方案本書第五章會做詳細描述陨瘩。

4. 單詞詞典

單詞詞典是倒排索引中非常重要的組成部分,它用來維護文檔集合中出現(xiàn)過的所有單詞的相關(guān)信息级乍,同時用來記載某個單詞對應(yīng)的倒排列表在倒排文件中的位置信息舌劳。在支持搜索時,根據(jù)用戶的查詢詞玫荣,去單詞詞典里查詢甚淡,就能夠獲得相應(yīng)的倒排列表,并以此作為后續(xù)排序的基礎(chǔ)崇决。

對于一個規(guī)模很大的文檔集合來說材诽,可能包含幾十萬甚至上百萬的不同單詞,能否快速定位某個單詞恒傻,這直接影響搜索時的響應(yīng)速度脸侥,所以需要高效的數(shù)據(jù)結(jié)構(gòu)來對單詞詞典進行構(gòu)建和查找,常用的數(shù)據(jù)結(jié)構(gòu)包括哈希加鏈表結(jié)構(gòu)和樹形詞典結(jié)構(gòu)盈厘。
4.1 哈希加鏈表
圖1-7是這種詞典結(jié)構(gòu)的示意圖睁枕。這種詞典結(jié)構(gòu)主要由兩個部分構(gòu)成:

主體部分是哈希表,每個哈希表項保存一個指針沸手,指針指向沖突鏈表外遇,在沖突鏈表里,相同哈希值的單詞形成鏈表結(jié)構(gòu)契吉。之所以會有沖突鏈表跳仿,是因為兩個不同單詞獲得相同的哈希值,如果是這樣捐晶,在哈希方法里被稱做是一次沖突菲语,可以將相同哈希值的單詞存儲在鏈表里妄辩,以供后續(xù)查找。


在建立索引的過程中山上,詞典結(jié)構(gòu)也會相應(yīng)地被構(gòu)建出來眼耀。比如在解析一個新文檔的時候,對于某個在文檔中出現(xiàn)的單詞T佩憾,首先利用哈希函數(shù)獲得其哈希值哮伟,之后根據(jù)哈希值對應(yīng)的哈希表項讀取其中保存的指針,就找到了對應(yīng)的沖突鏈表妄帘。如果沖突鏈表里已經(jīng)存在這個單詞楞黄,說明單詞在之前解析的文檔里已經(jīng)出現(xiàn)過。如果在沖突鏈表里沒有發(fā)現(xiàn)這個單詞寄摆,說明該單詞是首次碰到谅辣,則將其加入沖突鏈表里。通過這種方式婶恼,當文檔集合內(nèi)所有文檔解析完畢時,相應(yīng)的詞典結(jié)構(gòu)也就建立起來了柏副。

在響應(yīng)用戶查詢請求時勾邦,其過程與建立詞典類似,不同點在于即使詞典里沒出現(xiàn)過某個單詞割择,也不會添加到詞典內(nèi)眷篇。以圖1-7為例,假設(shè)用戶輸入的查詢請求為單詞3荔泳,對這個單詞進行哈希蕉饼,定位到哈希表內(nèi)的2號槽,從其保留的指針可以獲得沖突鏈表玛歌,依次將單詞3和沖突鏈表內(nèi)的單詞比較昧港,發(fā)現(xiàn)單詞3在沖突鏈表內(nèi)贝室,于是找到這個單詞娇掏,之后可以讀出這個單詞對應(yīng)的倒排列表來進行后續(xù)的工作,如果沒有找到這個單詞瞎访,說明文檔集合內(nèi)沒有任何文檔包含單詞值朋,則搜索結(jié)果為空叹侄。

4.2 樹形結(jié)構(gòu)
B樹(或者B+樹)是另外一種高效查找結(jié)構(gòu),圖1-8是一個 B樹結(jié)構(gòu)示意圖昨登。B樹與哈希方式查找不同趾代,需要字典項能夠按照大小排序(數(shù)字或者字符序),而哈希方式則無須數(shù)據(jù)滿足此項要求丰辣。
B樹形成了層級查找結(jié)構(gòu)撒强,中間節(jié)點用于指出一定順序范圍的詞典項目存儲在哪個子樹中禽捆,起到根據(jù)詞典項比較大小進行導(dǎo)航的作用,最底層的葉子節(jié)點存儲單詞的地址信息尿褪,根據(jù)這個地址就可以提取出單詞字符串睦擂。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市杖玲,隨后出現(xiàn)的幾起案子顿仇,更是在濱河造成了極大的恐慌,老刑警劉巖摆马,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件臼闻,死亡現(xiàn)場離奇詭異,居然都是意外死亡囤采,警方通過查閱死者的電腦和手機述呐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蕉毯,“玉大人乓搬,你說我怎么就攤上這事〈海” “怎么了进肯?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長棉磨。 經(jīng)常有香客問我江掩,道長,這世上最難降的妖魔是什么乘瓤? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任环形,我火速辦了婚禮,結(jié)果婚禮上衙傀,老公的妹妹穿的比我還像新娘抬吟。我一直安慰自己,他們只是感情好差油,可當我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布拗军。 她就那樣靜靜地躺著,像睡著了一般蓄喇。 火紅的嫁衣襯著肌膚如雪发侵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天妆偏,我揣著相機與錄音刃鳄,去河邊找鬼。 笑死钱骂,一個胖子當著我的面吹牛叔锐,可吹牛的內(nèi)容都是我干的挪鹏。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼愉烙,長吁一口氣:“原來是場噩夢啊……” “哼讨盒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起步责,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤返顺,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蔓肯,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體遂鹊,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年蔗包,在試婚紗的時候發(fā)現(xiàn)自己被綠了秉扑。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡调限,死狀恐怖舟陆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情耻矮,我是刑警寧澤吨娜,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站淘钟,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏陪毡。R本人自食惡果不足惜米母,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望毡琉。 院中可真熱鬧铁瞒,春花似錦、人聲如沸桅滋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽丐谋。三九已至芍碧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間号俐,已是汗流浹背泌豆。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留吏饿,地道東北人踪危。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓蔬浙,卻偏偏與公主長得像,于是被迫代替她去往敵國和親贞远。 傳聞我的和親對象是個殘疾皇子畴博,可洞房花燭夜當晚...
    茶點故事閱讀 45,515評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 見其名知其意,有倒排索引蓝仲,對應(yīng)肯定俱病,有正向索引。正向索引(forward index)杂曲,反向索引(inverted...
    時待吾閱讀 1,070評論 0 0
  • 這個系列的第六個主題庶艾,主要談一些搜索引擎相關(guān)的常見技術(shù)。 1995年是搜索引擎商業(yè)公司發(fā)展的重要起點擎勘,《淺談推薦系...
    我偏笑_NSNirvana閱讀 6,636評論 3 24
  • 眾所周知咱揍,“索引”是搜索引擎中最重要的核心技術(shù)之一,是“縮小搜索范圍棚饵,以提高結(jié)果定位效率”的技術(shù)擔當煤裙。 按照不同劃...
    橘色對白閱讀 9,132評論 3 12
  • 背景 在關(guān)系型數(shù)據(jù)庫中,索引是檢索數(shù)據(jù)的最有效率方式噪漾,但是在海量的數(shù)據(jù)中硼砰,需要實時檢索數(shù)據(jù)的時候,關(guān)系型數(shù)據(jù)庫的索...
    ninetyhe_閱讀 12,851評論 1 26
  • 圖文/劉懶懶 蔡瀾說“我從來不“養(yǎng)生”欣硼,而是先把心養(yǎng)好题翰,而養(yǎng)好心,最簡單的辦法就是吃很多你喜歡吃的東西诈胜,保持精神抖...
    少女哪吒劉懶懶閱讀 370評論 0 1