1. 程式人生 > >Lucene之全文檢索的流程

Lucene之全文檢索的流程

一、索引和搜尋流程圖

1、綠色表示索引過程,對要搜尋的原始內容進行索引構建一個索引庫,索引過程包括:

確定原始內容即要搜尋的內容-----採集文件-----建立文件-----分析文件-----索引文件

2、紅色表示搜尋過程,從索引庫中搜索內容,搜尋過程包括:

使用者通過搜尋介面-----建立查詢-----執行搜尋(從索引庫搜尋)-----渲染搜尋結果

 

二、建立索引

對文件索引的過程,將使用者要搜尋的文件內容進行索引,索引儲存在索引庫(index)中。

這裡我們要搜尋的文件是磁碟上的文字檔案,根據案例描述:凡是檔名或檔案內容包括關鍵字的檔案都要找出來,這裡要對檔名和檔案內容建立索引。

1.獲得原始文件

原始文件是指要索引和搜尋的內容。原始內容包括網際網路上的網頁、資料庫中的資料、磁碟上的檔案等。 本案例中的原始內容就是磁碟上的檔案,如上圖。

從網際網路上、資料庫、檔案系統中等獲取需要搜尋的原始資訊,這個過程就是資訊採集,資訊採集的目的是為了對原始內容進行索引。

在Internet上採集資訊的軟體通常稱為爬蟲或蜘蛛,也稱為網路機器人,爬蟲訪問網際網路上的每一個網頁,將獲取到的網頁內容儲存起來。

Lucene不提供資訊採集的類庫,需要自己編寫一個爬蟲程式實現資訊採集,也可以通過一些開源軟體實現資訊採集,如下:

         Nutch(

http://lucene.apache.org/nutch), Nutch是apache的一個子專案,包括大規模爬蟲工具,能夠抓取和分辨web網站資料

         jsoup(http://jsoup.org/ ),jsoup 是一款Java 的HTML解析器,可直接解析某個URL地址、HTML文字內容。它提供了一套非常省力的API,可通過DOM,CSS以及類似於jQuery的操作方法來取出和操作資料

         heritrix(http://sourceforge.net/projects/archive-crawler/files/

),Heritrix 是一個由 java 開發的、開源的網路爬蟲,使用者可以使用它來從網上抓取想要的資源。其最出色之處在於它良好的可擴充套件性,方便使用者實現自己的抓取邏輯

本案例我們要獲取磁碟上檔案的內容,可以通過檔案流來讀取文字檔案的內容,對於pdf、doc、xls等檔案可通過第三方提供的解析工具讀取檔案內容,比如Apache POI讀取doc和xls的檔案內容。 

2.建立文件物件

取原始內容的目的是為了索引,在索引前需要將原始內容建立成文件(Document),文件中包括一個一個的(Field),域中儲存內容。這裡我們可以將磁碟上的一個檔案當成一個document,Document中包括一些Field(file_name檔名稱、file_path檔案路徑、file_size檔案大小、file_content檔案內容)。

注意:每個Document可以有多個Field,不同的Document可以有不同的Field,同一個Document可以有相同的Field(域名和域值都相同),每個文件都有一個唯一的編號,就是文件id。

3.分析文件 

將原始內容建立為包含域(Field)的文件(document),需要再對域中的內容進行分析,分析的過程是經過對原始文件提取單詞將字母轉為小寫去除標點符號去除停用詞等過程生成最終的語彙單元,可以將語彙單元理解為一個一個的單詞。

比如下邊的文件經過分析如下:

原文件內容:

Lucene is a Java full-text search engine.  Lucene is not a complete

application, but rather a code library and API that can easily be used

to add search capabilities to applications.

分析後得到的語彙單元:

lucene、java、full、search、engine。。。。

每個單詞叫做一個Term,不同的域中拆分出來的相同的單詞是不同的term。term中包含兩部分一部分是文件的域名,另一部分是單詞的內容。

例如:檔名中包含apache和檔案內容中包含的apache是不同的term。

4.建立索引 

對所有文件分析得出的語彙單元進行索引,索引的目的是為了搜尋,最終要實現只搜尋被索引的語彙單元從而找到Document(文件)。

注意:建立索引是對語彙單元索引,通過詞語找文件,這種索引的結構叫倒排索引結構

傳統方法是根據檔案找到該檔案的內容,在檔案內容中匹配搜尋關鍵字,這種方法是順序掃描方法,資料量大、搜尋慢。

倒排索引結構是根據內容(詞語)找文件,倒排索引結構也叫反向索引結構,包括索引和文件兩部分,索引即詞彙表,它的規模較小,而文件集合較大。

三、查詢索引

查詢索引也是搜尋的過程。搜尋就是使用者輸入關鍵字,從索引(index)中進行搜尋的過程。根據關鍵字搜尋索引,根據索引找到對應的文件,從而找到要搜尋的內容(這裡指磁碟上的檔案)。

1.使用者查詢介面

全文檢索系統提供使用者搜尋的介面供使用者提交搜尋的關鍵字,搜尋完成展示搜尋結果。

Lucene不提供製作使用者搜尋介面的功能,需要根據自己的需求開發搜尋介面。

2.建立查詢 

使用者輸入查詢關鍵字執行搜尋之前需要先構建一個查詢物件,查詢物件中可以指定查詢要搜尋的Field文件域、查詢關鍵字等,查詢物件會生成具體的查詢語法,例如:

語法 “fileName:lucene”表示要搜尋Field域的內容為“lucene”的文件

3.執行查詢 

根據查詢語法在倒排索引詞典表中分別找出對應搜尋詞的索引,從而找到索引所連結的文件連結串列。

比如搜尋語法為“fileName:lucene”表示搜尋出fileName域中包含Lucene的文件。

搜尋過程就是在索引上查詢域為fileName,並且關鍵字為Lucene的term,並根據term找到文件id列表。

4.渲染結果 

以一個友好的介面將查詢結果展示給使用者,使用者根據搜尋結果找自己想要的資訊,為了幫助使用者很快找到自己的結果,提供了很多展示的效果,比如搜尋結果中將關鍵字高亮顯示,百度提供的快照等。