袁庭新老師ES系列03節(jié)|倒排索引
前言
我們對(duì)Lucence的基本概念了解后,那Lucence是如何實(shí)現(xiàn)全文檢索的?以及它的原理是什么?下面跟著袁老師繼續(xù)探索Lucence的相關(guān)技術(shù),揭開它的面紗。
一. 索引和搜索流程圖
索引和搜索流程圖見如下所示:

1.綠色表示索引過程,對(duì)要搜索的原始內(nèi)容進(jìn)行索引構(gòu)建一個(gè)索引庫,索引過程包括:
確定原始內(nèi)容即要搜索的內(nèi)容 => 采集文檔 => 創(chuàng)建文檔 => 分析文檔 => 索引文檔
2.紅色表示搜索過程,從索引庫中搜索內(nèi)容,搜索過程包括:
用戶通過搜索界面 => 創(chuàng)建查詢 => 執(zhí)行搜索 => 從索引庫搜索 => 渲染搜索結(jié)果
二. 全文檢索解析
我們以BOSS招聘網(wǎng)站的搜索為例,在網(wǎng)站上輸入關(guān)鍵字搜索顯示的內(nèi)容不是直接從數(shù)據(jù)庫中來的,而是從索引庫中獲取的,網(wǎng)站的索引數(shù)據(jù)需要提前創(chuàng)建的。以下是創(chuàng)建的過程:
第一步:獲得原始文檔
就是從MySQL數(shù)據(jù)庫中通過SQL語句查詢需要?jiǎng)?chuàng)建索引的數(shù)據(jù)。
第二步:創(chuàng)建文檔對(duì)象(Document)
把查詢的內(nèi)容構(gòu)建成Lucene能識(shí)別的Document對(duì)象,獲取原始內(nèi)容的目的是為了索引,在索引前需要將原始內(nèi)容創(chuàng)建成文檔,文檔中包括一個(gè)一個(gè)的域(Field),這個(gè)域?qū)?yīng)就是表中的列。
注意:每個(gè)Document可以有多個(gè)Field,不同的Document可以有不同的Field,同一個(gè)Document可以有相同的Field(域名和域值都相同)。每個(gè)文檔都有一個(gè)唯一的編號(hào),就是文檔id。
第三步:分析文檔
將原始內(nèi)容創(chuàng)建為包含域(Field)的文檔(Document),需要再對(duì)域中的內(nèi)容進(jìn)行分析,分析的過程是經(jīng)過對(duì)原始文檔提取單詞、將字母轉(zhuǎn)為小寫、去除標(biāo)點(diǎn)符號(hào)、去除停用詞等過程生成最終的語匯單元,可以將語匯單元理解為一個(gè)一個(gè)的單詞。
分好的詞會(huì)組成索引庫中最小的單元Term,一個(gè)Term由域名和詞組成。
第四步:創(chuàng)建索引
對(duì)所有文檔分析得出的語匯單元進(jìn)行索引,索引的目的是為了搜索,最終要實(shí)現(xiàn)只搜索被索引的語匯單元從而找到Document(文檔)。
注意:創(chuàng)建索引是對(duì)語匯單元索引,通過詞語找文檔,這種索引的結(jié)構(gòu)叫倒排索引結(jié)構(gòu)。 倒排索引結(jié)構(gòu)是根據(jù)內(nèi)容(詞語)找文檔,如下圖:

倒排索引結(jié)構(gòu)也叫反向索引結(jié)構(gòu),包括索引和文檔兩部分,索引即詞匯表,它的規(guī)模較小,而文檔集合較大。
三. 倒排索引
倒排索引記錄每個(gè)詞條出現(xiàn)在哪些文檔及在文檔中的位置,可以根據(jù)詞條快速定位到包含這個(gè)詞條的文檔及出現(xiàn)的位置。
文檔:索引庫中的每一條原始數(shù)據(jù),例如一個(gè)商品信息、一個(gè)職位信息。
詞條:原始數(shù)據(jù)按照分詞算法進(jìn)行分詞,得到的每一個(gè)詞。
創(chuàng)建倒排索引,分為以下幾步。
1.1 創(chuàng)建文檔列表
Lucene首先對(duì)原始文檔數(shù)據(jù)進(jìn)行編號(hào)(DocID),形成列表,就是一個(gè)文檔列表。

1.2 創(chuàng)建倒排索引列表
對(duì)文檔中數(shù)據(jù)進(jìn)行分詞,得到詞條(分詞后的一個(gè)又一個(gè)詞)。對(duì)詞條進(jìn)行編號(hào),以詞條創(chuàng)建索引。然后記錄下包含該詞條的所有文檔編號(hào)(及其它信息)。

1.3 搜索的過程
當(dāng)用戶輸入任意的詞條時(shí),首先對(duì)用戶輸入的數(shù)據(jù)進(jìn)行分詞,得到用戶要搜索的所有詞條,然后拿著這些詞條去倒排索引列表中進(jìn)行匹配。找到這些詞條就能找到包含這些詞條的所有文檔的編號(hào)。然后根據(jù)這些編號(hào)去文檔列表中找到文檔。
四. 查詢索引
查詢索引也是搜索的過程。搜索就是用戶輸入關(guān)鍵字,從索引(Index)中進(jìn)行搜索的 過程。根據(jù)關(guān)鍵字搜索索引,根據(jù)索引找到對(duì)應(yīng)的文檔。
第一步:創(chuàng)建用戶接口,即用戶輸入關(guān)鍵字的地方。

第二步:創(chuàng)建查詢,指定查詢的域名和關(guān)鍵字。
第三步:執(zhí)行查詢。
第四步:渲染結(jié)果(結(jié)果內(nèi)容顯示到頁面上,關(guān)鍵字需要高亮處理)。

五. 結(jié)語
我們一塊兒回顧下下本節(jié)主要學(xué)習(xí)的內(nèi)容,在這一節(jié)中我們介紹了索引和搜索流程圖,并對(duì)全文檢索的創(chuàng)建過程進(jìn)行了分析。最后對(duì)倒排索引進(jìn)行的剖析,以及索引是如何被查詢通過案例進(jìn)行了闡述和介紹。這一節(jié)的內(nèi)容你學(xué)會(huì)了嗎?