Lucene(二)Lucene實現全文檢索的流程

1. 索引和搜索流程圖

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

    確定原始內容即要搜索的內容→採集文檔→創建文檔→分析文檔→索引文檔

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

    用戶通過搜索界面→創建查詢→執行搜索,從索引庫搜索→渲染搜索結果

 

2. 創建索引

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

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

2.1   獲得原始文檔

原始文檔是指要索引和搜索的內容。原始內容包括互聯網上的網頁、數據庫中的數據、磁盤上的文件等。

本案例中的原始內容就是磁盤上的文件,如下圖:

從互聯網上、數據庫、文件系統中等獲取需要搜索的原始信息,這個過程就是信息採集,信息採集的目的是爲了對原始內容進行索引。在Internet上採集信息的軟件通常稱爲爬蟲或蜘蛛,也稱爲網絡機器人,爬蟲訪問互聯網上的每一個網頁,將獲取到的網頁內容存儲起來。

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

  • Nutch(http://lucene.apache.org/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.2.   創建文檔對象

獲取原始內容的目的是爲了索引,在索引前需要將原始內容創建成文檔(Document),文檔中包括一個一個的域(Field),域中存儲內容。

這裏我們可以將磁盤上的一個文件當成一個document,Document中包括一些Field(file_name文件名稱、file_path文件路徑、file_size文件大小、file_content文件內容),如下圖:

注意:

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

 

2.3.   分析文檔

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

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

原文檔內容:

Lucene is a Java full-text search engine.  

分析後得到的語彙單元

lucene、java、full、search、engine

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

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

2.4.   創建索引

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

 

 

注意:

  • 創建索引是對語彙單元索引,通過詞語找文檔,這種索引的結構叫倒排索引結構
  • 傳統方法是根據文件找到該文件的內容,在文件內容中匹配搜索關鍵字,這種方法是順序掃描方法,數據量大、搜索慢。
  • 倒排索引結構是根據內容(詞語)找文檔,如下圖:

 

  倒排索引結構也叫反向索引結構,包括索引和文檔兩部分,索引即詞彙表,它的規模較小,而文檔集合較大。

3. 查詢索引

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

3.1 用戶查詢接口

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

比如:

Lucene不提供製作用戶搜索界面的功能,需要根據自己的需求開發搜索界面。

3.2 創建查詢

用戶輸入查詢關鍵字執行搜索之前需要先構建一個查詢對象,查詢對象中可以指定查詢要搜索的Field文檔域、查詢關鍵字等,查詢對象會生成具體的查詢語法,

例如:

語法 “fileName:lucene”表示要搜索Field域的內容爲“lucene”的文檔

3.3 執行查詢

搜索索引過程:

根據查詢語法在倒排索引詞典表中分別找出對應搜索詞的索引,從而找到索引所鏈接的文檔鏈表。

比如搜索語法爲“fileName:lucene”表示搜索出fileName域中包含Lucene的文檔。

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

3.4 渲染結果

以一個友好的界面將查詢結果展示給用戶,用戶根據搜索結果找自己想要的信息,爲了幫助用戶很快找到自己的結果,提供了很多展示的效果,比如搜索結果中將關鍵字高亮顯示,百度提供的快照等。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章