]王子光+王子明
摘要摘要:搜索引擎技術(shù)應(yīng)用廣泛。Lucene作為一個(gè)優(yōu)秀的搜索引擎開源工具包,可方便實(shí)現(xiàn)相關(guān)搜索引擎功能。介紹了Lucene搜索引擎工具包,在此基礎(chǔ)上,利用Lucene開發(fā)工具包,設(shè)計(jì)并實(shí)現(xiàn)了綜合查詢系統(tǒng)中搜索引擎功能。闡述了網(wǎng)絡(luò)爬蟲子系統(tǒng)、索引子系統(tǒng)和查詢子系統(tǒng)3個(gè)模塊功能。
關(guān)鍵詞關(guān)鍵詞:搜索引擎;網(wǎng)絡(luò)爬蟲;Lucene技術(shù);Suggestion提示
DOIDOI:10.11907/rjdk.1511256
中圖分類號(hào):TP319文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào)文章編號(hào):16727800(2017)001012603
引言
隨著互聯(lián)網(wǎng)技術(shù)的迅猛發(fā)展,形成了海量Web交互數(shù)據(jù),搜索引擎成為用戶在海量數(shù)據(jù)中獲取有用信息的重要技術(shù)手段。綜合查詢系統(tǒng)作為當(dāng)前管理信息系統(tǒng)的重要組成部分,承擔(dān)了系統(tǒng)查詢的大部分功能,是用戶進(jìn)行查詢的重要接口。綜合查詢系統(tǒng)包括快速查詢、模糊查詢、組合查詢、關(guān)聯(lián)查詢等功能,一般是用戶根據(jù)查詢要素進(jìn)行查詢,例如輸入某人的學(xué)號(hào)來查詢確切信息。但是在很多查詢場(chǎng)合,用戶往往不清楚自己所掌握的數(shù)據(jù)是哪一個(gè)查詢要素,例如只知道一個(gè)編號(hào),但是不清楚這個(gè)編號(hào)是學(xué)號(hào)還是其它編號(hào),這樣就無法根據(jù)查詢要素查詢,導(dǎo)致查詢效率大大降低。綜合查詢系統(tǒng)迫切需要一種類似搜索引擎的服務(wù)來方便用戶使用。
本文設(shè)計(jì)了一種基于Lucene的搜索引擎技術(shù)在綜合查詢系統(tǒng)的應(yīng)用方案,并詳細(xì)闡述了該方案的設(shè)計(jì)與實(shí)現(xiàn)。
1Lucene開發(fā)工具包
Lucene作為一個(gè)優(yōu)秀的搜索引擎開源工具包,可以4結(jié)語
代碼質(zhì)量問題已成為制約軟件持續(xù)發(fā)展的主要因素。代碼質(zhì)量問題包括多個(gè)方面,但特征不夠明確和統(tǒng)一,自動(dòng)檢測(cè)效果差,這些都為代碼質(zhì)量檢查增加了難度[7]。可控性作為代碼質(zhì)量評(píng)價(jià)的重要指標(biāo),越來越受到信息企業(yè)的關(guān)注[8]。它在整個(gè)產(chǎn)品線的長(zhǎng)遠(yuǎn)發(fā)展方面發(fā)揮著重要作用,有助于構(gòu)建完整的軟件產(chǎn)品“生態(tài)系統(tǒng)圈”。可控性不僅是代碼質(zhì)量理論,更需要應(yīng)用在程序編碼實(shí)踐之中。遵循可控性原則進(jìn)行方案設(shè)計(jì)和代碼實(shí)現(xiàn),可進(jìn)一步提高代碼質(zhì)量,監(jiān)督控制程序代碼修改的風(fēng)險(xiǎn),增加軟件產(chǎn)品應(yīng)對(duì)需求變化的靈活性。
2基于Lucene的搜索引擎技術(shù)實(shí)現(xiàn)2.1網(wǎng)絡(luò)爬蟲設(shè)計(jì)與實(shí)現(xiàn)
網(wǎng)絡(luò)爬蟲是通過網(wǎng)頁的鏈接地址來尋找網(wǎng)頁信息,通常從網(wǎng)站的首頁開始讀取網(wǎng)頁內(nèi)容,從中抽取網(wǎng)頁中的超鏈接地址,然后通過這些鏈接地址尋找下一個(gè)網(wǎng)頁,如此循環(huán),直到把網(wǎng)站所有的網(wǎng)頁都抓取為止[2]。搜索策略包括廣度優(yōu)先或深度優(yōu)先兩種形式。
網(wǎng)絡(luò)爬蟲根據(jù)抓取過程分為3個(gè)功能模塊:①網(wǎng)頁源文件獲取。通過獲取網(wǎng)頁的輸入流,將網(wǎng)頁源文件信息提取出來;②網(wǎng)頁超鏈接地址抽取。這個(gè)模塊就是分析網(wǎng)頁信息,抓取URL列表;③網(wǎng)頁文件寫入磁盤。這個(gè)模塊主要是將網(wǎng)頁數(shù)據(jù)寫入磁盤,然后進(jìn)行索引查詢。
2.1.1網(wǎng)頁源文件獲取
通過與指定URL鏈接,獲取網(wǎng)頁輸入流,然后逐字符把網(wǎng)頁源文件輸入到一個(gè)字符串變量中。這一部分用到Java.net包下的URL類和URLConnection類,主要代碼如下:
.1.3網(wǎng)頁源文件寫入磁盤
因?yàn)槲募荒馨ā?”等特殊字符,所以這部分要利用StringTokenizer類把每個(gè)獲得的超鏈接以“/”分隔,然后按照分隔出來的字符串依次建立相應(yīng)的文件夾。例如:www.xxx.edu.cn/english/index.asp依次創(chuàng)建www.xxx.edu.cn文件夾,然后是其子文件夾english,最后是最內(nèi)層文件夾index.asp,還要?jiǎng)?chuàng)建一個(gè)FileWriter對(duì)象把網(wǎng)頁源文件index.asp寫入到最內(nèi)層的文件夾中。
實(shí)現(xiàn)網(wǎng)絡(luò)爬蟲功能后,網(wǎng)頁數(shù)據(jù)就寫入磁盤,然后索引子系統(tǒng)要對(duì)這些網(wǎng)頁源文件進(jìn)行索引。
2.2索引子系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)
由于經(jīng)過網(wǎng)絡(luò)爬蟲搜集的數(shù)據(jù)是在數(shù)據(jù)庫中存儲(chǔ)的,所以需要利用Lucene對(duì)數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行索引。有兩種方式實(shí)現(xiàn)創(chuàng)建索引:①實(shí)時(shí)索引。在信息系統(tǒng)添加數(shù)據(jù)時(shí)就為該數(shù)據(jù)添加索引;②定時(shí)創(chuàng)建索引。文件為配置時(shí)間,在指定時(shí)間創(chuàng)建索引。索引完后就可以在索引文件中進(jìn)行查詢,把結(jié)果返回給用戶。
2.2.1實(shí)時(shí)創(chuàng)建索引
實(shí)時(shí)創(chuàng)建索引是業(yè)務(wù)系統(tǒng)在增加數(shù)據(jù)時(shí)為新數(shù)據(jù)添加索引。本文設(shè)計(jì)實(shí)現(xiàn)了一個(gè)創(chuàng)建索引的公共方法createIndex,參數(shù)為新增加的數(shù)據(jù)對(duì)象。在該方法中使用Lucene搜索引擎包提供的IndexWriter對(duì)象向索引文件夾中寫入索引文件。創(chuàng)建索引時(shí)先從配置文件中讀取索引文件夾位置,判斷索引文件夾中是否存在索引文件。如果不存在則直接在索引文件中寫數(shù)據(jù),如果已經(jīng)存在,則向索引文件夾追加數(shù)據(jù)并不覆蓋原有數(shù)據(jù);然后使用addDocument方法,把要索引的數(shù)據(jù)庫字段放到Document對(duì)象的Field中。Document很像數(shù)據(jù)庫中的一條記錄,而Field更像是數(shù)據(jù)庫中的字段[3]。
2.2.2定時(shí)創(chuàng)建索引
實(shí)時(shí)創(chuàng)建索引目的是將新增數(shù)據(jù)添加到索引文件中,但此時(shí)刪除數(shù)據(jù)索引文件并不會(huì)立即更新。為了解決上述問題,可設(shè)計(jì)實(shí)現(xiàn)一個(gè)定時(shí)創(chuàng)建索引方法。為了不影響業(yè)務(wù)正常開展,一般設(shè)定為次日凌晨,在該時(shí)間為數(shù)據(jù)庫中的所有數(shù)據(jù)信息重新創(chuàng)建索引。
在Web應(yīng)用程序的web.xml配置文件中設(shè)置一個(gè)ServletContextListener,并在ServletContextListener實(shí)現(xiàn)類中創(chuàng)建一個(gè)Timer對(duì)象,調(diào)用Timer對(duì)象的schedule方法實(shí)現(xiàn)在指定時(shí)間執(zhí)行指定任務(wù)。
定時(shí)調(diào)度任務(wù)需實(shí)現(xiàn)一個(gè)方法,該方法繼承java.util.TimerTask類。從配置文件中讀取指定時(shí)間,設(shè)定兩個(gè)配置項(xiàng),一個(gè)是索引文件夾路徑,一個(gè)是任務(wù)指定執(zhí)行時(shí)間。通過JDom技術(shù)讀取配置文件中的信息。由于ServletContextListener在整個(gè)Web應(yīng)用程序中都存在,這樣就實(shí)現(xiàn)了定時(shí)創(chuàng)建索引的功能。
創(chuàng)建完索引后,就可在索引文件中查找用戶關(guān)注的信息,將用戶查詢結(jié)果返回給客戶端。
2.3查詢子系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)
前臺(tái)實(shí)現(xiàn)參照Google搜索引擎的Suggestion提示,通過Ajax技術(shù)與后臺(tái)動(dòng)態(tài)交互數(shù)據(jù),并利用JQuery的Autocomplete 插件實(shí)現(xiàn)類似Google輸入框中動(dòng)態(tài)顯示搜索詞組下拉列表功能。搜索語句代碼如下:
參考文獻(xiàn):
[1]郎小偉,王申康.基于Lucene的全文檢索系統(tǒng)研究與開發(fā)[J].計(jì)算機(jī)工程,2006(4):110.
[2]互動(dòng)百科,網(wǎng)絡(luò)蜘蛛[EB/OL].http://www.baike.com/wiki/網(wǎng)絡(luò)蜘蛛.
[3]李剛,宋偉,邱哲.征服Ajax十Lucene構(gòu)建搜索引擎[M].北京:人民郵電出版社,2006.
[4]成龍.Lucene搜索引擎開發(fā)進(jìn)階實(shí)戰(zhàn)[M].北京:機(jī)械工業(yè)出版社,2015.
[5]羅剛.解密搜索引擎技術(shù)實(shí)戰(zhàn)[M].北京:電子工業(yè)出版社,2014.
[6]王子光.內(nèi)蒙古移動(dòng)需求全生命周期系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[D].北京:北京交通大學(xué),2010.
[7]李剛.瘋狂Ajax講義[M].北京:電子工業(yè)出版社,2013.
責(zé)任編輯(責(zé)任編輯:杜能鋼)