倒排索引--搜索引擎入門

背景

在關(guān)系型數(shù)據(jù)庫(kù)中途事,索引是檢索數(shù)據(jù)的最有效率方式,但是在海量的數(shù)據(jù)中雨让,需要實(shí)時(shí)檢索數(shù)據(jù)的時(shí)候,關(guān)系型數(shù)據(jù)庫(kù)的索引方式在性能方面并不能滿足我們的檢索要求忿等。打個(gè)比方:搜索引擎面對(duì)的是海量數(shù)據(jù)栖忠,像Google,百度這樣大型的商業(yè)搜索引擎索引都是億級(jí)甚至百億級(jí)的網(wǎng)頁(yè)數(shù)量 ,面對(duì)如此海量數(shù)據(jù) ,使得數(shù)據(jù)庫(kù)系統(tǒng)很難有效的管理庵寞。于是在很多搜索引擎中出現(xiàn)了一種相對(duì)于我們傳統(tǒng)的正序索引相反的一種索引:倒排索引或反序索引狸相,官方的名稱是:inverted index 。

倒排索引

1)基本概念

概括《這就是搜索引擎-核心技術(shù)詳解》總結(jié)出來就是:索引表包括了每條記錄的屬性值和屬性值記錄的地址捐川,檢索的時(shí)候脓鹃,通過屬性值來確定該條記錄的位置,而不是像傳統(tǒng)索引那樣通過屬性來確定屬性值古沥,通俗的說就是不在是通過key尋找value瘸右,而是通過value尋找key。也許這么闡述還是有點(diǎn)抽象岩齿,那么我們先了解倒排索引有關(guān)的幾個(gè)概念太颤,然后一點(diǎn)點(diǎn)深入。

文檔

一般搜索引擎的處理對(duì)象是互聯(lián)網(wǎng)網(wǎng)頁(yè)盹沈,而文檔這個(gè)概念更要寬泛一些龄章,代表以文本形式存在的存儲(chǔ)對(duì)象。相比于網(wǎng)頁(yè)來說襟诸,涵蓋更多形式瓦堵,比如Word、PDF歌亲、html菇用、XML等不同格式的文件都可以稱為文檔,再比如一封郵件陷揪、一條短信惋鸥、一條微博也可以稱為文檔。

文檔集合

顧名思義悍缠,一組或多個(gè)文檔構(gòu)成的集合卦绣,比如海量的互聯(lián)網(wǎng)網(wǎng)頁(yè)或者大量的電子郵件,都是文檔集合的具體例子飞蚓。

文檔編號(hào)

在搜索引擎內(nèi)部滤港,會(huì)為文檔集合內(nèi)每個(gè)文檔賦予一個(gè)唯一的內(nèi)部編號(hào),以此編號(hào)作為這個(gè)文檔的唯一標(biāo)識(shí)趴拧,這樣方便內(nèi)部處理溅漾。

單詞編號(hào)(重點(diǎn))

與文檔編號(hào)類似,搜索引擎內(nèi)部以唯一的編號(hào)來表征某個(gè)單詞著榴,單詞編號(hào)可以作為某個(gè)單詞的唯一表征添履。

倒排索引(重點(diǎn))

倒排索引是實(shí)現(xiàn)單詞——文檔矩陣(文檔矩陣如下圖1,為了方便看脑又,就不直接采用書上的截圖暮胧,而是采用網(wǎng)友們的圖)的一種具體存儲(chǔ)形式锐借。通過倒排索引,可以根據(jù)單詞快速獲取包含這個(gè)單詞的文檔列表往衷。倒排索引主要由兩個(gè)部分組成:單詞詞典倒排文件钞翔。

單詞詞典(重點(diǎn))

搜索引擎通常的索引單位是單詞,單詞詞典是由文檔集合中出現(xiàn)過的所有單詞構(gòu)成的字符串集合席舍,單詞詞典內(nèi)每條索引項(xiàng)記載單詞本身的一些信息及指向倒排列表的指針嗅战。所以在用戶進(jìn)行查詢的時(shí)候,搜索引擎根據(jù)用戶的查詢?cè)~俺亮,去單詞詞典里查詢,就能夠獲得相應(yīng)的倒排列表疟呐,并以此作為后續(xù)排序的基礎(chǔ)脚曾。

對(duì)于一個(gè)規(guī)模很大的文檔集合來說,可能包含幾十萬(wàn)甚至上百萬(wàn)不同的單詞启具,能否快速定位某個(gè)單詞本讥,這直接影響搜索時(shí)的相應(yīng)速度,常用的數(shù)據(jù)結(jié)構(gòu)包括哈希加鏈表結(jié)構(gòu)樹形詞典結(jié)構(gòu)鲁冯。

倒排列表

倒排列表記載了出現(xiàn)過某個(gè)單詞的所有文檔的文檔列表及單詞在該文檔中出現(xiàn)的位置信息拷沸,每條記錄稱為一個(gè)倒排項(xiàng)(Posting)。根據(jù)倒排列表薯演,即可獲知哪些文檔包含某個(gè)單詞撞芍。

倒排文件

所有單詞的倒排列表往往順序地存儲(chǔ)在磁盤的某個(gè)文件里,這個(gè)文件即被稱為倒排文件跨扮,倒排文件是存儲(chǔ)倒排索引的物理文件序无。

單詞-文檔矩陣:(單詞即一段文檔或者句子中的某個(gè)單詞,英文以空格分割衡创,文檔即一段句子或者一段文章)



圖1

稍微簡(jiǎn)述一下帝嗡,上述圖中的意思,我們首先把文檔看作一段英文句子璃氢,也就是說句子1哟玷,2,3一也,4巢寡,5在橫列中,然后每段句子構(gòu)成的單詞在列中塘秦,如果單詞在某個(gè)句子出現(xiàn)過讼渊,就在該句子與單詞構(gòu)成的矩陣交集處打勾,這樣就構(gòu)成了我們單詞文檔矩陣尊剔。


將上面的索引的元素組成后爪幻,大致關(guān)系圖如下圖2所示(由于書上的圖依舊不清晰菱皆,所以還是采用網(wǎng)上其他同學(xué)的圖):


圖2

上面的圖也稍微解釋一下:

單詞的集合組成了詞典,每個(gè)單詞與文檔的組合組成了倒排索引挨稿,倒排索引的結(jié)匯組成了倒排列表仇轻,倒排列表組成了倒排文件。

倒排索引實(shí)例

這里我們就引用書中的例子:



圖1

圖1中有5個(gè)句子奶甘,然后我們把每句話的詞匯和句子構(gòu)成單詞-文檔矩陣篷店,第一列給每個(gè)單詞一個(gè)編號(hào),即我們前面說的單詞編號(hào)臭家,便于檢索時(shí)候使用疲陕,第二列是單詞,第三列是每一個(gè)單詞在哪里句子里面出現(xiàn)的钉赁。然后這種索引列表過于簡(jiǎn)單蹄殃,我們可以繼續(xù)在圖2中我們?cè)诘古帕斜碇屑尤朊恳粋€(gè)單詞在每一個(gè)句子里面出現(xiàn)的頻率


圖2


圖3

如圖3所示,我們看到倒排列表中你踩,增加了每一個(gè)詞匯在句子出現(xiàn)的編號(hào)以及出現(xiàn)的頻率诅岩,當(dāng)然這樣還是很簡(jiǎn)單,并不達(dá)到我們的預(yù)期索引系統(tǒng)带膜,于是我們可以在增加單詞頻率的基礎(chǔ)上加入文檔頻率吩谦,即代表有多少個(gè)文檔包含了這類單詞。


圖4

如圖4所示:我們以“拉斯”為例子膝藕,其單詞編號(hào)為8式廷,文檔頻率為2,代理整個(gè)文檔中有兩個(gè)文檔包含這個(gè)單詞芭挽,對(duì)應(yīng)倒排列表是:{(3;1,<4>),(5;1,<4>)},其含義就是“拉斯”在文檔3和文檔5各出現(xiàn)一次懒棉,位置在第四個(gè)詞的位置。上述的例子即是一個(gè)完整的倒排索引系統(tǒng)览绿,在實(shí)際應(yīng)用中無(wú)非采取哪種數(shù)據(jù)的方式而已策严。

索引的存儲(chǔ)結(jié)構(gòu)

單詞詞典是倒排索引中非常重要的組成部分,它用來維護(hù)文檔集合中出現(xiàn)過的所有單詞的相關(guān)信息饿敲,同時(shí)用來記載某個(gè)單詞對(duì)應(yīng)的倒排列表在倒排文件中的位置信息属铁。在支持搜索時(shí)现横,根據(jù)用戶的查詢?cè)~垮媒,去單詞詞典里查詢恳谎,就能夠獲得相應(yīng)的倒排列表,并以此作為后續(xù)排序的基礎(chǔ)瓢对。

1)Hash的存儲(chǔ)方式

在建立索引的過程中寿酌,詞典結(jié)構(gòu)也會(huì)相應(yīng)地被構(gòu)建出來。比如在解析一個(gè)新文檔的時(shí)候硕蛹,對(duì)于某個(gè)在文檔中出現(xiàn)的單詞T醇疼,首先利用哈希函數(shù)獲得其哈希值硕并,之后根據(jù)哈希值對(duì)應(yīng)的哈希表項(xiàng)讀取其中保存的指針,就找到了對(duì)應(yīng)的沖突鏈表秧荆。如果沖突鏈表里已經(jīng)存在這個(gè)單詞倔毙,說明單詞在之前解析的文檔里已經(jīng)出現(xiàn)過。如果在沖突鏈表里沒有發(fā)現(xiàn)這個(gè)單詞乙濒,說明該單詞是首次碰到陕赃,則將其加入沖突鏈表里。這樣的存儲(chǔ)方式很類似于Java中HashMap解決hash沖突的方式颁股。


2)樹形結(jié)構(gòu)

B樹(或者B+樹的)存儲(chǔ)方式么库,這點(diǎn)很類似于Mysql的Inoodb的存儲(chǔ)引擎中采用B+樹的方式來存儲(chǔ)索引,由于采用了B樹的結(jié)構(gòu)甘有,即索引存儲(chǔ)在是一個(gè)平衡樹廊散,避免了查詢極端的情況,由于有序梧疲,所以能根據(jù)字典項(xiàng)需要的大小順序來構(gòu)建索引,這樣在檢索中可以快速通過字典項(xiàng)比較大小运准,最終確定葉子結(jié)點(diǎn)中詞匯的存儲(chǔ)地址信息幌氮。(由于B樹的構(gòu)建復(fù)雜,這里就不過多的講解胁澳,向深入了解该互,可以翻翻上學(xué)那會(huì)兒的《數(shù)據(jù)結(jié)構(gòu)》那本書喔)


總結(jié)

上面大致粗略的講解了一下倒排索引的概念,其實(shí)在實(shí)際中韭畸,倒排索引還會(huì)進(jìn)行索引壓縮宇智,排序的加工,也正因?yàn)檫@些加工胰丁,讓其成為目前許多搜索引擎采用的索引方式随橘。由于博主也是最近才介入搜索相關(guān)的工作,對(duì)于搜索引擎的話锦庸,還在初探階段机蔗,如有更好的見解,歡迎一起來學(xué)習(xí)甘萧。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末萝嘁,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子扬卷,更是在濱河造成了極大的恐慌牙言,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件怪得,死亡現(xiàn)場(chǎng)離奇詭異咱枉,居然都是意外死亡卑硫,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門庞钢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拔恰,“玉大人,你說我怎么就攤上這事基括⊙瞻茫” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵风皿,是天一觀的道長(zhǎng)河爹。 經(jīng)常有香客問我,道長(zhǎng)桐款,這世上最難降的妖魔是什么咸这? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮魔眨,結(jié)果婚禮上媳维,老公的妹妹穿的比我還像新娘。我一直安慰自己遏暴,他們只是感情好侄刽,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著朋凉,像睡著了一般州丹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上杂彭,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天墓毒,我揣著相機(jī)與錄音,去河邊找鬼亲怠。 笑死所计,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的团秽。 我是一名探鬼主播醉箕,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼徙垫!你這毒婦竟也來了讥裤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤姻报,失蹤者是張志新(化名)和其女友劉穎己英,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吴旋,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡损肛,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年厢破,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片治拿。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡摩泪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出劫谅,到底是詐尸還是另有隱情见坑,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布捏检,位于F島的核電站荞驴,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏贯城。R本人自食惡果不足惜熊楼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望能犯。 院中可真熱鬧鲫骗,春花似錦、人聲如沸踩晶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)合瓢。三九已至,卻和暖如春透典,著一層夾襖步出監(jiān)牢的瞬間晴楔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工峭咒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留税弃,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓凑队,卻偏偏與公主長(zhǎng)得像则果,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子漩氨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

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