齊勇軍
摘要:物聯(lián)網(wǎng)應(yīng)用發(fā)展迅速,已經(jīng)與互聯(lián)網(wǎng)技術(shù)相互融合。針對(duì)搜索引擎廣闊的應(yīng)用前景以及分析國(guó)內(nèi)外搜索引擎的發(fā)展現(xiàn)狀,根據(jù)搜索引擎系統(tǒng)的工作原理設(shè)計(jì)一種基于物聯(lián)網(wǎng)技術(shù)的搜索引擎。對(duì)搜索引擎進(jìn)行了相關(guān)的研究。一個(gè)搜索引擎由搜索器、索引器、檢索器和用戶接口四個(gè)部分組成。搜索器的功能是在互聯(lián)網(wǎng)中漫游,發(fā)現(xiàn)和搜集信息。索引器的功能是理解搜索器所搜索的信息,從中抽取出索引項(xiàng),用于表示文檔以及生成文檔庫(kù)的索引表。檢索器的功能是根據(jù)用戶的查詢?cè)谒饕龓?kù)中快速檢出文檔,進(jìn)行文檔與查詢的相關(guān)度評(píng)價(jià),對(duì)將要輸出的結(jié)果進(jìn)行排序,并實(shí)現(xiàn)某種用戶相關(guān)性反饋機(jī)制。用戶接口的作用是輸入用戶查詢、顯示查詢結(jié)果、提供用戶相關(guān)性反饋機(jī)制。結(jié)合搜索引擎發(fā)展現(xiàn)狀分析了搜索引擎的系統(tǒng)功能需求,并進(jìn)行了可行性論證,進(jìn)而提出了基于java的技術(shù)方案,明確采用jsoup、elasticsearch、jfinal等相關(guān)開發(fā)技術(shù);然后通過網(wǎng)絡(luò)爬蟲抓取數(shù)據(jù)下載到本地,建立索引;在系統(tǒng)實(shí)現(xiàn)環(huán)節(jié),重點(diǎn)對(duì)需求分析中確定的主要功能模塊進(jìn)行代碼編程、修改及優(yōu)化;最后,設(shè)計(jì)了若干具體測(cè)試用例對(duì)系統(tǒng)進(jìn)行了較全面的測(cè)試,驗(yàn)證設(shè)計(jì)效果。
關(guān)鍵詞:物聯(lián)網(wǎng);搜索引擎;網(wǎng)絡(luò)爬蟲;索引器;jsoup
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2017)02-0274-03
隨著信息技術(shù)與物聯(lián)網(wǎng)技術(shù)的不斷發(fā)展和融合,越來越多的產(chǎn)業(yè)與行業(yè)廣泛應(yīng)用了物聯(lián)網(wǎng)技術(shù),如工農(nóng)業(yè)、智能家居、快遞物流、設(shè)備監(jiān)控等,物聯(lián)網(wǎng)中包含很多實(shí)體,這就意味著海量的實(shí)時(shí)數(shù)據(jù)需要傳輸、存儲(chǔ)及有效展示。面對(duì)越來越多的傳感器及其所產(chǎn)生的數(shù)據(jù),只有結(jié)合智能的物聯(lián)網(wǎng)搜索,才能最大限度地實(shí)現(xiàn)這類數(shù)據(jù)的價(jià)值。
1 模塊設(shè)計(jì)
本搜索引擎由四個(gè)模塊組成,主要包括網(wǎng)頁(yè)抓取模塊,網(wǎng)頁(yè)內(nèi)容抽取模塊,內(nèi)容索引模塊和內(nèi)容呈現(xiàn)模塊。系統(tǒng)的模塊流程圖1如下:
1.1 網(wǎng)頁(yè)抓取模塊
網(wǎng)頁(yè)抓取模塊主要完成對(duì)指定站點(diǎn)進(jìn)行網(wǎng)頁(yè)的抓取并將所抓取的網(wǎng)頁(yè)保存到本地?cái)?shù)據(jù)庫(kù)。
本系統(tǒng)是從鳳凰、騰訊、網(wǎng)易、搜狐新聞網(wǎng)上爬取相關(guān)的網(wǎng)頁(yè),輸入鳳凰、騰訊、網(wǎng)易、搜狐新聞網(wǎng)的頁(yè)面的URL作為種子URL。通過分析鳳凰、騰訊、網(wǎng)易、搜狐新聞網(wǎng)的網(wǎng)頁(yè)URL的格式,對(duì)網(wǎng)絡(luò)爬蟲抓取和分析網(wǎng)頁(yè)的行為進(jìn)行一定的控制,限定應(yīng)抓取的網(wǎng)頁(yè)的URL格式以及限定能進(jìn)入待爬取的URL隊(duì)列的URL的格式。提高網(wǎng)絡(luò)爬蟲爬取速度可以通過改善URL的分配策略,使網(wǎng)絡(luò)爬蟲的并發(fā)線程增多。通過限制對(duì)Robot文件的訪問,也是提高爬蟲爬取網(wǎng)頁(yè)效率的一個(gè)方法。網(wǎng)頁(yè)抓取模塊的功能需求如圖2所示
1.2 網(wǎng)頁(yè)內(nèi)容抽取模塊
網(wǎng)頁(yè)內(nèi)容抽取模塊主要負(fù)責(zé)從本地文件所存儲(chǔ)的網(wǎng)頁(yè)中按照某種抽取規(guī)則抽取所需信息,并將所得到的信息按照特定的格式保存到數(shù)據(jù)庫(kù)中。
通過對(duì)具有代表性的目標(biāo)頁(yè)面進(jìn)行分析,制定信息抽取規(guī)則,實(shí)現(xiàn)對(duì)網(wǎng)頁(yè)上各種內(nèi)容的定位,抽取網(wǎng)頁(yè)文本內(nèi)容。構(gòu)建網(wǎng)頁(yè)信息詞庫(kù),通過分詞器解析抽取出所需網(wǎng)頁(yè)信息內(nèi)容,并將其寫到指定詞庫(kù)文件中。將提取的網(wǎng)頁(yè)非結(jié)構(gòu)化信息轉(zhuǎn)化成結(jié)構(gòu)化信息存儲(chǔ)到數(shù)據(jù)庫(kù)中。
網(wǎng)頁(yè)內(nèi)容抽取模塊的功能需求如圖3所示。
1.3 內(nèi)容索引模塊
利用Luence索引工具對(duì)數(shù)據(jù)庫(kù)中結(jié)構(gòu)化信息建立索引文件,然后把創(chuàng)建好的索引文件保存到磁盤中,根據(jù)用戶輸入的查詢條件在索引文件中進(jìn)行查詢,最終查詢結(jié)果按照一定的順序進(jìn)行排序返回給用戶。
網(wǎng)頁(yè)內(nèi)容索引模塊的功能需求如圖4所示。
1.4 內(nèi)容呈現(xiàn)模塊
通過jsp技術(shù),以Web的形式展示用戶界面,當(dāng)用戶在此界面輸入關(guān)鍵詞時(shí),根據(jù)用戶的關(guān)鍵詞從數(shù)據(jù)庫(kù)中匹配相關(guān)網(wǎng)頁(yè),把相關(guān)網(wǎng)頁(yè)根據(jù)一定的排序規(guī)則返回顯示在用戶界面。
2 詳細(xì)設(shè)計(jì)
2.1 網(wǎng)頁(yè)抓取
網(wǎng)絡(luò)爬蟲是一個(gè)自動(dòng)提取網(wǎng)頁(yè)的程序,它為搜索引擎從萬維網(wǎng)上下載網(wǎng)頁(yè),是搜索引擎的重要組成。傳統(tǒng)爬蟲從一個(gè)或若干初始網(wǎng)頁(yè)的URL開始,獲得初始網(wǎng)頁(yè)上的URL,在抓取網(wǎng)頁(yè)的過程中,不斷從當(dāng)前頁(yè)面上抽取新的URL放入隊(duì)列,直到滿足系統(tǒng)的一定停止條件。聚焦爬蟲的工作流程較為復(fù)雜,需要根據(jù)一定的網(wǎng)頁(yè)分析算法過濾與主題無關(guān)的鏈接,保留有用的鏈接并將其放入等待抓取的URL隊(duì)列。然后,它將根據(jù)一定的搜索策略從隊(duì)列中選擇下一步要抓取的網(wǎng)頁(yè)URL,并重復(fù)上述過程,直到達(dá)到系統(tǒng)的某一條件時(shí)停止。該模塊通過網(wǎng)絡(luò)爬蟲從鳳凰、騰訊、搜狐、網(wǎng)易新聞網(wǎng)中的網(wǎng)頁(yè)爬取我們想要的頁(yè)面URL。爬蟲開始時(shí),我們添加種子URL到URL請(qǐng)求隊(duì)列中,我們輸入的種子URL為鳳凰、騰訊、搜狐、網(wǎng)頁(yè)新聞網(wǎng)的頁(yè)面的URL。通過對(duì)鳳凰、騰訊、搜狐、網(wǎng)易新聞網(wǎng)的頁(yè)面的URL格式進(jìn)行分析,當(dāng)?shù)玫降腢RL地址滿足鳳凰、騰訊、搜狐、網(wǎng)易網(wǎng)頁(yè)面的URL格式,則將它添加到URL請(qǐng)求隊(duì)列中。
網(wǎng)絡(luò)爬蟲的工作流圖如圖5所示。
定制網(wǎng)絡(luò)爬蟲抓取鳳凰網(wǎng):
parser="org.webspider.parser.NewsIfengParser" listener="org.webspider.listener.DbSpiderListener" host="news.ifeng.com" forbidden="">
2.2 網(wǎng)頁(yè)信息抽取
網(wǎng)頁(yè)內(nèi)容抽取主要負(fù)責(zé)將本地文件所存儲(chǔ)的網(wǎng)頁(yè)中按照某種抽取規(guī)則抽取所需信息,并將所得到的信息按照特定的格式保存到數(shù)據(jù)庫(kù)中。
遍歷存儲(chǔ)所抓取網(wǎng)頁(yè)的本地文件夾,如果遍歷到網(wǎng)頁(yè),則運(yùn)用jsoup對(duì)網(wǎng)頁(yè)的標(biāo)題,作者,時(shí)間,正文實(shí)現(xiàn)定向抓取。將抓取的內(nèi)容保存為.txt文件存放到指定文件夾中。將抓取到的內(nèi)容,如網(wǎng)頁(yè)鳳凰網(wǎng)新聞的標(biāo)題,作者,發(fā)布時(shí)間,正文,鏈接地址,分別存入到數(shù)據(jù)庫(kù)news表中的相應(yīng)列。
網(wǎng)頁(yè)信息抽取流程圖6如下。
實(shí)現(xiàn)的關(guān)鍵代碼:
public class DefaultParser implements Parser{
@Override
public List
//創(chuàng)建一個(gè)List,存放解析出來的Map
List
//通過網(wǎng)頁(yè)的html,創(chuàng)建一個(gè)Document
Document doc = Jsoup.parse(page.getContent());
//創(chuàng)建一個(gè)map,用于存放解析的具體字段
Map
//把網(wǎng)頁(yè)的原始url放入map
data.put("origin_url", page.getUrl());
//利用jsoup的選擇器,提取標(biāo)題title這個(gè)元素
Elements title = doc.select("title");
//得到標(biāo)題的文本,并放到map里去
data.put("title", title.text());
//解析得到的map,放入list里去
datas.add(data);
//返回解析結(jié)果List
return datas;}}
2.3 內(nèi)容索引
利用Luence索引工具對(duì)數(shù)據(jù)庫(kù)中結(jié)構(gòu)化信息建立索引文件,然后把創(chuàng)建好的索引文件保存到磁盤中,根據(jù)用戶輸入的查詢條件在索引文件中進(jìn)行查詢,最終查詢結(jié)果按照一定的順序進(jìn)行排序返回給用戶。
實(shí)現(xiàn)的關(guān)鍵代碼:
/*索引一個(gè)索引庫(kù)的數(shù)據(jù) * * @param indexConfig Index */
private void indexData(Index index) throws Exception {
StringTokenizer stFetcher = new StringTokenizer(index.fetcher, FETECHER_SPLIT);
while (stFetcher.hasMoreTokens()) {String strFectcherName = stFetcher.nextToken();
Fetcher iFetcher = (Fetcher)new ObjectUtility().newInstance(strFectcherName);
int records = iFetcher.doIndex(index);
LOG.info(index.name + ", Index Records:" + records + ", Fetcher Class:" + strFectcherName);
} }
2.4 搜索引擎界面設(shè)計(jì)
本搜索引擎界面簡(jiǎn)單清新。其效果圖如圖8所示。
3 結(jié)束語
針對(duì)物聯(lián)網(wǎng)技術(shù)產(chǎn)生的大量數(shù)據(jù),設(shè)計(jì)了一種搜索引擎,并將核心功能完成,能應(yīng)用于實(shí)際。本搜索引擎有如下功能:
1)通過對(duì)網(wǎng)絡(luò)爬蟲的擴(kuò)展?jié)M足自己從網(wǎng)絡(luò)站點(diǎn)抓取相關(guān)信息的要求
2)通過jsoup網(wǎng)頁(yè)解析工具實(shí)現(xiàn)對(duì)目標(biāo)網(wǎng)頁(yè)進(jìn)行抽取,并將抽取內(nèi)容保存到數(shù)據(jù)庫(kù)中。
3)通過luence檢索工具完成對(duì)存儲(chǔ)在數(shù)據(jù)庫(kù)中信息的索引,最后通過jsp向用戶展示所抓取并過濾后的信息。
4)與MYSQL數(shù)據(jù)庫(kù)結(jié)合使用,減少企業(yè)的開銷成本,同時(shí),在數(shù)據(jù)處理方面,MYSQL數(shù)據(jù)庫(kù)提供了很大的優(yōu)勢(shì),在數(shù)據(jù)的返回處理方面,減少了結(jié)果集的負(fù)擔(dān),同時(shí),也加快了數(shù)據(jù)的傳輸。
5)系統(tǒng)界面簡(jiǎn)單美觀。
最后,本文通過對(duì)搜索引擎的分析與測(cè)試,表明對(duì)基于JAVA的搜索引擎的設(shè)計(jì)與實(shí)現(xiàn)是成功的,該搜索引擎性能穩(wěn)定,高效。
綜上所述,本課題成功地實(shí)現(xiàn)和設(shè)計(jì)了基于JAVA的搜索引擎,并結(jié)合了MYSQL數(shù)據(jù)庫(kù)的使用,軟件的UI交互設(shè)計(jì)友好。
參考文獻(xiàn):
[1] 袁津生, 李群, 蔡岳. 搜索引擎原理與實(shí)踐[M]. 北京: 北京郵電大學(xué)出版社, 2008, 11.
[2] 鄭宇衛(wèi). 基于Lucene構(gòu)建的Web服務(wù)搜索引擎[J]. 電腦編程技巧與維護(hù), 2015.
[3] 任麗蕓. 搜索引擎中文分詞技術(shù)研究[D]. 重慶: 重慶理工大學(xué), 2011.
[4] 邱哲, 符滔滔. 開發(fā)自己的搜索引擎--Lucene 2.0+Heritrix[M]. 北京: 人民郵電出版社, 2007-06.
[5] 桂許軍. 基于JavaEE平臺(tái)與Lucene的信息文檔搜索引擎系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[D]. 成都 西南交通大學(xué), 2011.
[6] Cay S.Horstmann, Gary Cornell.Core Java 2, Volume 1-Fundamentals,6E[M].Prentice Hall/Pearson, 2003.
[7] Bruce Eckel. Thinking in Java[Z].4th ed. 2007.