lucene教程--全文检索技术详解
一 什么是全文檢索
1.1?全文檢索概念
全文檢索是一種將文件中所有文本與檢索項匹配的檢索方法。它可以根據需要獲得全文中有關章、節、段、句、詞等信息。計算機程序通過掃描文章中的每一個詞,對每一個詞建立一個索引,指明該詞在文章中出現的次數和位置,當用戶查詢時根據建立的索引查找,類似于通過字典的檢索字表查字的過程。
經過幾年的發展,全文檢索從最初的字符串匹配程序已經演進到能對超大文本、語音、圖像、活動影像等非結構化數據進行綜合管理的大型軟件。本教程只討論文本檢索。
主要應用領域:搜索引擎(百度,搜狗)、站內搜索(微博搜索)、電商網站(京東,淘寶)
1.2?全文檢索和數據庫like查詢的區別
數據查詢通常的做法是是通過數據庫模糊匹配即Like '%keyword%'的方式,通過它和全文檢索對比來分析數據庫like模糊查詢和全文檢索的區別。
1.2.1?數據結構
1.2.1.1?結構化數據
數據庫中存儲的數據是結構化數據,即行數據,可以用二維表結構來邏輯表達實現的數據,結構化數據是指具有固定格式或有限長度的數據,如數據庫元數據等。
1.2.1.2?非結構化數據
不方便用數據庫二維邏輯表來表現的數據即稱為非結構化數據,包括所有格式的辦公文檔、文本、圖片、標準通用標記語言下的子集XML、HTML、各類報表、圖像和音頻/視頻信息等等。
l?非結構化數據:指不定長或無固定格式的數據,如郵件,word文檔等。
l?半結構數據:就是介于完全結構化數據(如關系型數據庫、面向對象數據庫中的數據)和完全無結構的數據(如聲音、圖像文件等)之間的數據,HTML、XML文檔就屬于半結構化數據,數據的結構和內容混在一起,沒有明顯的區分。
1.2.2?搜索原理
1.2.2.1?順序掃描
數據庫的like查詢采用順序掃描的方法匹配字符串,查找結構化數據中存在某字符串的記錄,如下:
查詢table表中title字段出現XXXX字符的記錄。
select * from table where title like ‘%XXXX%’
windows的搜索也是順序掃描,比如要找內容包含某一個字符串的文件,就是一個文檔一個文檔的搜索,對于每一個文檔,從頭找到尾,如果此文檔包含此字符串,則此文檔為我們要找的文件,接著看下一個文件,直到掃描完所有的文件。
順序掃描問題:如果要查詢的目標數據源量大且內容多,采用順序掃描方法查詢過程較慢,比如你有一個幾十G的硬盤,如果想在上面找到一個內容包含某字符串的文件,將會非常耗時。
什么時候使用順序掃描?對于查詢的目標數據源量小、內容少的情況時采用順序掃描是很快的。
1.2.2.2?全文檢索
對于查詢目標數據源量大且內容多時,特別是如果查詢的數據源為非結構化數據,這時就要采用全文檢索方法進行查詢。
全文檢索首先將要查詢的目標數據源中的一部分信息提取出來,組成索引,通過查詢索引達到搜索目標數據源的目的,所以速度較快。
這種先建立索引,再對索引進行搜索的過程就叫全文檢索(Full-text Search)。
如下圖是對文件搜索的索引:
上圖中,索引欄是從目標數據源中提取出來的詞,在進行全文檢索時是通過搜索索引(搜索索引中的詞)從而找到索引對應的文件即目標數據源。
1.2.3?搜索效果
1.2.3.1?匹配準確性
使用數據庫like搜索關鍵字“java”會把“javascript”也查詢出來,因為javascript和'%java%'匹配。
使用搜索引擎搜索關鍵字“java”不會把“javascript”查詢出來,因為在對“javascript”創建索引時不會把“java”抽取出來放在索引中,而是把“javascript”當成一個整體放在索引中,在進行全文檢索時根據“java”在索引中找不到,通過“javascript”是可以找到的。
1.2.3.2?相關度排序
使用數據庫like搜索關鍵字“java”,查詢結果中不會把與關鍵字相關度最高的記錄排在最前邊,數據庫的排序只能根據由高到低或按字母順序排序。
使用搜索引擎搜索關鍵字“java”,查詢結果中會把關鍵字相關度最高的記錄排在最前邊,在進行全文檢索時會計算哪些記錄與關鍵字的相關度最高,最高相關度的記錄會排在前邊。
1.2.3.3?搜索速度
使用數據庫like搜索,如果目標數據源記錄多且內容大,查詢速度慢。
使用搜索引擎搜索,速度非常快。
1.2.4?應用領域
1.2.4.1?數據庫like查詢
對于數據量不大、數據結構固定的數據可采用關系數據庫存儲,通過關系數據庫提供的模糊匹配方式查詢用戶需要的數據,比如學校的學生管理系統、企業人事管理系統等。
1.2.4.2?全文檢索
對于數據量大、數據結構不固定的數據可采用全文檢索方式搜索,比如百度、Google等搜索引擎、論壇站內搜索、電商網站站內搜索等。
二 Lucene實現全文檢索
2.1?什么是Lucene?
Lucene是apache下的一個開放源代碼的全文檢索引擎工具包。提供了完整的查詢引擎和索引引擎,部分文本分析引擎。Lucene的目的是為軟件開發人員提供一個簡單易用的工具包,以方便的在目標系統中實現全文檢索的功能。
2.2?Lucene與搜索引擎的區別
全文檢索系統是按照全文檢索理論建立起來的用于提供全文檢索服務的軟件系統。全文檢索系統是一個可以運行的系統,包括建立索引、處理查詢返回結果集、增加索引、優化索引結構等功能。例如:百度搜索、eclipse幫助搜索、淘寶網商品搜索。
搜索引擎是全文檢索技術最主要的一個應用,例如百度。搜索引擎起源于傳統的信息全文檢索理論,即計算機程序通過掃描每一篇文章中的每一個詞,建立以詞為單位的倒排文件,檢索程序根據檢索詞在每一篇文章中出現的頻率和每一個檢索詞在一篇文章中出現的概率,對包含這些檢索詞的文章進行排序,最后輸出排序的結果。全文檢索技術是搜索引擎的核心支撐技術。
Lucene和搜索引擎不同,Lucene是一套用java寫的全文檢索的工具包,為應用程序提供了很多個api接口去調用,可以簡單理解為是一套實現全文檢索的類庫,搜索引擎是一個全文檢索系統,它是一個單獨運行的軟件。
2.3?安裝Lucene
Lucene是開發全文檢索功能的工具包,從官方網站下載Lucene4.10.3,并解壓。
官方網站:http://lucene.apache.org/
版本:lucene4.10.3
Jdk要求:1.7以上
2.4?Lucene主要包結構
?
2.5?案例描述
我們以一個案例來研究全文檢索系統架構:實現一個資源管理器的搜索功能,通過關鍵字搜索文件,凡是文件名或文件內容包括關鍵字的文件都需要找出來。
根據上邊的架構圖分別從索引和搜索兩個過程來描述實現過程。
2.6?索引和搜索流程圖
?
1、綠色表示索引過程,對要搜索的原始內容進行索引構建一個索引庫,索引過程包括:
確定原始內容即要搜索的內容--》采集文檔--》創建文檔--》分析文檔--》索引文檔
2、紅色表示搜索過程,從索引庫中搜索內容,搜索過程包括:
用戶通過搜索界面--》創建查詢--》執行搜索,從索引庫搜索--》渲染搜索結果
2.7?索引流程
對文檔索引的過程,將用戶要搜索的文檔內容進行索引,索引存儲在索引庫(index)中。
這里我們要搜索的文檔是磁盤上的文本文件,根據案例描述:凡是文件名或文件內容包括關鍵字的文件都要找出來,這里要對文件名和文件內容創建索引。
2.7.1?原始內容
原始內容是指要索引和搜索的內容。原始內容包括互聯網上的網頁、數據庫中的數據、磁盤上的文件等。
本案例中的原始內容就是磁盤上的文件,如下圖:
2.7.2?獲取原始內容(信息采集)
從互聯網上、數據庫、文件系統中等獲取需要搜索的原始信息,這個過程就是信息采集,信息采集的目的是為了對原始內容進行索引。
在Internet上采集信息的軟件通常稱為爬蟲或蜘蛛,也稱為網絡機器人,爬蟲訪問互聯網上的每一個網頁,將獲取到的網頁內容存儲起來。
Lucene不提供信息采集的類庫,需要自己編寫一個爬蟲程序實現信息采集,也可以通過一些開源軟件實現信息采集,如下:
Solr(http://lucene.apache.org/solr) ,solr是apache的一個子項目,支持從關系數據庫、xml文檔中提取原始數據。
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 開發的、開源的網絡爬蟲,用戶可以使用它來從網上抓取想要的資源。其最出色之處在于它良好的可擴展性,方便用戶實現自己的抓取邏輯。
2.7.3?創建文檔
獲取原始內容的目的是為了索引,在索引前需要將原始內容創建成文檔(Document),文檔中包括一個一個的域(Field),域中存儲內容。
這里我們可以將磁盤上的一個文件當成一個document,Document中包括一些Field(file_name文件名稱、file_path文件路徑、file_size文件大小、file_content文件內容),如下圖:
?
注意:每個Document可以有多個Field,不同的Document可以有不同的Field,同一個Document可以有相同的Field(域名和域值都相同)
2.7.4?分析文檔
將原始內容創建為包含域(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
2.7.5?索引文檔
對所有文檔分析得出的語匯單元進行索引,索引的目的是為了搜索,最終要實現只搜索被索引的語匯單元從而找到Document(文檔)。
注意:創建索引是對語匯單元索引,通過詞語找文檔,這種索引的結構叫倒排索引結構。
傳統方法是根據文件找到該文件的內容,在文件內容中匹配搜索關鍵字,這種方法是順序掃描方法,數據量大、搜索慢。
倒排索引結構是根據內容(詞語)找文檔,如下圖:
?
根據左邊的索引詞典可以找到詞對應的文檔。“springmvc.txt”這個詞在Document1(springmvc.txt) ,“web”和“spring”在Document1、Document2中都存在,詞是通過Field和Document文檔聯系起來的。
?
倒排索引結構也叫反向索引結構,包括索引和文檔兩部分,索引即詞匯表,它的規模較小,而文檔集合較大。
2.8?搜索流程
搜索就是用戶輸入關鍵字,從索引(index)中進行搜索的過程。根據關鍵字搜索索引,根據索引找到對應的文檔,從而找到要搜索的內容(這里指磁盤上的文件)。
2.8.1?用戶
用戶可以是自然人,也可以是遠程調用的程序。
2.8.2?用戶搜索界面
全文檢索系統提供用戶搜索的界面供用戶提交搜索的關鍵字,搜索完成展示搜索結果。
比如:
?
Lucene不提供制作用戶搜索界面的功能,需要根據自己的需求開發搜索界面。
2.8.3?創建查詢
用戶輸入查詢關鍵字執行搜索之前需要先構建一個查詢對象,查詢對象中可以指定查詢要搜索的Field文檔域、查詢關鍵字等,查詢對象會生成具體的查詢語法,比如:
語法 “fileName:spring.txt”表示要搜索Field域的內容為“spring.txt”的文檔
語法 “lucene AND java” 表示要搜索即包括關鍵字“lucene”也包括“java”的文檔。
Lucene語句介紹:http://lucene.apache.org/core/3_0_3/queryparsersyntax.html
2.8.4?執行搜索
搜索索引過程:
1.根據查詢語法在倒排索引詞典表中分別找出對應搜索詞的索引,從而找到索引所鏈接的文檔鏈表。
比如搜索語法為“lucene AND java”表示搜索出的文檔中即要包括lucene也要包括java。
2、由于是AND,所以要對包含lucene或java詞語的鏈表進行交集,得到文檔鏈表應該包括每一個搜索詞語
3、獲取文檔中的Field域數據。
2.8.5?展示結果
以一個友好的界面將查詢結果展示給用戶,用戶根據搜索結果找自己想要的信息,為了幫助用戶很快找到自己的結果,提供了很多展示的效果,比如搜索結果中將關鍵字高亮顯示,百度提供的快照等。
?
總結
以上是生活随笔為你收集整理的lucene教程--全文检索技术详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mybatis教程--查询缓存(一级缓存
- 下一篇: Lucene教程--入门程序详解