Lucene的介紹

本文我將為大家講解全文檢索技術(shù)——Lucene,現(xiàn)在這個技術(shù)用到的比較多衍慎,我覺得大家還是應(yīng)該掌握一下转唉,不說多精通,但是應(yīng)該有所了解稳捆。在講解之前赠法,我們先來看一個案例,通過該案例引出全文檢索技術(shù)——Lucene乔夯。

案例

實現(xiàn)一個文件的搜索功能砖织,通過關(guān)鍵字搜索文件,凡是文件名或文件內(nèi)容包括關(guān)鍵字的文件都需要找出來末荐。還可以根據(jù)中文詞語進(jìn)行查詢侧纯,并且需要支持多個條件查詢。本案例中的原始內(nèi)容就是磁盤上的文件甲脏,如下圖:

需求分析

數(shù)據(jù)庫搜索

數(shù)據(jù)庫中的搜索很容易實現(xiàn)茂蚓,通常都是使用sql語句進(jìn)行查詢,而且能很快的得到查詢結(jié)果剃幌。為什么數(shù)據(jù)庫搜索很容易呢聋涨?因為數(shù)據(jù)庫中的數(shù)據(jù)存儲是有規(guī)律的,有行有列而且數(shù)據(jù)格式负乡、數(shù)據(jù)長度都是固定的牍白。

數(shù)據(jù)分類

我們生活中的數(shù)據(jù)總體分為兩種:結(jié)構(gòu)化數(shù)據(jù)和非結(jié)構(gòu)化數(shù)據(jù)。

結(jié)構(gòu)化數(shù)據(jù):指具有固定格式或有限長度的數(shù)據(jù)抖棘,如數(shù)據(jù)庫中的數(shù)據(jù)茂腥,元數(shù)據(jù)等。

非結(jié)構(gòu)化數(shù)據(jù):指不定長或無固定格式的數(shù)據(jù)切省,如郵件最岗,word文檔等磁盤上的文件。

非結(jié)構(gòu)化數(shù)據(jù)查詢方法

順序掃描法(Serial Scanning)

所謂順序掃描朝捆,比如要找內(nèi)容包含某一個字符串的文件般渡,就是一個文檔一個文檔的看,對于每一個文檔芙盘,從頭看到尾驯用,如果此文檔包含此字符串,則此文檔為我們要找的文件儒老,接著看下一個文件蝴乔,直到掃描完所有的文件。如利用windows的搜索也可以搜索文件內(nèi)容驮樊,只是相當(dāng)?shù)穆?/p>

全文檢索(Full-text Search)

將非結(jié)構(gòu)化數(shù)據(jù)中的一部分信息提取出來薇正,重新組織片酝,使其變得有一定結(jié)構(gòu),然后對此有一定結(jié)構(gòu)的數(shù)據(jù)進(jìn)行搜索挖腰,從而達(dá)到搜索相對較快的目的雕沿。這部分從非結(jié)構(gòu)化數(shù)據(jù)中提取出的然后重新組織的信息,我們稱之索引曙聂。

例如:字典晦炊。字典的拼音表和部首檢字表就相當(dāng)于字典的索引,對每一個字的解釋是非結(jié)構(gòu)化的宁脊,如果字典沒有音節(jié)表和部首檢字表断国,在茫茫辭海中找一個字只能順序掃描。然而字的某些信息可以提取出來進(jìn)行結(jié)構(gòu)化處理榆苞,比如讀音稳衬,就比較結(jié)構(gòu)化,分聲母和韻母坐漏,分別只有幾種可以一一列舉薄疚,于是將讀音拿出來按一定的順序排列,每一項讀音都指向此字的詳細(xì)解釋的頁數(shù)赊琳。我們搜索時按結(jié)構(gòu)化的拼音搜到讀音街夭,然后按其指向的頁數(shù),便可找到我們的非結(jié)構(gòu)化數(shù)據(jù)——也即對字的解釋躏筏。

這種先建立索引板丽,再對索引進(jìn)行搜索的過程就叫全文檢索(Full-text Search)

雖然創(chuàng)建索引的過程也是非常耗時的趁尼,但是索引一旦創(chuàng)建就可以多次使用埃碱,全文檢索主要處理的是查詢,所以耗時間創(chuàng)建索引是值得的酥泞。

如何實現(xiàn)全文檢索

可以使用Lucene實現(xiàn)全文檢索砚殿。Lucene是apache下的一個開放源代碼的全文檢索引擎工具包(提供了Jar包,實現(xiàn)全文檢索的類庫)芝囤。它提供了完整的查詢引擎和索引引擎似炎,部分文本分析引擎。Lucene的目的是為軟件開發(fā)人員提供一個簡單易用的工具包凡人,以方便地在目標(biāo)系統(tǒng)中實現(xiàn)全文檢索的功能名党。

注意:Lucene只是一個引擎,只是一個工具包挠轴,如果使用Lucene開發(fā)全文檢索功能,要記住Lucene是不能單獨(dú)運(yùn)行的耳幢。

全文檢索技術(shù)的應(yīng)用場景

對于數(shù)據(jù)量大岸晦、數(shù)據(jù)結(jié)構(gòu)不固定的數(shù)據(jù)可采用全文檢索方式搜索欧啤。例如:

使用全文檢索技術(shù)可以實現(xiàn)搜索引擎(百度、google…)启上,搜索引擎可以搜索互聯(lián)網(wǎng)上所有的內(nèi)容(網(wǎng)頁邢隧、pdf電子書、視頻冈在、音樂)倒慧。

Lucene和搜索引擎的區(qū)別:搜索引擎是對外提供全文檢索服務(wù),是可以單獨(dú)運(yùn)行的包券。Lucene只是一個工具包不能單獨(dú)運(yùn)行纫谅,需要在project中加入lucene的jar包,最終project在JVM中運(yùn)行溅固。

使用全文檢索技術(shù)可以實現(xiàn)站內(nèi)搜索付秕,站內(nèi)搜索只能搜索本網(wǎng)站的信息(網(wǎng)頁、pdf電子書侍郭、視頻询吴、音樂、關(guān)系數(shù)據(jù)庫中的信息等等)亮元,比如:電商網(wǎng)站搜索商品信息猛计,論壇網(wǎng)站搜索網(wǎng)內(nèi)帖子。

Lucene實現(xiàn)全文檢索的流程

索引和搜索流程圖

索引和搜索流程圖如下:

1. 綠色表示索引過程爆捞,對要搜索的原始內(nèi)容進(jìn)行索引構(gòu)建一個索引庫奉瘤,索引過程包括:確定原始內(nèi)容即要搜索的內(nèi)容→采集文檔→創(chuàng)建文檔→分析文檔→索引文檔。

2. 紅色表示搜索過程嵌削,從索引庫中搜索內(nèi)容毛好,搜索過程包括:用戶通過搜索界面→創(chuàng)建查詢→執(zhí)行搜索,從索引庫搜索→渲染搜索結(jié)果苛秕。

從上面了解到的知識點(diǎn)也可看出肌访,索引和搜索流程圖也可表示為:

總結(jié):全文檢索過程分為索引、搜索兩個過程:

索引

從關(guān)系數(shù)據(jù)庫中艇劫、互聯(lián)網(wǎng)上吼驶、文件系統(tǒng)采集源數(shù)據(jù)(要搜索的目標(biāo)信息),源數(shù)據(jù)的來源是很廣泛的店煞。

將源數(shù)據(jù)采集到一個統(tǒng)一的地方蟹演,要創(chuàng)建索引,將索引創(chuàng)建到一個索引庫(文件系統(tǒng))中顷蟀,從源數(shù)據(jù)庫中提取關(guān)鍵信息酒请,從關(guān)鍵信息中抽取一個一個,詞和源數(shù)據(jù)是有關(guān)聯(lián)的鸣个。也即創(chuàng)建索引時羞反,詞和源數(shù)據(jù)有關(guān)聯(lián)布朦,索引庫中記錄了這個關(guān)聯(lián),如果找到了詞就說明找到了源數(shù)據(jù)(http的網(wǎng)頁昼窗、pdf電子書等……)是趴。

搜索

用戶執(zhí)行搜索(全文檢索)編寫查詢關(guān)鍵字。

從索引庫中搜索索引澄惊,根據(jù)查詢關(guān)鍵字搜索索引庫中的一個一個詞唆途。

展示搜索的結(jié)果。

創(chuàng)建索引

對文檔索引的過程掸驱,將用戶要搜索的文檔內(nèi)容進(jìn)行索引肛搬,索引存儲在索引庫(index)中。

這里我們要搜索的文檔是磁盤上的文本文件亭敢,根據(jù)案例描述:凡是文件名或文件內(nèi)容包括關(guān)鍵字的文件都要找出來滚婉,這里要對文件名和文件內(nèi)容創(chuàng)建索引。

獲得原始文檔

原始文檔是指要索引和搜索的內(nèi)容帅刀。原始內(nèi)容包括互聯(lián)網(wǎng)上的網(wǎng)頁让腹、數(shù)據(jù)庫中的數(shù)據(jù)、磁盤上的文件等扣溺。本案例中的原始內(nèi)容就是磁盤上的文件骇窍,如下圖:

從互聯(lián)網(wǎng)上、數(shù)據(jù)庫锥余、文件系統(tǒng)中等數(shù)據(jù)源處獲取需要搜索的原始信息腹纳,這個過程就是信息采集,信息采集的目的是為了對原始內(nèi)容進(jìn)行索引驱犹。針對不同的源數(shù)據(jù)嘲恍,使用不同的技術(shù)進(jìn)行采集獲得原始文檔:

針對互聯(lián)網(wǎng)上的數(shù)據(jù),使用http協(xié)議抓取html網(wǎng)頁到本地雄驹,生成一個html文件佃牛。

針對關(guān)系數(shù)據(jù)庫中的數(shù)據(jù),連接數(shù)據(jù)庫讀取表中的數(shù)據(jù)。

針對文件系統(tǒng)中的數(shù)據(jù),通過流讀取文件系統(tǒng)的文件购撼。

以上技術(shù)中使用第一種較多,因為目前全文檢索主要搜索數(shù)據(jù)的來源是互聯(lián)網(wǎng)爷速,在Internet上采集信息的軟件通常稱為爬蟲或蜘蛛,也稱為網(wǎng)絡(luò)機(jī)器人霞怀,爬蟲訪問互聯(lián)網(wǎng)上的每一個網(wǎng)頁惫东,將獲取到的網(wǎng)頁內(nèi)容存儲起來,所以搜索引擎使用一種爬蟲程序抓取網(wǎng)頁( 通過http抓取html網(wǎng)頁信息)毙石。

Lucene不提供信息采集的類庫凿蒜,需要自己編寫一個爬蟲程序?qū)崿F(xiàn)信息采集禁谦,也可以通過一些開源軟件實現(xiàn)信息采集胁黑,以下是一些爬蟲項目(了解):

Solr(http://lucene.apache.org/solr)废封,solr是apache的一個子項目,支持從關(guān)系數(shù)據(jù)庫丧蘸、xml文檔中提取原始數(shù)據(jù)漂洋。

Nutch(http://lucene.apache.org/nutch), Nutch是apache的一個子項目,包括大規(guī)模爬蟲工具力喷,能夠抓取和分辨web網(wǎng)站數(shù)據(jù)刽漂。

jsoup(http://jsoup.org/),jsoup是一款Java的HTML解析器弟孟,可直接解析某個URL地址贝咙、HTML文本內(nèi)容。它提供了一套非常省力的API拂募,可通過DOM庭猩,CSS以及類似于jQuery的操作方法來取出和操作數(shù)據(jù)。

Heritrix(http://sourceforge.net/projects/archive-crawler/files/)陈症,Heritrix是一個由java開發(fā)的蔼水、開源的網(wǎng)絡(luò)爬蟲,用戶可以使用它來從網(wǎng)上抓取想要的資源录肯。其最出色之處在于它良好的可擴(kuò)展性趴腋,方便用戶實現(xiàn)自己的抓取邏輯。

本案例我們要獲取磁盤上文件的內(nèi)容论咏,可以通過文件流來讀取文本文件的內(nèi)容优炬,對于pdf、doc厅贪、xls等文件可通過第三方提供的解析工具讀取文件內(nèi)容蠢护,比如Apache POI讀取doc和xls的文件內(nèi)容。

創(chuàng)建文檔對象

獲取原始內(nèi)容的目的是為了索引卦溢,在索引前需要將原始內(nèi)容創(chuàng)建成文檔(Document)糊余,文檔中包括一個一個的域(Field),域中存儲內(nèi)容单寂。

這里我們可以將磁盤上的一個文件當(dāng)成一個Document贬芥,Document中包括一些Field(file_name文件名稱、file_path文件路徑宣决、file_size文件大小蘸劈、file_content文件內(nèi)容),如下圖:

注意:每個Document可以有多個Field尊沸,不同的Document可以有不同的Field威沫,同一個Document可以有相同的Field(域名和域值都相同)贤惯。每個文檔都有一個唯一的編號,就是文檔id棒掠。

分析文檔

將原始內(nèi)容創(chuàng)建為包含域(Field)的文檔(Document)孵构,需要再對域中的內(nèi)容進(jìn)行分析,分析的過程是經(jīng)過對原始文檔提取單詞烟很、將字母轉(zhuǎn)為小寫颈墅、去除標(biāo)點(diǎn)符號、去除停用詞(沒有意義的單詞)等過程生成最終的語匯單元雾袱,可以將語匯單元理解為一個一個的單詞恤筛。

例如,原始文檔內(nèi)容如下:

Lucene is aJavafull-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.

上邊的文檔經(jīng)過分析得出的語匯單元為:

lucene芹橡、Java毒坛、full、search林说、engine……

每個單詞叫做一個Term煎殷,不同的域中拆分出來的相同的單詞是不同的Term(同一個域中拆分出來的相同的單詞是同一個Term)。Term中包含兩部分內(nèi)容述么,一部分是文檔的域名蝌数,另一部分是單詞的內(nèi)容。

例如:文件名中包含的apache和文件內(nèi)容中包含的apache是不同的Term度秘。

創(chuàng)建索引

對所有文檔分析得出的語匯單元進(jìn)行索引顶伞,索引的目的是為了搜索,最終要實現(xiàn)只搜索被索引的語匯單元從而找到Document(文檔)剑梳。

注意:創(chuàng)建索引是對語匯單元索引唆貌,通過詞語找文檔,這種索引的結(jié)構(gòu)叫倒排索引結(jié)構(gòu)垢乙。傳統(tǒng)方法是根據(jù)文件找到該文件的內(nèi)容锨咙,在文件內(nèi)容中匹配搜索關(guān)鍵字,這種方法是順序掃描方法追逮,數(shù)據(jù)量大酪刀、搜索慢。

倒排索引結(jié)構(gòu)是根據(jù)內(nèi)容(詞語)找文檔钮孵,如下圖:

倒排索引結(jié)構(gòu)也叫反向索引結(jié)構(gòu)骂倘,包括索引和文檔兩部分,索引即詞匯表巴席,它的規(guī)模較小历涝,而文檔集合較大

查詢索引

查詢索引也是搜索的過程。搜索就是用戶輸入關(guān)鍵字荧库,從索引(index)中進(jìn)行搜索的過程堰塌。根據(jù)關(guān)鍵字搜索索引,根據(jù)索引找到對應(yīng)的文檔分衫,從而找到要搜索的內(nèi)容(這里指磁盤上的文件)场刑。

用戶查詢接口

全文檢索系統(tǒng)提供用戶搜索的界面供用戶提交搜索的關(guān)鍵字,搜索完成展示搜索結(jié)果丐箩。比如:

Lucene不提供制作用戶搜索界面的功能摇邦,需要根據(jù)自己的需求開發(fā)搜索界面。

創(chuàng)建查詢

用戶輸入查詢關(guān)鍵字執(zhí)行搜索之前需要先構(gòu)建一個查詢對象屎勘,查詢對象中可以指定查詢要搜索的Field文檔域、查詢關(guān)鍵字等居扒,查詢對象會生成具體的查詢語法概漱。例如,語法 “fileName:lucene”表示要搜索Field域的內(nèi)容為“l(fā)ucene”的文檔喜喂。

執(zhí)行查詢

搜索索引過程:根據(jù)查詢語法在倒排索引詞典表中分別找出對應(yīng)搜索詞的索引瓤摧,從而找到索引所鏈接的文檔鏈表。例如玉吁,搜索語法為“fileName:lucene”表示搜索出fileName域中包含Lucene的文檔照弥。搜索過程就是在索引上查找域為fileName,并且關(guān)鍵字為Lucene的Term进副,并根據(jù)Term找到文檔id列表这揣。

索引域:索引域是用于搜索的,搜索程序?qū)乃饕蛑兴阉饕粋€一個詞影斑,根據(jù)詞找到對應(yīng)的文檔给赞。之所以根據(jù)詞可以找到文檔,是因為詞是從Document中的Field內(nèi)容抽取出來的矫户。將Document中的Field的內(nèi)容進(jìn)行分詞片迅,將分好的詞創(chuàng)建索引,索引=Field域名:詞(表示從Document中的哪個Field抽取的詞)皆辽。

渲染結(jié)果

以一個友好的界面將查詢結(jié)果展示給用戶柑蛇,用戶根據(jù)搜索結(jié)果找自己想要的信息,為了幫助用戶很快找到自己的結(jié)果驱闷,提供了很多展示的效果耻台,比如搜索結(jié)果中將關(guān)鍵字高亮顯示,百度提供的快照等遗嗽。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末粘我,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌征字,老刑警劉巖都弹,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異匙姜,居然都是意外死亡畅厢,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進(jìn)店門氮昧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來框杜,“玉大人,你說我怎么就攤上這事袖肥∵淙瑁” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵椎组,是天一觀的道長油狂。 經(jīng)常有香客問我,道長寸癌,這世上最難降的妖魔是什么专筷? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮蒸苇,結(jié)果婚禮上磷蛹,老公的妹妹穿的比我還像新娘。我一直安慰自己溪烤,他們只是感情好味咳,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著氛什,像睡著了一般莺葫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上枪眉,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天捺檬,我揣著相機(jī)與錄音,去河邊找鬼贸铜。 笑死堡纬,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蒿秦。 我是一名探鬼主播烤镐,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼棍鳖!你這毒婦竟也來了炮叶?” 一聲冷哼從身側(cè)響起碗旅,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎镜悉,沒想到半個月后祟辟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡侣肄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年旧困,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片稼锅。...
    茶點(diǎn)故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡吼具,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出矩距,到底是詐尸還是另有隱情拗盒,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布剩晴,位于F島的核電站锣咒,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏赞弥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一趣兄、第九天 我趴在偏房一處隱蔽的房頂上張望绽左。 院中可真熱鬧,春花似錦艇潭、人聲如沸拼窥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鲁纠。三九已至,卻和暖如春鳍寂,著一層夾襖步出監(jiān)牢的瞬間改含,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工迄汛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留捍壤,地道東北人。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓鞍爱,卻偏偏與公主長得像鹃觉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子睹逃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容