21世紀(jì),中國互聯(lián)網(wǎng)搜索引擎領(lǐng)域可謂群雄逐鹿,百度、yahoo、中搜、搜狗等等都使出渾身解數(shù)吸引著網(wǎng)民的眼球。這些大網(wǎng)站可謂是各有所長,總的來說雖然他們搜索功能都很強(qiáng),但是搜索得到的結(jié)果基本上是千篇一律,信息的冗余量很大,網(wǎng)民不得不在一次又一次的翻頁中浪費(fèi)時(shí)間,或者為了想出一個(gè)好的關(guān)鍵詞而絞盡腦汁。要是有一個(gè)有針對(duì)性的搜索引擎就好了,并且這個(gè)針對(duì)性應(yīng)該是可以控制的。
筆者在上網(wǎng)搜索的過程中曾有這樣痛苦的經(jīng)歷。由于筆者愛好編程,經(jīng)常需要上網(wǎng)查找技術(shù)資料。但是搜到的結(jié)果往往是來自一些不起眼的小網(wǎng)站,它們主要是轉(zhuǎn)載csdn,賽迪網(wǎng)等一些技術(shù)大站上的文檔,可惡的是,這些小網(wǎng)站常常轉(zhuǎn)載不全,廣告成堆,亂彈窗口,更有甚者還有病毒、木馬等防不勝防。筆者當(dāng)時(shí)想,如果有一個(gè)“it技術(shù)文檔搜索引擎”就好了,可惜沒有,于是就自己動(dòng)手做吧。我把csdn、it168、賽迪網(wǎng)等it技術(shù)網(wǎng)站存儲(chǔ)在“被搜網(wǎng)站庫”中,按一定的周期啟動(dòng)spider(蜘蛛)程序(spider的原理后面講),spider搜到的結(jié)果按一定格式暫時(shí)存在硬盤上,然后由carrier(搬運(yùn)工)程序異步轉(zhuǎn)存到數(shù)據(jù)庫中,再利用sql server強(qiáng)大的全文檢索(不是用like語句j)結(jié)合asp.net做出查詢界面,這便有了soso的原型。由于soso只搜特定的網(wǎng)站,數(shù)量少,因此數(shù)據(jù)更新的速度更快,而且由于事先對(duì)網(wǎng)站就有了篩選,搜到的結(jié)果質(zhì)量也比較高,比用大型搜索引擎有更好的用戶體驗(yàn)。后來筆者想起校網(wǎng)絡(luò)中心的老師曾提議做一個(gè)專門搜索華師校內(nèi)所有網(wǎng)站信息的搜索引擎,便做了scanner程序,它的功能是檢索出給定的ip范圍內(nèi)所有的網(wǎng)站,并把這些網(wǎng)站的主要信息存入“被搜網(wǎng)站庫”。于是便有了“華師人自己的web搜索引擎------mysoso”,網(wǎng)址http://it.ccnu.edu.cn/mysoso。網(wǎng)站推出后受到了同學(xué)們的好評(píng),校領(lǐng)導(dǎo)也曾在校網(wǎng)絡(luò)建設(shè)工作會(huì)議上點(diǎn)名表揚(yáng)。有個(gè)同學(xué)說:“以前想查一下校學(xué)生會(huì)主席的資料,用google和baidu搜到的結(jié)果都不理想,因?yàn)橹孛奶嗔恕S辛?/span>mysoso就好多了,搜到網(wǎng)頁也都是來源于校內(nèi)各大網(wǎng)站,真實(shí)可靠。”
軟件環(huán)境:windows平臺(tái)(推薦win2000,win2003 server)+.net1.1 framework + sql server 2000。硬件環(huán)境:服務(wù)器一臺(tái),配置越高越好。當(dāng)然有多臺(tái)服務(wù)器更好,這樣spider可以并行地在多臺(tái)機(jī)器上跑。
soso主要由五部分組成,數(shù)據(jù)庫+webscanner+webspider+carrier+asp.net網(wǎng)站。
數(shù)據(jù)庫主要有三張表:被搜網(wǎng)站表,網(wǎng)頁表,關(guān)鍵詞表。被搜網(wǎng)站表存放著spider要去訪問的網(wǎng)站的網(wǎng)址及其他基本信息,網(wǎng)頁表存放搜到的網(wǎng)頁的基本信息,關(guān)鍵詞表記錄用戶檢索過的關(guān)鍵詞及其頻率。數(shù)據(jù)庫里還存放著一些存儲(chǔ)過程,以供其它模塊調(diào)用。此外,因?yàn)橛玫搅?/span>sql server的全文檢索功能,還要?jiǎng)?chuàng)建索引文件。
webscanner是一個(gè)用c#編寫的基于console的應(yīng)用程序,它的作用是掃描一定ip范圍的所有網(wǎng)站的基本信息,并將其存入數(shù)據(jù)庫。由于采用了多線程技術(shù),掃描是比較快的。經(jīng)測(cè)試,掃描華師的ip范圍202.114.32.1~202.114.47.255,得到89個(gè)網(wǎng)站只用了45秒。
webspider是一個(gè)用c#編寫的基于console的應(yīng)用程序,它的作用是訪問數(shù)據(jù)庫中給出的網(wǎng)站,并把網(wǎng)站的網(wǎng)頁抓取下來,抓取的原理是利用正則表達(dá)式(可以適應(yīng)各種網(wǎng)頁),筆記經(jīng)心設(shè)計(jì)了一個(gè)webpage類,它可獲取給定網(wǎng)址的網(wǎng)頁的所有鏈接、站內(nèi)鏈接,鏈接文字、純文本、網(wǎng)頁大小、標(biāo)題等等一系列信息。獲得的網(wǎng)頁信息數(shù)據(jù)放入內(nèi)存中的一個(gè)全局?jǐn)?shù)據(jù)隊(duì)列結(jié)構(gòu),而全局?jǐn)?shù)據(jù)隊(duì)列每隔一定周期被序列化后以文件的形式存于硬盤上,并將自身清空。webspider的內(nèi)部采用了多線程技術(shù),每個(gè)線程維護(hù)自己的廣度優(yōu)先遍歷隊(duì)列,因此速度非常快,經(jīng)華師校內(nèi)測(cè)試,每分鐘平均抓取1,050張網(wǎng)頁。此外,還可以在配置文件中設(shè)定spider的同時(shí)最大并發(fā)線程、線程生存周期、搜索深度、數(shù)據(jù)序列化周期、特定網(wǎng)站過濾等參數(shù)。
carrier是個(gè)批處理文件,它的作用是把webspider輸出的序列化的數(shù)據(jù)從硬盤“搬”到數(shù)據(jù)庫中。那么為什么webspider不直接把數(shù)據(jù)插到數(shù)據(jù)庫里面呢?因?yàn)?/span>sql server在接收大量數(shù)據(jù)插入請(qǐng)求時(shí),效率會(huì)下降,前臺(tái)asp.net網(wǎng)站的查詢效率就會(huì)下降,查詢時(shí)間變長。因此筆者在設(shè)計(jì)時(shí)采用了異步模式,webspider只負(fù)責(zé)收集數(shù)據(jù),carrier來負(fù)責(zé)數(shù)據(jù)插入數(shù)據(jù)庫,這樣通過合理的時(shí)間調(diào)度就可以避免瓶頸的出現(xiàn)。這種異步工作模式在有多臺(tái)計(jì)算機(jī)運(yùn)行webspider時(shí)優(yōu)勢(shì)將更加明顯。
搜索網(wǎng)站是用asp.net開發(fā)的,基本原理相信做過網(wǎng)站的人都知道。soso的亮點(diǎn)體現(xiàn)在三個(gè)地方。首先是對(duì)關(guān)鍵詞分詞的處理。由于筆者對(duì)這方面的算法研究不深,因此用了split()加上sql server的freetext功能實(shí)現(xiàn)了模糊查詢。基本原理是這樣的,比如說,當(dāng)用戶查詢“劉德華天王 mp
華中師范大學(xué)信息技術(shù)系 sunjoy [email protected]
,歡迎訪問網(wǎng)頁設(shè)計(jì)愛好者web開發(fā)。新聞熱點(diǎn)
疑難解答
圖片精選