1.搜索技術(shù)理論基礎(chǔ)
1.1. 為什么要學(xué)習(xí)Lucene
原來(lái)的方式實(shí)現(xiàn)搜索功能客们,我們的搜索流程如下圖:
上圖就是原始搜索引擎技術(shù)凝危,如果用戶比較少而且數(shù)據(jù)庫(kù)的數(shù)據(jù)量比較小,那么這種方式實(shí)現(xiàn)搜索功能在企業(yè)中是比較常見(jiàn)的势篡。
但是數(shù)據(jù)量過(guò)多時(shí)饶辙,數(shù)據(jù)庫(kù)的壓力就會(huì)變得很大,查詢速度會(huì)變得非常慢迂苛。我們需要使用更好的解決方案來(lái)分擔(dān)數(shù)據(jù)庫(kù)的壓力三热。
現(xiàn)在的方案(使用Lucene),如下圖
為了解決數(shù)據(jù)庫(kù)壓力和速度的問(wèn)題三幻,我們的數(shù)據(jù)庫(kù)就變成了索引庫(kù)就漾,我們使用Lucene的API的來(lái)操作服務(wù)器上的索引庫(kù)。這樣完全和數(shù)據(jù)庫(kù)進(jìn)行了隔離念搬。
1.2. 數(shù)據(jù)查詢方法
1.2.1. 順序掃描法
所謂順序掃描抑堡,例如要找內(nèi)容包含一個(gè)字符串的文件,就是一個(gè)文檔一個(gè)文檔的看朗徊,對(duì)于每一個(gè)文檔首妖,從頭看到尾,如果此文檔包含此字符串爷恳,則此文檔為我們要找的文件有缆,接著看下一個(gè)文件,直到掃描完所有的文件。
這種方法是順序掃描方法棚壁,數(shù)據(jù)量大就搜索慢杯矩。
1.2.2. 倒排索引
先舉一個(gè)栗子:
例如我們使用新華字典查詢漢字,新華字典有偏旁部首的目錄(索引)灌曙,我們查字首先查這個(gè)目錄菊碟,找到這個(gè)目錄中對(duì)應(yīng)的偏旁部首,就可以通過(guò)這個(gè)目錄中的偏旁部首找到這個(gè)字所在的位置(文檔)在刺。
Lucene會(huì)對(duì)文檔建立倒排索引
- 1逆害、 提取資源中關(guān)鍵信息, 建立索引 (目錄)
- 2蚣驼、 搜索時(shí)魄幕,根據(jù)關(guān)鍵字(目錄),找到資源的位置
1.3. 搜索技術(shù)應(yīng)用場(chǎng)景
應(yīng)用場(chǎng)景 :
- 1颖杏、 單機(jī)軟件的搜索(word中的搜索)
- 2纯陨、 站內(nèi)搜索 (baidu貼吧、論壇留储、 京東翼抠、 taobao)
- 3、 垂直領(lǐng)域的搜索 (818工作網(wǎng))
- 4获讳、 專業(yè)搜索引擎公司 (google阴颖、baidu)
2. Lucene介紹
2.1. 什么是全文索引
計(jì)算機(jī)索引程序通過(guò)掃描文章中的每一個(gè)詞,對(duì)每一個(gè)詞建立一個(gè)索引丐膝,指明該詞在文章中出現(xiàn)的次數(shù)和位置量愧,當(dāng)用戶查詢時(shí),檢索程序就根據(jù)事先建立的索引進(jìn)行查找帅矗,并將查找的結(jié)果反饋給用戶的檢索方式
2.2. 什么是Lucene
Lucene是apache軟件基金會(huì)4 jakarta項(xiàng)目組的一個(gè)子項(xiàng)目偎肃,是一個(gè)開(kāi)放源代碼的全文檢索引擎工具包,但它不是一個(gè)完整的全文檢索引擎浑此,而是一個(gè)全文檢索引擎的架構(gòu)累颂,提供了完整的查詢引擎和索引引擎,部分文本分析引擎(英文與德文兩種西方語(yǔ)言)凛俱。
Lucene的目的是為軟件開(kāi)發(fā)人員提供一個(gè)簡(jiǎn)單易用的工具包喘落,以方便的在目標(biāo)系統(tǒng)中實(shí)現(xiàn)全文檢索的功能,或者是以此為基礎(chǔ)建立起完整的全文檢索引擎最冰。
目前已經(jīng)有很多應(yīng)用程序的搜索功能是基于 Lucene 的,比如 Eclipse 的幫助系統(tǒng)的搜索功能稀火。Lucene 能夠?yàn)槲谋绢愋偷臄?shù)據(jù)建立索引暖哨,所以你只要能把你要索引的數(shù)據(jù)格式轉(zhuǎn)化的文本的,Lucene 就能對(duì)你的文檔進(jìn)行索引和搜索。比如你要對(duì)一些 HTML 文檔篇裁,PDF 文檔進(jìn)行索引的話你就首先需要把 HTML 文檔和 PDF 文檔轉(zhuǎn)化成文本格式的沛慢,然后將轉(zhuǎn)化后的內(nèi)容交給 Lucene 進(jìn)行索引,然后把創(chuàng)建好的索引文件保存到磁盤(pán)或者內(nèi)存中达布,最后根據(jù)用戶輸入的查詢條件在索引文件上進(jìn)行查詢团甲。不指定要索引的文檔的格式也使 Lucene 能夠幾乎適用于所有的搜索應(yīng)用程序。
- Lucene是一套用于全文檢索和搜尋的開(kāi)源程式庫(kù)黍聂,由Apache軟件基金會(huì)支 持和提供
- Lucene提供了一個(gè)簡(jiǎn)單卻強(qiáng)大的應(yīng)用程式接口躺苦,能夠做全文索引和搜尋, 在Java開(kāi)發(fā)環(huán)境里L(fēng)ucene是一個(gè)成熟的免費(fèi)開(kāi)放源代碼工具
- Lucene并不是現(xiàn)成的搜索引擎產(chǎn)品产还,但可以用來(lái)制作搜索引擎產(chǎn)品
2.3 Lucene與搜索引擎的區(qū)別
全文檢索系統(tǒng)是按照全文檢索理論建立起來(lái)的用于提供全文檢索服務(wù)的軟件系統(tǒng)匹厘,包括建立索引、處理查詢返回結(jié)果集脐区、增加索引愈诚、優(yōu)化索引結(jié)構(gòu)等功能。例如:百度搜索牛隅、eclipse幫助搜索炕柔、淘寶網(wǎng)商品搜索等。
搜索引擎是全文檢索技術(shù)最主要的一個(gè)應(yīng)用媒佣,例如百度匕累。搜索引擎起源于傳統(tǒng)的信息全文檢索理論,即計(jì)算機(jī)程序通過(guò)掃描每一篇文章中的每一個(gè)詞丈攒,建立以詞為單位的倒排文件哩罪,檢索程序根據(jù)檢索詞在每一篇文章中出現(xiàn)的頻率和每一個(gè)檢索詞在一篇文章中出現(xiàn)的概率,對(duì)包含這些檢索詞的文章進(jìn)行排序巡验,最后輸出排序的結(jié)果际插。全文檢索技術(shù)是搜索引擎的核心支撐技術(shù)。
Lucene和搜索引擎不同显设,Lucene是一套用java或其它語(yǔ)言寫(xiě)的全文檢索的工具包框弛,為應(yīng)用程序提供了很多個(gè)api接口去調(diào)用,可以簡(jiǎn)單理解為是一套實(shí)現(xiàn)全文檢索的類庫(kù)捕捂,搜索引擎是一個(gè)全文檢索系統(tǒng)瑟枫,它是一個(gè)單獨(dú)運(yùn)行的軟件系統(tǒng)
2.4 Lucene官網(wǎng)
官網(wǎng): http://lucene.apache.org/
3. Lucene全文檢索的流程
- 1、綠色表示索引過(guò)程指攒,對(duì)要搜索的原始內(nèi)容進(jìn)行索引構(gòu)建一個(gè)索引庫(kù)慷妙,索引過(guò)程包括:
確定原始內(nèi)容即要搜索的內(nèi)容à獲得文檔à創(chuàng)建文檔à分析文檔à索引文檔
- 2、紅色表示搜索過(guò)程允悦,從索引庫(kù)中搜索內(nèi)容膝擂,搜索過(guò)程包括:
用戶通過(guò)搜索界面à創(chuàng)建查詢à執(zhí)行搜索,從索引庫(kù)搜索à渲染搜索結(jié)果
3.2 索引流程
對(duì)文檔索引的過(guò)程,將用戶要搜索的文檔內(nèi)容進(jìn)行索引架馋,索引存儲(chǔ)在索引庫(kù)(index)中狞山。
3.2.1 原始內(nèi)容
原始內(nèi)容是指要索引和搜索的內(nèi)容。
原始內(nèi)容包括互聯(lián)網(wǎng)上的網(wǎng)頁(yè)叉寂、數(shù)據(jù)庫(kù)中的數(shù)據(jù)萍启、磁盤(pán)上的文件等。
3.2.2 獲得文檔(采集數(shù)據(jù))
從互聯(lián)網(wǎng)上屏鳍、數(shù)據(jù)庫(kù)勘纯、文件系統(tǒng)中等獲取需要搜索的原始信息,這個(gè)過(guò)程就是信息采集孕蝉,采集數(shù)據(jù)的目的是為了對(duì)原始內(nèi)容進(jìn)行索引屡律。
采集數(shù)據(jù)分類:
- 1、對(duì)于互聯(lián)網(wǎng)上網(wǎng)頁(yè)降淮,可以使用工具將網(wǎng)頁(yè)抓取到本地生成html文件超埋。
- 2、數(shù)據(jù)庫(kù)中的數(shù)據(jù)佳鳖,可以直接連接數(shù)據(jù)庫(kù)讀取表中的數(shù)據(jù)霍殴。
- 3、文件系統(tǒng)中的某個(gè)文件系吩,可以通過(guò)I/O操作讀取文件的內(nèi)容来庭。
在Internet上采集信息的軟件通常稱為爬蟲(chóng)或蜘蛛,也稱為網(wǎng)絡(luò)機(jī)器人穿挨,爬蟲(chóng)訪問(wèn)互聯(lián)網(wǎng)上的每一個(gè)網(wǎng)頁(yè)月弛,將獲取到的網(wǎng)頁(yè)內(nèi)容存儲(chǔ)起來(lái)。
3.2.3. 創(chuàng)建文檔
獲取原始內(nèi)容的目的是為了索引科盛,在索引前需要將原始內(nèi)容創(chuàng)建成文檔(Document)帽衙,文檔中包括一個(gè)一個(gè)的域(Field),域中存儲(chǔ)內(nèi)容贞绵。
這里我們可以將磁盤(pán)上的一個(gè)文件當(dāng)成一個(gè)document厉萝,Document中包括一些Field,如下圖:
- 注意:每個(gè)Document可以有多個(gè)Field榨崩,不同的Document可以有不同的Field谴垫,同一個(gè)Document可以有相同的Field(域名和域值都相同)
3.2.4. 分析文檔
將原始內(nèi)容創(chuàng)建為包含域(Field)的文檔(document),需要再對(duì)域中的內(nèi)容進(jìn)行分析母蛛,分析成為一個(gè)一個(gè)的單詞翩剪。
比如下邊的文檔經(jīng)過(guò)分析如下:
原文檔內(nèi)容:
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。博杖。。筷登。
3.2.5. 索引文檔
對(duì)所有文檔分析得出的語(yǔ)匯單元進(jìn)行索引剃根,索引的目的是為了搜索,最終要實(shí)現(xiàn)只搜索被索引的語(yǔ)匯單元從而找到Document(文檔)前方。
創(chuàng)建索引是對(duì)語(yǔ)匯單元索引狈醉,通過(guò)詞語(yǔ)找文檔,這種索引的結(jié)構(gòu)叫倒排索引結(jié)構(gòu)惠险。
倒排索引結(jié)構(gòu)是根據(jù)內(nèi)容(詞匯)找文檔苗傅,如下圖:
倒排索引結(jié)構(gòu)也叫反向索引結(jié)構(gòu),包括索引和文檔兩部分班巩,索引即詞匯表渣慕,它的規(guī)模較小,而文檔集合較大抱慌。
3.3. 搜索流程
搜索就是用戶輸入關(guān)鍵字逊桦,從索引中進(jìn)行搜索的過(guò)程。根據(jù)關(guān)鍵字搜索索引抑进,根據(jù)索引找到對(duì)應(yīng)的文檔强经,從而找到要搜索的內(nèi)容。
3.3.1. 用戶
就是使用搜索的角色寺渗,用戶可以是自然人匿情,也可以是遠(yuǎn)程調(diào)用的程序。
3.3.2. 用戶搜索界面
全文檢索系統(tǒng)提供用戶搜索的界面供用戶提交搜索的關(guān)鍵字信殊,搜索完成展示搜索結(jié)果炬称。如下圖:
Lucene不提供制作用戶搜索界面的功能,需要根據(jù)自己的需求開(kāi)發(fā)搜索界面鸡号。
3.3.3. 創(chuàng)建查詢
用戶輸入查詢關(guān)鍵字執(zhí)行搜索之前需要先構(gòu)建一個(gè)查詢對(duì)象转砖,查詢對(duì)象中可以指定查詢要查詢關(guān)鍵字、要搜索的Field文檔域等鲸伴,查詢對(duì)象會(huì)生成具體的查詢語(yǔ)法,比如:
name:lucene表示要搜索name這個(gè)Field域中汞窗,內(nèi)容為“l(fā)ucene”的文檔姓赤。
desc:lucene AND desc:java 表示要搜索即包括關(guān)鍵字“l(fā)ucene”也包括“java”的文檔。
3.3.4. 執(zhí)行搜索
搜索索引過(guò)程:
-
1.根據(jù)查詢語(yǔ)法在倒排索引詞典表中分別找出對(duì)應(yīng)搜索詞的索引仲吏,從而找到索引所鏈接的文檔鏈表不铆。
例如搜索語(yǔ)法為“desc:lucene AND desc:java”表示搜索出的文檔中既要包括lucene也要包括java蝌焚。
圖片.png
2、由于是AND誓斥,所以要對(duì)包含lucene或java詞語(yǔ)的鏈表進(jìn)行交集只洒,得到文檔鏈表應(yīng)該包括每一個(gè)搜索詞語(yǔ)
3、獲取文檔中的Field域數(shù)據(jù)劳坑。
3.3.5. 渲染結(jié)果
以一個(gè)友好的界面將查詢結(jié)果展示給用戶毕谴,用戶根據(jù)搜索結(jié)果找自己想要的信息,為了幫助用戶很快找到自己的結(jié)果距芬,提供了很多展示的效果涝开,比如搜索結(jié)果中將關(guān)鍵字高亮顯示,百度提供的快照等框仔。
4.lucene入門(mén)
待補(bǔ)ing....