全文檢索技術(shù) Lucene

1.搜索技術(shù)理論基礎(chǔ)

1.1. 為什么要學(xué)習(xí)Lucene

原來(lái)的方式實(shí)現(xiàn)搜索功能客们,我們的搜索流程如下圖:

圖片.png

上圖就是原始搜索引擎技術(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),如下圖


圖片.png

為了解決數(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/

圖片.png

3. Lucene全文檢索的流程

圖片.png
  • 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,如下圖:

圖片.png
  • 注意:每個(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)容(詞匯)找文檔苗傅,如下圖:


圖片.png

倒排索引結(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é)果炬称。如下圖:


圖片.png

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)鍵字高亮顯示,百度提供的快照等框仔。


圖片.png

4.lucene入門(mén)

待補(bǔ)ing....

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末舀武,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子离斩,更是在濱河造成了極大的恐慌银舱,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捐腿,死亡現(xiàn)場(chǎng)離奇詭異纵朋,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)茄袖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)操软,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人宪祥,你說(shuō)我怎么就攤上這事聂薪。” “怎么了蝗羊?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵藏澳,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我耀找,道長(zhǎng)翔悠,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任野芒,我火速辦了婚禮蓄愁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘狞悲。我一直安慰自己撮抓,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布摇锋。 她就那樣靜靜地躺著丹拯,像睡著了一般站超。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上乖酬,一...
    開(kāi)封第一講書(shū)人閱讀 51,754評(píng)論 1 307
  • 那天死相,我揣著相機(jī)與錄音,去河邊找鬼咬像。 笑死媳纬,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的施掏。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼茅糜,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼七芭!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起蔑赘,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤狸驳,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后缩赛,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體耙箍,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年酥馍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了辩昆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡旨袒,死狀恐怖汁针,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情砚尽,我是刑警寧澤施无,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站必孤,受9級(jí)特大地震影響猾骡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜敷搪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一兴想、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧购啄,春花似錦襟企、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)曼振。三九已至,卻和暖如春蔚龙,著一層夾襖步出監(jiān)牢的瞬間冰评,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工木羹, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留甲雅,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓坑填,卻偏偏與公主長(zhǎng)得像抛人,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子脐瑰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

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