1.搜索技術理論基礎
1.1. 搜索引擎的發展歷史
l萌芽:Archie、Gopher
l起步:Robot(網絡機器人)的出現與spider(網絡爬蟲)
l發展:excite、galaxy、yahoo
l繁榮:infoseek(百度李彥宏曾是其核心開發人員),altaVista,Google和baidu。
Robot 網絡機器人:自動在網絡中運行,完成特定任務的程序(例如刷票器)
spider 網絡爬蟲 : 是一種特殊網絡機器人,抓取(下載)並分析網絡資源
1.2. 搜索技術應用場景
應用場景 :
1、 單機軟件的搜索(word中的搜索)
2、 站內搜索 (baidu貼吧、論壇、 京東、 淘寶)
3、 專業搜索引擎公司 (谷歌、百度)
學習lucene對我們最主要的應用場景:站內搜索。
1.1. 搜索數據方法
1.1.1. 順序掃描法
順序掃描方法是先找到文件,然後在文件中找內容,在文件內容中匹配搜索關鍵字,這種方法是順序掃描方法,數據量大就搜索慢。 |
我們可以通過一個例子來理解順序掃描:
例如要查找內容中包含某一個字符串的文件,就是一個文檔一個文檔的“看”。然後每一個文檔,從頭看到尾。如果此文檔包含此字符串,則此文檔為我們要找的文件,接著看下一個文件,直到掃描完所有的文件。
1.1.2. 倒排索引(重點)
倒排索引結構是根據內容(詞語)找文檔,倒排索引結構也叫反向索引結構,包括索引和文檔兩部分,索引即詞彙表,它是在索引中匹配搜索關鍵字,由於索引內容量有限並且採用固定優化算法搜索速度很快,找到了索引中的詞彙,詞彙與文檔關聯,從而最終找到了文檔。 |
我們可以再通過一個例子來理解倒排索引。
例如我們使用新華字典查詢漢字,新華字典有偏旁部首的目錄(索引)。我們查字首先查這個目錄,找到這個目錄中對應的偏旁部首,就可以通過這個目錄中的偏旁部首找到這個字所在的位置頁面(文檔),而這個偏旁部首目錄就是倒排索引結構的。
1.1.2.1. 倒排索引結構理解
現在有兩篇文檔:
Doc1: When in Rome, do as the Romans do.
Doc2: When do you come back from Rome?
Lucene會對以上兩篇文檔建立倒排索引
倒排索引結構如下圖:
2.Lucene介紹
Lucene是使用java實現的全文檢索庫。
所以學習lucene還要先了解全文檢索。
全文檢索和搜索之間的聯繫,全文檢索只是利用倒排索引結構實現的一種搜索技術。
1.1. 什麼是全文索引
全文檢索的概念:
全文檢索,首先將要查詢的目標文檔中的詞提取出來,組成索引,通過查詢索引達到搜索目標文檔的目的。這種先建立索引,再根據索引搜索文檔的過程就叫全文檢索(Full-text Search)。 |
1.2. 什麼是Lucene
全文檢索是一種思想或者說是一種架構,而lucene就是實現該架構的一門全文檢索技術。
Lucene是apache軟件基金會4 jakarta項目組的一個子項目,是一個開放源代碼的全文檢索引擎工具包,但它不是一個完整的全文檢索引擎,而是一個全文檢索引擎的架構,提供了完整的查詢引擎和索引引擎,部分文本分析引擎(英文與德文兩種西方語言)。Lucene的目的是為軟件開發人員提供一個簡單易用的工具包,以方便的在目標系統中實現全文檢索的功能,或者是以此為基礎建立起完整的全文檢索引擎。
Lucene就是全文檢索的核心依賴庫。它不能獨立運行,只是提供給程序員,讓程序員使用它實現全文檢索的應用。
1.1. 為什麼要學習Lucene
原來的方式實現搜索功能,我們的搜索流程如下圖:
上圖就是原始搜索引擎技術,如果用戶比較少而且數據庫的數據量比較小,那麼這種方式實現搜索功能在企業中是比較常見的。
但是數據量過多時,數據庫的壓力就會變得很大,查詢速度會變得非常慢。我們需要使用更好的解決方案來分擔數據庫的壓力。
現在的方案(使用Lucene),如下圖
為了解決數據庫壓力和速度的問題,我們的數據庫就變成了索引庫,我們使用Lucene的API的來操作服務器上的索引庫。這樣完全和數據庫進行了隔離。而且索引庫中的查詢都是根據索引來查詢,效率很快。
1.1. Lucene與搜索引擎的區別
全文檢索系統是按照全文檢索理論建立起來的用於提供全文檢索服務的軟件系統,包括建立索引、處理查詢返回結果集、增加索引、優化索引結構等功能。例如:百度搜索、eclipse幫助搜索、淘寶網商品搜索等。
搜索引擎是全文檢索技術最主要的一個應用,例如百度。搜索引擎起源於傳統的信息全文檢索理論,即計算機程序通過掃描每一篇文章中的每一個詞,建立以詞為單位的倒排文件,檢索程序根據檢索詞在每一篇文章中出現的頻率和每一個檢索詞在一篇文章中出現的概率,對包含這些檢索詞的文章進行排序,最後輸出排序的結果。全文檢索技術是搜索引擎的核心支撐技術。
Lucene和搜索引擎不同: 1、Lucene是一套用java或其它語言寫的全文檢索的工具包,為應用程序提供了很多個api接口去調用,可以簡單理解為是一套實現全文檢索的類庫。 2、搜索引擎是一個全文檢索系統,它是一個單獨運行的軟件系統。 |
1.2. Lucene官網
官網: http://lucene.apache.org/
1.1. Lucene主要包結構
3.Lucene全文檢索的流程
1.1. 索引和搜索流程圖
1、綠色表示索引過程,對要搜索的原始內容進行索引構建一個索引庫,索引過程包括:
確定原始內容即要搜索的內容->獲得文檔->創建文檔->分析文檔->索引文檔
2、紅色表示搜索過程,從索引庫中搜索內容,搜索過程包括:
用戶通過搜索界面->創建查詢->執行搜索,從索引庫搜索->渲染搜索結果
1.1. 索引流程
索引流程也就是對文檔索引的過程。也就是將用戶要搜索的文檔內容進行索引,索引存儲在索引庫(index)中。
索引流程拆分為幾個子流程,我們需要逐個瞭解。
1.1.1. 原始內容
原始內容是指要索引和搜索的內容。原始內容包括互聯網上的網頁、數據庫中的數據、磁盤上的文件等。
1.1.2. 獲得文檔(採集數據)
從互聯網上、數據庫、文件系統中等獲取需要搜索的原始信息,這個過程就是信息採集,採集數據的目的是為了對原始內容進行索引。
採集的數據分類:
1、對於互聯網上網頁,可以使用工具將網頁抓取到本地生成html文件。
2、數據庫中的數據,可以直接連接數據庫讀取表中的數據。
3、文件系統中的某個文件,可以通過I/O操作讀取文件的內容。
在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 開發的、開源的網絡爬蟲,用戶可以使用它來從網上抓取想要的資源。其最出色之處在於它良好的可擴展性,方便用戶實現自己的抓取邏輯。
1.1.1. 創建文檔
獲取原始內容的目的是為了索引,在索引前需要將原始內容創建成文檔(Document),文檔中包括一個一個的域(Field),域中存儲內容。
這裡我們可以將磁盤上的一個文件當成一個document,也可以將數據庫中的一條記錄當成一個Document。Document中包括一些Field,如下圖:
注意:每個Document可以有多個Field,不同的Document可以有不同的Field,同一個Document可以有相同的Field(域名和域值都相同)
1.1.1. 分析文檔
將原始內容創建為包含域(Field)的文檔(document),需要再對域中的內容進行分析,分析的過程是經過對原始文檔提取單詞、將字母轉為小寫、去除標點符號、去除停用詞等過程生成最終的語彙單元,可以將語彙單元理解為一個一個的單詞。
簡單點說,分析文檔的過程就是分詞。主要分為兩步:分詞、過濾。
如何分詞?
1、對原始文檔提取單詞
如何過濾?
2、去除標點符號
3、將字母轉為小寫
4、去除停用詞
最終形成語彙單元(token)。而token需要再被處理為詞項(Term)。Term才是一個索引結構中最小的單位。
比如下邊的文檔經過分析如下:
原文檔內容:
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 is a Java full-text search engine.
分詞:
Lucene
is
a
Java
Full
-
text
search
engine
.
除去標點符號:
Lucene
is
a
Java
Full
text
search
engine
大寫轉小寫過濾:
lucene
is
a
java
full
text
search
engine
去除停用詞過濾:
lucene
java
full
text
search
engine
分析後得到的語彙單元(Token):
lucene、java、full、search、engine、java。。。。
如果一個原始文檔中,同樣的詞,有多個,那麼Token是多個。
得到語彙單元之後,分詞器會將token處理為term。同樣的詞對應的不同的token,最終會合併為一個Term。
1.1.1. 索引文檔
對所有文檔分析得出的語彙單元進行索引,索引的目的是為了搜索,最終要實現只搜索被索引的語彙單元從而找到Document(文檔)。
創建索引是對語彙單元索引,通過詞語找文檔,這種索引的結構叫倒排索引結構。
倒排索引結構是根據內容(詞彙)找文檔,如下圖:
要搜索的內容。
1.1.1. 用戶
用戶可以是自然人,也可以是遠程調用的程序。
1.1.2. 用戶搜索界面
全文檢索系統提供用戶搜索的界面供用戶提交搜索的關鍵字,搜索完成展示搜索結果。
如下圖:
Lucene不提供製作用戶搜索界面的功能,需要根據自己的需求開發搜索界面。
1.1.1. 創建查詢
用戶輸入查詢關鍵字執行搜索之前需要先構建一個查詢對象,查詢對象中可以指定查詢要查詢關鍵字、要搜索的Field文檔域等,查詢對象會生成具體的查詢語法,比如:
name:lucene表示要搜索name這個Field域中,內容為“lucene”的文檔。
desc:lucene AND desc:java 表示要搜索即包括關鍵字“lucene”也包括“java”的文檔。
1.1.2. 執行搜索
搜索索引過程:
1.根據查詢語法在倒排索引詞典表中分別找出對應搜索詞的索引,從而找到索引所鏈接的文檔鏈表。
例如搜索語法為“desc:lucene AND desc:java”表示搜索出的文檔中既要包括lucene也要包括java。
2、由於是AND,所以要對包含lucene或java詞語的鏈表進行交集,得到的文檔鏈表應該包括每一個搜索詞語
3、獲取文檔中的Field域數據。
1.1.3. 渲染結果(瞭解)
以一個友好的界面將查詢結果展示給用戶,用戶根據搜索結果找自己想要的信息,為了幫助用戶很快找到自己的結果,提供了很多展示的效果,比如搜索結果中將關鍵字高亮顯示,百度提供的快照等。
由於篇幅有限,小編後續還會寫幾篇文章繼續詳細的介紹Lucene等相關技術,並會附加案例,請繼續關注,謝謝!