日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

搜索引擎索引之如何建立索引

發(fā)布時(shí)間:2024/2/28 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 搜索引擎索引之如何建立索引 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.


????????????????????????????????????????? 本文節(jié)選自《這就是搜索引擎:核心技術(shù)詳解》第三章


3.4建立索引

?? ?? 正如前述章節(jié)所述,索引結(jié)構(gòu)如果建立好了,可以增加搜索的速度,那么給定一個(gè)文檔集合,索引是如何建立起來的呢?建立索引的方式有很多種,本節(jié)敘述比較實(shí)用的三種建立索引的方法。

??3.4.1兩遍文檔遍歷法(2-Pass In-Memory Inversion)

?

??? ? 顧名思義,此種方法需要對文檔集合進(jìn)行兩遍掃描,圖3-11是這種方法的示意圖。值得注意的一點(diǎn)是:此種方法完全是在內(nèi)存里完成索引的創(chuàng)建過程的,而另外兩種方法則是通過內(nèi)存和磁盤相互配合來完成索引建立任務(wù)。

??

???????????

???????????????????????????????? 圖3-11 兩遍文檔遍歷法

?? 第一遍文檔遍歷

?

??? 在第一遍掃描文檔集合時(shí),該方法并沒有立即開始建立索引,而是收集一些全局的統(tǒng)計(jì)信息。比如文檔集合包含的文檔個(gè)數(shù)N,文檔集合內(nèi)所包含的不同單詞個(gè)數(shù)M,每個(gè)單詞在多少個(gè)文檔中出現(xiàn)過的信息DF。將所有單詞對應(yīng)的DF值全部相加,就可以知道建立最終索引所需內(nèi)存大小是多少,因?yàn)橐粋€(gè)單詞對應(yīng)的DF值如果是10,說明有10個(gè)文檔包含這個(gè)單詞,那么這個(gè)單詞對應(yīng)的倒排列表應(yīng)該包含10項(xiàng)內(nèi)容,每一項(xiàng)記載某個(gè)文檔的文檔ID和單詞在該文檔對應(yīng)的出現(xiàn)次數(shù)TF。

??? 在獲得了上述三類信息后,就可以知道最終索引的大小,于是在內(nèi)存中分配足夠大的空間,用來存儲倒排索引內(nèi)容。如圖3-11所示,在內(nèi)存中可以開辟連續(xù)存儲區(qū)域,因?yàn)榈谝槐閽呙枰呀?jīng)獲得了每個(gè)單詞的DF信息,所以將連續(xù)存儲區(qū)劃分成不同大小的“片段”,詞典內(nèi)某個(gè)單詞根據(jù)自己對應(yīng)的DF信息,可以通過指針,指向?qū)儆谧约旱膬?nèi)存“片段”的起始位置和終結(jié)位置,將來在第二遍掃描時(shí),這個(gè)單詞對應(yīng)的倒排列表信息會被填充進(jìn)入這個(gè)片段中。

??? 綜上所述,第一遍掃描的主要目的是獲得一些統(tǒng)計(jì)信息,并根據(jù)統(tǒng)計(jì)信息分配內(nèi)存等資源,同時(shí)建立好了單詞相對應(yīng)倒排列表在內(nèi)存中的位置信息,即主要做些資源準(zhǔn)備工作。

第二遍文檔遍歷

??? 在第二遍掃描的時(shí)候,開始真正建立每個(gè)單詞的倒排列表信息,即對于某個(gè)單詞來說,獲得包含這個(gè)單詞的每個(gè)文檔的文檔ID,以及這個(gè)單詞在文檔中的出現(xiàn)次數(shù)TF,這樣就可以不斷填充第一遍掃描所分配的內(nèi)存空間。當(dāng)?shù)诙閽呙杞Y(jié)束的時(shí)候,分配的內(nèi)存空間正好被填充滿,而每個(gè)單詞用指針?biāo)赶虻膬?nèi)存區(qū)域“片段”,其起始位置和結(jié)束位置之間的數(shù)據(jù)就是這個(gè)單詞對應(yīng)的倒排列表。

??? 經(jīng)過兩遍掃描完成索引建立后,即可將內(nèi)存的倒排列表和詞典信息寫入磁盤,這樣就完成了建立索引的過程。從上述流程可以看出,索引的構(gòu)建完全是在內(nèi)存中完成的,這就要求內(nèi)存的大小一定要足夠大,否則如果文檔集合太大時(shí),內(nèi)存未必能夠滿足需求。

??? 從另外一個(gè)角度看,在建立索引的過程中,從磁盤讀取文檔并解析文檔基本是最消耗時(shí)間的一個(gè)步驟,而兩遍掃描法因?yàn)橐獙ξ臋n集合進(jìn)行兩遍遍歷,所以從速度上不占優(yōu)勢,在實(shí)際中采用這種方法的系統(tǒng)并不常見。而下面介紹的兩種方法都是對文檔集合進(jìn)行一遍掃描,所以在速度方面明顯占優(yōu)。


3.4.2排序法(Sort-basedInversion)

?? ? 兩遍遍歷法在建立索引過程中,對內(nèi)存的消耗要求較高,不同的文檔集合包含文檔數(shù)量大小不同,其所需內(nèi)存大小是不確定的。當(dāng)文檔集合非常大時(shí),可能因內(nèi)存不夠,導(dǎo)致無法建立索引。排序法對此做出了改進(jìn),該方法在建立索引的過程中,始終在內(nèi)存中分配固定大小的內(nèi)存,用來存放詞典信息和索引的中間結(jié)果,當(dāng)分配的內(nèi)存被消耗光的時(shí)候,把中間結(jié)果寫入磁盤,清空內(nèi)存里中間結(jié)果所占內(nèi)存,以用作下一輪存放索引中間結(jié)果的存儲區(qū)。這種方法由于只需要固定大小的內(nèi)存,所以可以對任意大小的文檔集合建立索引(參考圖3-12)。

??????????????????????????????????

?????????????????????????????????????????????????????????????? 圖3-12 排序法

??

中間結(jié)果內(nèi)存排序

???? 圖3-12是排序法在內(nèi)存中建立索引中間結(jié)果的示意圖。讀入文檔后,給文檔進(jìn)行編號,賦予唯一的文檔ID,并對文檔內(nèi)容解析。對于文檔中出現(xiàn)的單詞,通過查詞典將單詞轉(zhuǎn)換為對應(yīng)的單詞ID,如果詞典中沒有這個(gè)單詞,說明是第一次碰到,則賦予單詞以唯一的單詞ID并插入詞典中。在完成了由單詞映射為單詞ID過程之后,可以對該文檔內(nèi)每個(gè)單詞建立一個(gè)(單詞ID,文檔ID,單詞頻率)三元組,這個(gè)三元組就是單詞對應(yīng)文檔的倒排列表項(xiàng),將這個(gè)三元組追加進(jìn)入中間結(jié)果存儲區(qū)末尾。如果文檔內(nèi)的所有單詞都經(jīng)過如此處理,形成三元組序列的形式,則該文檔被處理完成,開始依次序處理下一文檔,過程與此類似。

???? 隨著新的文檔不斷被處理完成,存儲三元組集合的中間結(jié)果所占用的內(nèi)存會越來越多,詞典里包含的新單詞也越來越多,當(dāng)分配的內(nèi)存定額被占滿時(shí),該方法對三元組中間結(jié)果進(jìn)行排序。排序的原則是:主鍵是單詞ID,即首先要按照單詞ID由小到大排序。次鍵是文檔ID,即在相同單詞ID的情況下,按照文檔ID由小到大排序。通過以上方式,三元組變成有序形式。為了騰出內(nèi)存空間,將排好序的三元組寫入磁盤臨時(shí)文件中,這樣就空出內(nèi)存來進(jìn)行后續(xù)文檔的處理。這里需要注意的是:在建立索引過程中,詞典是一直存儲在內(nèi)存中的,每次清空內(nèi)存只是將中間結(jié)果寫入磁盤。隨著處理文檔的加大,詞典占用的內(nèi)存會逐漸增加,由于分配內(nèi)存是固定大小,而詞典占用內(nèi)存會越來越大,也就是說,越往后,可用來存儲三元組的空間是越來越少的。

??? 之所以要對中間結(jié)果進(jìn)行排序,主要是為了方便后續(xù)的處理。因?yàn)槊恳惠喬幚矶紩诖疟P產(chǎn)生一個(gè)對應(yīng)的中間結(jié)果文件,當(dāng)所有文檔處理完成后,在磁盤會有多個(gè)中間結(jié)果文件,為了產(chǎn)生最終的索引,需要對這些中間結(jié)果文件合并。圖3-13是如何對中間結(jié)果進(jìn)行合并的示意圖。

?

????????????????????????????????? 圖3-13 中間文件合并

?

?合并中間結(jié)果

??? 如圖3-13所示,在合并中間結(jié)果的過程中,系統(tǒng)為每個(gè)中間結(jié)果文件在內(nèi)存中開辟一個(gè)數(shù)據(jù)緩沖區(qū),用來存放文件的部分?jǐn)?shù)據(jù)。因?yàn)樵谛纬芍虚g結(jié)果文件前,已經(jīng)按照單詞ID和文檔ID進(jìn)行了排序,所以進(jìn)入緩沖區(qū)的數(shù)據(jù)已經(jīng)是有序的。合并過程中,將不同緩沖區(qū)中包含的同一個(gè)單詞ID的三元組進(jìn)行合并,如果某個(gè)單詞ID的所有三元組全部合并完成,說明這個(gè)單詞的倒排列表已經(jīng)構(gòu)建完成,則將其寫入最終索引中,同時(shí)將各個(gè)緩沖區(qū)中對應(yīng)這個(gè)單詞ID的三元組內(nèi)容清空,這樣緩沖區(qū)就可以繼續(xù)從中間結(jié)果文件中讀入后續(xù)的三元組來進(jìn)行下一個(gè)單詞的三元組合并。當(dāng)所有中間結(jié)果文件都依次被讀入緩沖區(qū),在合并完成后,就形成了最終的索引文件。



3.4.3歸并法(Merge-basedInversion)

? ?? “排序法”分配固定大小內(nèi)存來建立索引,所以無論要建索引的文檔集合有多大,都可以通過這種方法完成。但是如上所述,在分配的內(nèi)存定額被消耗光時(shí),

??? “排序法”只是將中間結(jié)果寫入磁盤,而詞典信息一直在內(nèi)存中進(jìn)行維護(hù),隨著處理文檔越來越多,詞典里包含的詞典項(xiàng)越來越多,所以占用內(nèi)存越來越大,導(dǎo)致后期中間結(jié)果可用內(nèi)存越來越少。“歸并法”對此做出了改進(jìn),即每次將內(nèi)存中數(shù)據(jù)寫入磁盤時(shí),包括詞典在內(nèi)的所有中間結(jié)果信息都被寫入磁盤,這樣內(nèi)存所有內(nèi)容都可以被清空,后續(xù)建立索引可以使用全部的定額內(nèi)存。

???? 圖3-14是“歸并法”的示意圖。其整體流程和排序法大致相同,也是分為兩個(gè)大的階段,首先在內(nèi)存里維護(hù)中間結(jié)果,當(dāng)內(nèi)存占滿后,將內(nèi)存數(shù)據(jù)寫入磁盤臨時(shí)文件,第二階段對臨時(shí)文件進(jìn)行歸并形成最終索引。

???????

????????????????????????? ?? ????? 圖3-14 歸并法

?

??? 盡管整體流程看上去和排序法大致相同,但是在具體實(shí)現(xiàn)方式上有較大差異。

??? 首先,“排序法”在內(nèi)存中存放的是詞典信息和三元組數(shù)據(jù),在建立索引過程中,詞典和三元組數(shù)據(jù)并沒有直接的聯(lián)系,詞典只是為了將單詞映射為單詞ID。而“歸并法”則是在內(nèi)存中建立一個(gè)完整的內(nèi)存索引結(jié)構(gòu),相當(dāng)于對目前處理的文檔子集單獨(dú)在內(nèi)存建立起了一整套倒排索引,和最終的索引相比,其結(jié)構(gòu)和形式是相同的,區(qū)別只是這個(gè)索引只是部分文檔的索引而非全部文檔的索引。

??? 其次,在將中間結(jié)果寫入磁盤臨時(shí)文件時(shí),“歸并法”會將整個(gè)內(nèi)存的倒排索引寫入臨時(shí)文件,對于某個(gè)單詞的倒排列表,在寫入磁盤文件時(shí),將詞典項(xiàng)放在列表最前端,之后跟隨相應(yīng)的倒排列表,這樣依次將單詞和對應(yīng)的倒排列表寫入磁盤文件,隨后徹底清空所占內(nèi)存。而“排序法”如上節(jié)所述,只是將三元組數(shù)據(jù)排序后寫入磁盤臨時(shí)文件,詞典作為一個(gè)映射表一直存儲在內(nèi)存中。

???? 在最后的臨時(shí)文件合并為最終索引過程中,兩者也有差異。“排序法”因?yàn)楸4娴氖怯行蛉M信息,所以在合并時(shí),是對同一單詞的三元組依次進(jìn)行合并;而“歸并法”的臨時(shí)文件則是每個(gè)單詞對應(yīng)的部分倒排列表,所以在合并時(shí)針對每個(gè)單詞的倒排列表進(jìn)行合并,形成這個(gè)單詞的最終倒排列表。另外,“歸并法”在最后的合并過程中形成最終的詞典信息。


總結(jié)

以上是生活随笔為你收集整理的搜索引擎索引之如何建立索引的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。