摘 要:隨著各大搜索引擎巨頭推出了搜索服務(wù)的開放API,元搜索引擎迎來了新一輪發(fā)展。筆者通過對元搜索引擎基本架構(gòu)的分析,在Java平臺上設(shè)計(jì)并實(shí)現(xiàn)了基于Executor并發(fā)框架的元搜索引擎數(shù)據(jù)查詢代理模塊,同時還對其實(shí)現(xiàn)進(jìn)行了性能分析。
關(guān)鍵詞:元搜索引擎;并行;Google Search API
中圖分類號:TP393.092
面對龐大數(shù)量級的互聯(lián)網(wǎng)信息,各搜索引擎的排序算法、搜索側(cè)重點(diǎn)、結(jié)果顯示均有所不同?;ヂ?lián)網(wǎng)用戶為了查詢相關(guān)內(nèi)容,通常需要同時使用多個搜索引擎查詢內(nèi)容,然后綜合得出最適合自己的內(nèi)容。這無可避免地給搜索用戶帶來了搜索成本的上升。
元搜索引擎作為基于獨(dú)立搜索引擎的搜索引擎,是搜索引擎發(fā)展過程中的一種嶄新形式。通過一定策略綜合多個搜索引擎的搜索結(jié)果,元搜索引擎能夠?yàn)橛脩羰∪ヒ欢~外的搜索時間,方便用戶更快速找到適合自己的查詢結(jié)果。
本文主要是筆者在元搜索引擎上進(jìn)行探究的成果,主要針對筆者設(shè)計(jì)并實(shí)現(xiàn)的元搜索引擎中的數(shù)據(jù)查詢代理模塊,以及如何在數(shù)據(jù)代理中引入多線程,提高并發(fā)度。
1 功能描述
元搜索引擎的搜索結(jié)果是基于多個成員搜索引擎的搜索結(jié)果進(jìn)行處理之后得到的。元搜索引擎的基本工作原理大致是以下幾步:(1)從用戶查詢界面獲取查詢信息;(2)將查詢信息分別轉(zhuǎn)換為各個成員搜索引擎都能夠接受的形式;(3)向成員搜索引擎提交查詢請求;(4)獲取各個成員搜索引擎的原始查詢結(jié)果;(5)對原始查詢結(jié)果進(jìn)行預(yù)處理、去重、排序等操作,形成最終結(jié)果;(6)把最終查詢結(jié)果返回給用戶。
筆者開發(fā)的元搜索引擎的數(shù)據(jù)查詢代理模塊屬于元搜索引擎實(shí)現(xiàn)中的一個重要組成部分,模塊通過調(diào)用Google和Bing兩大搜索引擎的Search API,根據(jù)查詢關(guān)鍵字返回結(jié)構(gòu)化的查詢結(jié)果。
在實(shí)現(xiàn)的技術(shù)上,筆者選擇基于Java平臺開發(fā),運(yùn)用Java平臺的成熟多線程應(yīng)用框架Executor作為核心實(shí)現(xiàn)工具,能夠方便地使用j.u.c并發(fā)類庫構(gòu)建業(yè)務(wù)。最終實(shí)現(xiàn)并發(fā)地調(diào)用成員搜索引擎的Search API,獲取原始搜索結(jié)果。
2 模塊系統(tǒng)結(jié)構(gòu)
模塊總體分為三個部分,第一部分是接收外部數(shù)據(jù)輸入的參數(shù)設(shè)置查詢?nèi)蝿?wù),第二部分是在線程池中啟動Google和Bing的查詢線程,并發(fā)完成任務(wù),第三部分是匯總所有查詢?nèi)蝿?wù)的結(jié)果,進(jìn)行解析并結(jié)構(gòu)化之后輸出給外部調(diào)用者。
筆者在此次設(shè)計(jì)的過程中,采用的成員搜索引擎是著名的兩大搜索引擎Google和Bing。原因之一是這兩個搜索引擎在搜索技術(shù)上均非常優(yōu)秀,領(lǐng)先大部分搜索引擎,其二是它們都為普通開發(fā)者提供了方便快捷的搜索接口。普通開發(fā)者只需要經(jīng)過幾個簡單的步驟就可以免費(fèi)使用搜索API,并能夠設(shè)置搜索結(jié)果的查詢詞、編碼字符集以及返回格式等等。
現(xiàn)對系統(tǒng)三個部分的職責(zé)分配描述如下:
2.1 設(shè)置并啟動查詢?nèi)蝿?wù)。在模塊被元搜索引擎主線程調(diào)用時,首先根據(jù)傳入的查詢參數(shù)(如查詢詞,結(jié)果條數(shù),查詢類別等)創(chuàng)建負(fù)責(zé)查詢的任務(wù)線程。隨后還要依照Google和Bing對查詢請求的認(rèn)證方式提供認(rèn)證密鑰。任務(wù)線程設(shè)置完成之后,即可將任務(wù)線程提交到線程池中并發(fā)執(zhí)行,等待返回結(jié)果。
2.2 獲取并解析查詢結(jié)果數(shù)據(jù)。這一部分表示的是查詢?nèi)蝿?wù)線程的職責(zé)。簡單來說,查詢?nèi)蝿?wù)線程的職責(zé)就是按照設(shè)置好的參數(shù)向指定的搜索引擎提交查詢請求,接著在獲取查詢結(jié)果之后,對查詢結(jié)果進(jìn)行結(jié)構(gòu)化之后將結(jié)果返回給調(diào)用線程。
2.3 生成并輸出統(tǒng)一結(jié)果集。在獲得每一個查詢?nèi)蝿?wù)線程的查詢結(jié)果之后,模塊還需要將不同搜索引擎的返回結(jié)果進(jìn)行統(tǒng)一匯總之后,再將結(jié)果返回給元搜索引擎主線程。
3 核心實(shí)現(xiàn)要點(diǎn)
3.1 并發(fā)查詢。模塊使用Google和Bing兩大搜索引擎的Search API來獲取查詢結(jié)果,每一個查詢?nèi)蝿?wù)只負(fù)責(zé)同一個搜索引擎的通信。
因?yàn)橄M麑⒉樵內(nèi)蝿?wù)提交到線程池中執(zhí)行,并且查詢?nèi)蝿?wù)都需要返回結(jié)果,于是查詢?nèi)蝿?wù)線程不能夠?qū)崿F(xiàn)Runnable,而需要實(shí)現(xiàn)Callable接口,代表有返回值的線程方法。查詢?nèi)蝿?wù)線程的實(shí)現(xiàn)算法如下:a.讀取特定的查詢參數(shù),如字符集編碼,查詢關(guān)鍵字,返回格式(XML/JSON),驗(yàn)證密鑰,返回條數(shù)等;b.根據(jù)查詢參數(shù)創(chuàng)建針對某一搜索引擎接口的java.net.URL實(shí)例,同時調(diào)用openConnection()方法提交查詢請求;c.阻塞等待返回結(jié)果接收完畢;d.對某一搜索引擎的返回結(jié)果進(jìn)行結(jié)構(gòu)化后,返回給元搜索引擎主線程。
3.2 結(jié)構(gòu)化返回結(jié)果。解析結(jié)果的目的是從搜索結(jié)果中抽取有效的搜索結(jié)果信息。在解析過程中,需要將搜索結(jié)果分成多條搜索結(jié)果,每一條搜索結(jié)果還需要解析出搜索結(jié)果的標(biāo)題、URL地址等有效信息。從搜索引擎返回的結(jié)果中往往包含了許多額外的信息,這些信息能夠在日后擴(kuò)展功能時能夠用到,目前暫不考慮。
在Google和Bing的Search API中提供XML和JSON兩種格式的返回格式,筆者在系統(tǒng)中采用較為熟悉的XML返回格式的結(jié)果,在解析過程中使用了dom4j進(jìn)行解析。
4 測試與運(yùn)行結(jié)果
對比表1與表2的數(shù)據(jù)可以發(fā)現(xiàn),數(shù)據(jù)查詢代理模塊的平均響應(yīng)時間T基本符合關(guān)系式。同時其響應(yīng)時間較短,基本符合使用要求。
參考文獻(xiàn):
[1](美)Brian Goetz等著,童云蘭等譯.Java并發(fā)編程實(shí)戰(zhàn)[M].北京:機(jī)械工業(yè)出版社,2012.
[2]孫衛(wèi)琴.Java網(wǎng)絡(luò)編程精解[M].北京:電子工業(yè)出版社,2007.
[3]黃素珍,陳寧等.并發(fā)多元搜索引擎的研究與應(yīng)用[J].廣西大學(xué)學(xué)報(bào)(自然科學(xué)版),2005.
[4]陽小華,劉振宇等.元搜索引擎查詢結(jié)果的合成方法[J].計(jì)算機(jī)科學(xué),2002.
[5]解沖鋒,李星.并行式Meta Search系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)工程與應(yīng)用,1999.
作者簡介:白金平(1992-),男,廣東陸豐人,在校學(xué)生,軟件工程專業(yè),本科,主要研究方向:服務(wù)端開發(fā)技術(shù)。
作者單位:吉首大學(xué)軟件服務(wù)外包學(xué)院,湖南張家界 427000
基金項(xiàng)目:大學(xué)生研究性學(xué)習(xí)和創(chuàng)新性實(shí)驗(yàn)計(jì)劃項(xiàng)目(JSU-CX-2012-54)。