这就是搜索引擎--读书笔记五--索引的建立与更新
索引的建立和更新
索引的建立
前一總結(jié)里說到,如果索引結(jié)構(gòu)建立好了,可以提高搜索的速度,那么給定一個(gè)文檔集合,索引是如何建立起來的呢?建立索引的方式有很多種,在這里我就書中提到的三種方法簡(jiǎn)單總結(jié)一下。
兩遍文檔遍歷法
- 第一次文檔遍歷
第一次掃描文檔集合時(shí),并沒有立即開始建立索引,而是收集一些的統(tǒng)計(jì)信息,比如文檔集合包含的文檔個(gè)數(shù)N、文檔集合內(nèi)包含的不同單詞個(gè)數(shù)M以及每個(gè)單詞在哪些文檔中出現(xiàn)過的信息DF等等。將所有單詞對(duì)應(yīng)的DF值全部相加,就可以知道建立最終的索引需要多少內(nèi)存了,然后在內(nèi)存中將連續(xù)存儲(chǔ)區(qū)劃分成不同大小的片段,詞典內(nèi)某個(gè)單詞根據(jù)自己對(duì)應(yīng)的DF信息,可以通過指針指向?qū)儆谧约旱膬?nèi)存片段的起始位置和終止位置 , 這樣在第二遍掃描中,這個(gè)單詞對(duì)應(yīng)的倒排列表信息會(huì)被填充進(jìn)這個(gè)片段中。
- 第二次文檔遍歷
這一次掃描的時(shí)候,就開始真正建立每個(gè)單詞的倒排列表信息了,即對(duì)每個(gè)單詞來說,獲得包含這個(gè)單詞的每個(gè)文檔的文檔ID,以及這個(gè)單詞在文檔中出現(xiàn)的次數(shù),這樣就可以不斷填充第一次遍歷掃描所分配的內(nèi)存空間。當(dāng)然,如果要記錄單詞在文檔中出現(xiàn)的位置也是可以的,第一次掃描中分配內(nèi)存時(shí)加上這個(gè)位置信息就可以了。
值得注意的是:此方法完全是在內(nèi)存里完成索引的創(chuàng)建過程的,而后面兩種方法則是通過內(nèi)存和磁盤相互配合來完成索引建立任務(wù)的。而正因?yàn)閯?chuàng)建索引是在內(nèi)存中完成的,所以就要求內(nèi)存一定要足夠大,否則文檔集合太大的話,內(nèi)存不能夠滿足需求。而對(duì)文檔集合進(jìn)行兩遍掃描,所以從速度上相比后面兩種方法不占優(yōu)勢(shì)。
排序法
排序法在建立索引的過程中,始終在內(nèi)存中分配固定大小的空間用來存放詞典信息和索引的中間結(jié)果,當(dāng)分配的空間被消耗光的時(shí)候,把中間結(jié)果寫入磁盤,清空內(nèi)存里中間結(jié)果所占的空間,以用作下一輪存放索引中間結(jié)果的存儲(chǔ)區(qū)。這種情況下,可以把內(nèi)存看做驛站,它只是一個(gè)中間轉(zhuǎn)折點(diǎn)。這種方法分為兩個(gè)步驟:中間結(jié)果內(nèi)存排序和合并中間結(jié)果。
為什么要進(jìn)行排序呢?主要是為了方便后續(xù)的處理。因?yàn)樵谛纬芍虚g結(jié)果文件前,已經(jīng)按照單詞ID和文檔ID進(jìn)行了排序,所以進(jìn)入內(nèi)存緩沖區(qū)的數(shù)據(jù)都是已經(jīng)排好序的,合并過程中,將不同緩沖區(qū)中包含同一個(gè)單詞ID的信息進(jìn)行合并,如果某個(gè)單詞ID的所有信息全部合并完成,那么說明這個(gè)單詞的倒排列表已經(jīng)構(gòu)建完成了,將其寫入最終索引中,同時(shí)將各個(gè)緩沖區(qū)中對(duì)應(yīng)這個(gè)單詞ID信息清空。就這樣一直往下進(jìn)行,直到所有的單詞ID對(duì)應(yīng)的倒排列表都已經(jīng)創(chuàng)建完成。最后的結(jié)果,就是最終的索引文件。
歸并法
由于排序法有一個(gè)不足之處,那就是在將中間結(jié)果寫入磁盤的時(shí)候,詞典信息一直在內(nèi)存中進(jìn)行維護(hù),這樣也會(huì)占據(jù)一部分的內(nèi)存。歸并法就是對(duì)排序法做出了改進(jìn),即每次將內(nèi)存中數(shù)據(jù)寫入磁盤時(shí),包括詞典在內(nèi)的所有中間結(jié)果信息都被寫入磁盤,這樣內(nèi)存所有內(nèi)容都可以被清空。
歸并法整體流程也是分為兩個(gè)大的階段,首先在內(nèi)存里維護(hù)中間結(jié)果,當(dāng)內(nèi)存占滿時(shí),將內(nèi)存數(shù)據(jù)寫入磁盤臨時(shí)文件,第二階段對(duì)臨時(shí)文件進(jìn)行歸并形成最終索引。
歸并法和排序法的區(qū)別
首先,排序法在內(nèi)存中存放的是詞典信息和三元組數(shù)據(jù)(單詞ID,文檔ID,單詞頻率),在建立索引的過程中,詞典和三元組數(shù)據(jù)并沒有直接的聯(lián)系,詞典只是為了將單詞映射為單詞ID。而歸并法則是在內(nèi)存中建立一個(gè)完整的內(nèi)存索引結(jié)構(gòu),相當(dāng)于對(duì)目前處理的文檔子集建立起了一個(gè)倒排索引。
其次,在將中間結(jié)果寫入磁盤臨時(shí)文件時(shí),歸并法將整個(gè)內(nèi)存的倒排索引寫入臨時(shí)文件,對(duì)于某個(gè)單詞的倒排列表在寫入磁盤文件時(shí),將詞典項(xiàng)放在列表最前端,之后跟隨相應(yīng)的倒排列表,這樣依次將單詞和對(duì)應(yīng)的倒排列表寫入磁盤文件,隨后徹底清空所占內(nèi)存。而排序法只是將三元組數(shù)據(jù)排序后寫入磁盤文件,詞典作為一個(gè)映射表一直存儲(chǔ)在內(nèi)存中。
在最后合并為最終索引的過程中,排序法是根據(jù)同一單詞ID的這樣三元組依次進(jìn)行合并,歸并法的臨時(shí)文件則是每個(gè)單詞對(duì)應(yīng)的部分倒排列表,所以在合并時(shí)針對(duì)每個(gè)單詞的倒排列表進(jìn)行合并,形成這個(gè)單詞的最終倒排列表就可以了,與此同時(shí),最后的合并過程中也會(huì)形成最終的詞典信息。如果大家對(duì)算法里的歸并排序有所了解的話,就很清楚這種方法了吧。
?
索引更新策略
常用的索引更新策略有4種:完全重建策略、再合并策略、原地更新策略以及混合策略。
完全重建策略:很直觀的方法,當(dāng)新增文檔達(dá)到一個(gè)數(shù)量時(shí),將新增文檔和原先的老文檔進(jìn)行合并,然后利用上文提到的建立索引的方式,對(duì)所有文檔重新建立索引。
再合并策略:有新增文檔進(jìn)入搜索系統(tǒng)時(shí),搜索系統(tǒng)在內(nèi)存維護(hù)臨時(shí)倒排索引來記錄信息,當(dāng)新增文檔達(dá)到一定數(shù)量的時(shí)候,則把臨時(shí)索引文件和老文檔的倒排索引文件進(jìn)行合并,以生成新的索引。
原地更新策略:在索引合并時(shí),并不生成新的索引文件,而是直接在原先的索引文件里進(jìn)行追加操作,將增量索引里單詞的倒排列表項(xiàng)追加到老索引對(duì)應(yīng)的倒排列表項(xiàng)的末尾,這樣的話,就只更新增量索引里出現(xiàn)的單詞相關(guān)信息,其他單詞信息不做變動(dòng)。
混合策略:結(jié)合不同索引更新策略的優(yōu)勢(shì),將不同的索引更新策略混合以形成更高效的方法。
混合策略一般會(huì)將單詞根據(jù)其不同性質(zhì)進(jìn)行分類,不同類別的單詞,對(duì)其索引采取不同的索引更新策略。常見的做法是:根據(jù)單詞的倒排列表長(zhǎng)度進(jìn)行劃分,因?yàn)橛行﹩卧~經(jīng)常在不同文檔中出現(xiàn),所以其對(duì)應(yīng)的倒排列表就較長(zhǎng),而有些單詞很少見,其倒排列表就較短。那么長(zhǎng)倒排列表單詞采取原地更新策略,因?yàn)檫@種策略能夠節(jié)省磁盤讀寫次數(shù);而短倒排列表就采取再和并策略。通過這種根據(jù)實(shí)際情況來分別采取實(shí)際策略的方法,效果體現(xiàn)的比較顯著,磁盤的讀寫操作和各種策略的優(yōu)勢(shì)都充分體現(xiàn)出來了。
轉(zhuǎn)載于:https://www.cnblogs.com/BaiYiShaoNian/p/4548817.html
總結(jié)
以上是生活随笔為你收集整理的这就是搜索引擎--读书笔记五--索引的建立与更新的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VS2017 CUDA编程学习12:CU
- 下一篇: Labelme标注软件下载安装教程