索引的概念
索引在生活中存在方方面面的應用。比如你去超市,超市把商品分了不同的區間,日用平、生鮮、糧油、飲料等等,比如你去買可樂,直接去立着飲料牌子的區間去找就可以,不用去挨着尋找,那這裏的“牌子”就是索引。再以字典爲例,要找“趙”這個字的詳細解釋,你不需要捧着厚厚的字典從頭到尾找,只要翻到z字母所在區間去找就可以了。
由上所述,索引的目的就是幫助你快速查找目標。如果以信息的角度講,索引就是一批具有順序的數據結構,形成文件存儲在介質中,幫助快速定位到數據。
倒排索引的概念
百度百科的定義:
倒排索引源於實際應用中需要根據屬性的值來查找記錄。這種索引表中的每一項都包括一個屬性值和具有該屬性值的各記錄的地址。由於不是由記錄來確定屬性值,而是由屬性值來確定記錄的位置,因而稱爲倒排索引(inverted index)。帶有倒排索引的文件我們稱爲倒排索引文件,簡稱倒排文件(inverted file)。
說的好像不是那麼簡潔明瞭,通過後面的案例實踐,也許會對這一概念有更深的理解。
倒排索引計算
首先介紹倒排索引計算所依賴的一些其它概念。
分詞(analyze)
在全文檢索技術中,對文本數據做字、詞、段的加工處理,形成一個或多個詞項(term)。
例如文本:“我的名字叫趙利文”
字的處理:我 的 名 字 叫 趙 利 文
詞的處理: 我的 名字 趙利文
段落的處理:我的名字叫趙利文
不同的分詞器,算法不同,對字、詞、段的處理結果也不同。專門用來處理英文的分詞器對中文的處理可能不是特別準確到位。
文檔對象(document)
對雜亂無序的數據進行整理,形成結構化的數據對象,就叫文檔對象。不同的文檔對象可以分爲不同的屬性。比如網頁,就可以有標題、網址、網頁簡介、網頁內容等文檔屬性。再比如商品信息,可以有商品名稱、商品價格、商品圖片等文檔屬性。
域屬性(field)
文檔對象的屬性,就稱爲域屬性。通過對域屬性進行分詞,爲索引的建立提供重要保障。域屬性可以作爲文檔的私有屬性,比如不需要進行分詞的網頁地址、圖片地址、價格等內容。
倒排索引算法
之所以搜索引擎可以快速在海量的數據中查詢出你想要的數據,索引文件起到的作用舉足輕重。 Lucene將原始數據經過一些列加工處理,形成了可以被識別和計算的索引文件。
我們以兩個網頁來舉例。
網頁1:
標題:全球與新冠病毒長期共存,中國該怎麼辦
來源:國是直通車
內容:新冠病毒長期存在,將對人類社會帶來諸多改變。中國應爲此作何準備?
網頁2:
標題:外媒:中國和巴西展開新冠病毒疫苗合作
來源:新華社客戶端
內容:聖保羅州將與中國實驗室合作生產和測試新冠病毒疫苗。
爬蟲將兩個網頁抓取之後,建立document。
文章標題:title
文章來源:origin
文章內容:content
網頁1:
id:did1
title:全球與新冠病毒長期共存,中國該怎麼辦
origin:國是直通車
content:新冠病毒長期存在,將對人類社會帶來諸多改變。中國應爲此作何準備
網頁2:
id:did2
title:中國和巴西展開新冠病毒疫苗合作
origin:新華社客戶端
content:聖保羅州將與中國實驗室合作生產和測試新冠病毒疫苗。
對文檔對象進行分詞計算,得到詞項。
did1
中國(2)新冠病毒(2)人類(1)
did2
中國(1)巴西(1)新冠病毒(2)疫苗(2)
以表格的形式,對分詞做記錄:
詞項\id | did1 | did2 | did3 | … |
---|---|---|---|---|
中國 | 1 | 0 | 0 | 0 |
疫苗 | 0 | 1 | 0 | 0 |
新冠病毒 | 1 | 1 | 0 | 0 |
巴西 | 0 | 1 | 0 | 0 |
人類 | 1 | 0 | 0 | 0 |
讀取上述表格就可以得到每個詞項的二進制數據(倒排索引表):
中國:1000
疫苗:0100
新冠病毒:1100
巴西:0100
人類:1000
如果搜索:新冠病毒&人類。首先對兩個詞項進行與運算,得到:1100&1000=1000,同時滿足新冠病毒和人類的文檔id爲did1。這樣就通過查詢的詞項快速定位到了滿足搜索要求的文檔對象id。
通過did1,就可以拿到did1相關的其它域屬性進行返回展示了。如果域屬性中包含了網頁地址,用戶點擊之後,就可以直接跳轉到原網頁進行詳細瀏覽了。這就是類似與百度搜索引擎這樣的網站底層搜索技術的簡單模型了。
索引文件的結構分兩部分:(1)海量的document對象集合。(2)倒排索引表。
到此爲止,倒排索引算法就結束完畢了。歡迎留言交流。