朱 婧
(福建船政交通職業(yè)學(xué)院,福建 福州35001)
公安系統(tǒng)為了解在校學(xué)生以及青少年的思想動態(tài),確保年輕人思想、心理的健康發(fā)展,而BBS是年輕人最為青睞的文章發(fā)表地,年輕人思想動態(tài)都在BBS 上彰顯出來[1].如上原因,“BBS 搜索系統(tǒng)”這一項(xiàng)目油然而生.本項(xiàng)目的主要任務(wù)是:建立一個搜索引擎系統(tǒng)[2],針對高校BBS 上發(fā)表的文章進(jìn)行檢索,把符合搜索關(guān)鍵字的文章題目和文章摘要檢索出來,通過HTML 頁面顯示出來,在文章題目上建立超鏈接,通過點(diǎn)擊文章題目連接到BBS 相應(yīng)文章中.各大搜索引擎的建立,如Google、百度、Yahoo 等大型搜索引擎讓網(wǎng)民查閱資料的速度大大提升,極大方便了用戶查詢的需求[3].同時,搜索引擎對網(wǎng)站的影響也是相當(dāng)巨大的.一個網(wǎng)站的命脈就是流量,而網(wǎng)站的流量可以分為兩類[4].一類是自然流量,一類就是通過搜索引擎而來的流量.如果搜索引擎能夠能多能有效的抓取網(wǎng)站內(nèi)容,那么對于網(wǎng)站的好處是不言而喻的.
隨著網(wǎng)絡(luò)技術(shù)的迅速發(fā)展,人們?nèi)找媪?xí)慣于運(yùn)用網(wǎng)絡(luò)搜集、掌握信息,網(wǎng)絡(luò)的發(fā)展極大地為人們提供著便利.年輕人更是習(xí)慣與從網(wǎng)絡(luò)攝取信息,但是對于信息質(zhì)量的好壞并不能夠完全甄別,如何促進(jìn)網(wǎng)絡(luò)健康發(fā)展,嚴(yán)防不法分子利用網(wǎng)絡(luò)散播謠言,就需要監(jiān)管部門時刻了解當(dāng)下年輕人的思想動態(tài).BBS 正是年輕人發(fā)表文章、討論各種話題的平臺,通過對BBS 的監(jiān)管即可了解到年輕人時下的思想動態(tài).然而,BBS 論壇多如牛毛,對于監(jiān)管部門如何快速有效地從海量信息中找尋有用信息,從而實(shí)施有利的監(jiān)管,做到防患于未然,建立BBS 搜索引擎則是最行之有效的途徑[5].
目前各大搜索引擎的建立,如Google、百度、Yahoo 等大型搜索引擎讓網(wǎng)民查閱資料的速度大大提升,極大方便了用戶查詢的需求.同時,搜索引擎對網(wǎng)站的影響也是相當(dāng)巨大的.一個網(wǎng)站的命脈就是流量,而網(wǎng)站的流量可以分為兩類.一類是自然流量,一類就是通過搜索引擎而來的流量.如果搜索引擎能夠能多能有效的抓取網(wǎng)站內(nèi)容,那么對于網(wǎng)站的好處是不言而喻的.
BBS 搜索系統(tǒng)主要完成的功能模塊描述如下:
頁面扒取模塊:根據(jù)用戶指定的要求下載相應(yīng)的BBS 文章,如根據(jù)時間要求下載某時間之后的文章.并確保下載的完整性,無遺漏.
頁面存儲模塊:將下載的BBS 文章以一定得形式存儲到數(shù)據(jù)庫中,包括文章的id,標(biāo)題,URL,關(guān)鍵詞及摘要,方便后面索引的建立.
索引建立模塊:根據(jù)關(guān)鍵字列表和存儲在數(shù)據(jù)庫中的文章,以關(guān)鍵詞做索引,建立倒排表,存儲在數(shù)據(jù)庫中.
圖1 檢索查詢模塊結(jié)構(gòu)圖
關(guān)鍵詞添加模塊:由于關(guān)鍵詞列表是由用戶提供,而用戶的關(guān)鍵詞列表也是在動態(tài)變化的.這樣需要關(guān)鍵詞列表的輸入符合動態(tài)變化,即一次輸入不符合要求.如果有新的關(guān)鍵詞出現(xiàn),關(guān)鍵詞添加模塊負(fù)責(zé)將其加入到關(guān)鍵詞列表中.
敏感詞過濾模塊:根據(jù)用戶提供的敏感詞表建立一個敏感文章表,并將其存儲到本地文件中,方便用戶提取.此敏感詞過濾模塊還應(yīng)當(dāng)具有報(bào)警功能.如果這個記錄沒有出現(xiàn)敏感詞,則不報(bào)警.如果出現(xiàn)敏感詞,則報(bào)警提示用戶查看文件.
圖2 項(xiàng)目總體架構(gòu)圖
檢索查詢模塊:該模塊將用戶輸入的關(guān)鍵詞進(jìn)行搜索,從索引表中找出文章中存在關(guān)鍵詞的文章ID,再通過文章ID 找到數(shù)據(jù)庫中存放的文章.這一模塊由本人負(fù)責(zé).其具體結(jié)構(gòu)圖如圖1 所示.
頁面生成系統(tǒng):由于存放在數(shù)據(jù)庫中的文章已經(jīng)以一定的結(jié)構(gòu)存在,頁面生成系統(tǒng)調(diào)用該結(jié)構(gòu)中的標(biāo)題,URL,關(guān)鍵字,摘要,以HTML 頁面顯示出來,通過點(diǎn)擊文章標(biāo)題啟動超鏈接,連接到相應(yīng)BBS 文章中去.
本項(xiàng)目的總體架構(gòu)如下圖2 所示.
從上圖可以看出,建立搜索引擎需要三大部分:搜索、整理和服務(wù).整理部分中的索引建立和服務(wù)部分是本人的主要任務(wù).
倒排系統(tǒng)的工作原理.
首先,倒排系統(tǒng)搜索MySQL 數(shù)據(jù)庫中的數(shù)據(jù)表PageInfo,查找沒有被索引的文章記錄,即YN==0 的記錄.
然后,倒排系統(tǒng)將沒有被索引的記錄進(jìn)行處理.將此記錄中的關(guān)鍵詞與倒排表的關(guān)鍵詞進(jìn)行比較,如果沒有此關(guān)鍵詞,則在倒排表Keyword 中加入此關(guān)鍵詞.如果存在此關(guān)鍵詞,則不作改變.由于數(shù)據(jù)表中每篇文章對應(yīng)的關(guān)鍵詞可能有多個,所以對關(guān)鍵詞的提取要逐個進(jìn)行.
接下來,將此記錄中每個關(guān)鍵詞對應(yīng)的文章id 加入倒排表Idstring 中.Idstring 以鏈表的方式存放文章id.這樣方便檢索和頁面生成.
倒排系統(tǒng)重復(fù)上面的工作,直到所有的數(shù)據(jù)表記錄都被索引.這就是倒排系統(tǒng)實(shí)現(xiàn)的基本工作原理.
倒排系統(tǒng)是建立在MySQL 數(shù)據(jù)庫基礎(chǔ)上的,需要前期的一個數(shù)據(jù)表,該表也存放在MySQL 數(shù)據(jù)庫中.該數(shù)據(jù)表存放著BBS 文章的所有重要信息.例如:文章ID,文章標(biāo)題,URL,關(guān)鍵詞以及文章摘要.其具體形式如下數(shù)據(jù)表1.
表1 數(shù)據(jù)表
YN Int(DEFAULT 0)此記錄是否被引用
該數(shù)據(jù)表的名稱是PageInfo,創(chuàng)建該表的SQL語句是:
Create table PageInfo(id int auto_increment primary key,title varchar(250),keyword varchar(300),content varchar(512),YN int DEFAULT 0);由于該表對于倒排表的建立與以后的檢索有重要作用,故在此要詳細(xì)介紹一下.Id 是該表的主關(guān)鍵字.Title 是該表存儲的BBS 文章標(biāo)題.Keyword 存放BBS 文章的關(guān)鍵詞.Content 是BBS 文章的摘要.YN 存放一個標(biāo)志,該標(biāo)志是Int 型,初始值為0,當(dāng)該條信息被記錄到倒排系統(tǒng)時,YN 置為1,以防止以后建立倒排表時出現(xiàn)重復(fù)寫入.
倒排表的建立還需要一個重要的表格就是:關(guān)鍵詞表.該表格存放公安系統(tǒng)提供的關(guān)鍵詞,以這些關(guān)鍵詞做索引,可以避免無關(guān)內(nèi)容的盲目存入.
倒排系統(tǒng)主要的表就是倒排表,該倒排表是基于上面介紹的數(shù)據(jù)表與關(guān)鍵詞表而建立.由于數(shù)據(jù)表內(nèi)容完整,為了防止信息的冗余,倒排表的建立就相對簡單,只包括兩項(xiàng)內(nèi)容:關(guān)鍵詞與文章ID.如倒排表2:
表2 倒排表
該倒排表的名稱是IndexInfo,創(chuàng)建該表的SQL語句是:
Create table IndexInfo(keyword varchar(30)primary key,idstring varchar(1024));包括兩項(xiàng):Keyword 與Idstring.Keyword 存放從關(guān)鍵詞表中提取出來的關(guān)鍵詞,并且此為該表的主關(guān)鍵字.Idstring 存放以該關(guān)鍵詞搜索數(shù)據(jù)表出現(xiàn)的文章Id.由于某關(guān)鍵詞可能在好多文章中出現(xiàn),所以Idstring 采取鏈表式結(jié)構(gòu).搜索數(shù)據(jù)表時后讀到的文章Id 存放在先讀到得文章Id 后面.
由于索引系統(tǒng)還涉及一個重要的組成部分,敏感詞匯的處理.這里涉及一個非常重要的數(shù)據(jù)表:敏感文章表.該表的具體格式如表3:
表3 敏感文章表
Varchar(300) 關(guān)鍵詞Content Varchar(1024) 文章摘要Sign Int(DEFAULT 0)報(bào)警標(biāo)志
該數(shù)據(jù)表的名稱是TitleInfo,創(chuàng)建該表的SQL語句是:
Create table TitleInfo(id int auto_increment primary key,title varchar(250),keyword varchar(300),content varchar(512),Sign int DEFAULT 0).Id 是該表的主關(guān)鍵字.Title 是該表存儲的BBS 文章標(biāo)題.Keyword 存放BBS 文章的關(guān)鍵詞.Content 是BBS 文章的摘要.Sign 存放一個標(biāo)志,該標(biāo)志是Int型,初始值為0,如果存在敏感文章記錄,將其記錄對應(yīng)的Sign 置為1.
首先,檢索器從用戶界面得到關(guān)鍵詞.關(guān)鍵詞可能是一個,也可能是幾個.現(xiàn)在分類討論.
對于單個關(guān)鍵詞.檢索器通過一個暫存點(diǎn)得到此關(guān)鍵詞.將此關(guān)鍵詞搜索MySQL 數(shù)據(jù)庫中存放的倒排表IndexInfo.如果沒有匹配的記錄,則返回空值.如果倒排表中存在此關(guān)鍵詞,將其文章id 鏈表提取出來,存入一個字符串中.由于文章id 才用“關(guān)鍵詞;關(guān)鍵詞;……”的形式存放,所以運(yùn)用一個循環(huán),將文章id 逐個提取出來.
圖3 搜索頁面
對于多個關(guān)鍵詞.檢索器采用和取的處理方法.多個關(guān)鍵詞存入一個字符串中.由于本系統(tǒng)只能采用“關(guān)鍵詞 關(guān)鍵詞……”的形式輸入,對于其他輸入方式不識別.所有處理存放多關(guān)鍵詞的字符串,只需要通過一個循環(huán)語句,以空格作為分界,將每個關(guān)鍵詞一次存入到一個數(shù)組中.然后依次將數(shù)組中的每個關(guān)鍵詞提取出來,運(yùn)用上面處理單關(guān)鍵詞的手段,將其對應(yīng)文章id 找到,再將所有的關(guān)鍵詞對應(yīng)的文章id 做對比,如果存在公共的文章id,則通過此文章id 搜索數(shù)據(jù)表PageInfo 來得到相應(yīng)的記錄.如果不存在,則返回為空.
接下來介紹檢索系統(tǒng)中類的實(shí)現(xiàn).首先靜態(tài)處理類SearchInDB(string word),它傳入一個關(guān)鍵詞,返回一個string 類型.SearchInDB 類通過關(guān)鍵詞word 查找數(shù)據(jù)庫倒排表獲得相應(yīng)的Idstring,即關(guān)鍵詞對應(yīng)的文章ID.下面介紹關(guān)鍵詞處理類Word-In(string wordstring),它的返回值是空類型.類WordIn 用wordstring 得到輸入框中傳入的關(guān)鍵詞.由于該關(guān)鍵詞可能由幾個詞組成,所以類WordIn對得到的關(guān)鍵詞做了處理,把wordstring 轉(zhuǎn)換成“關(guān)鍵詞;關(guān)鍵詞;……”這樣的形式,然后再將wordstring 的每個關(guān)鍵詞逐個存入數(shù)組word[]中.
主操作類WordProcess 首先調(diào)用類WordIn 將輸入框得到的關(guān)鍵詞做處理,得到關(guān)鍵詞數(shù)組word[].再通過一個循環(huán)操作依次把word[]傳入類SearchInDB,得到每個關(guān)鍵詞對應(yīng)的文章ID,再對所有關(guān)鍵詞對應(yīng)的ID 進(jìn)行比較,得到公共的id.為下文的頁面生成系統(tǒng)做準(zhǔn)備.
檢索器的用戶頁面運(yùn)用C#中的windows application 來實(shí)現(xiàn).設(shè)置一個屬于框和一個搜索按鈕,將搜索關(guān)鍵詞通過函數(shù)導(dǎo)入到處理類中.搜索頁面截圖如下圖3 所示:
BBS 搜索系統(tǒng)可以實(shí)現(xiàn)小規(guī)模的BBS 文章搜索.由于系統(tǒng)的結(jié)構(gòu),響應(yīng)時間與效率都有待優(yōu)化,以及有些功能如文章排序等沒有實(shí)現(xiàn)等問題,本系統(tǒng)欠缺的還很多,但是經(jīng)過不斷努力,終于將本系統(tǒng)的功能基本實(shí)現(xiàn),還是感到十分欣慰的.相信經(jīng)過不斷地改進(jìn)與完善,本系統(tǒng)一定能夠成為一個高性能,易于維護(hù)的搜索系統(tǒng).
[1] 申展,江寶林,唐磊,等.全文檢索模型綜述[J].計(jì)算機(jī)科學(xué),2004(5):61-64.
[2] 王鋮偉.電子商務(wù)智能搜索及挖掘系統(tǒng)檢索器的設(shè)計(jì)[J].有色金屬設(shè)計(jì),2007(34):61-69.
[3] 張汛淶.搜索引擎的設(shè)計(jì)剖析[J].計(jì)算機(jī)工程與科學(xué),2002(24):18-20.
[4] 劉曉華.精通MFC[M].北京:電子工業(yè)出版社,2003.
[5] 顏維龍,蓋杰,武港山,等.面向網(wǎng)絡(luò)的全文檢索中索引文件的組織[J].計(jì)算機(jī)應(yīng)用研究,2002(7):124-136.