分布式检索系统的简单设计
(1) XML預(yù)處理
讀取test.xml并修改url節(jié)點(diǎn)下的localhost信息,以保證預(yù)覽和下載用戶所需正確資源。過程如下:
List list = document.selectNodes("allresource/resourceitem/url");
Iterator iter = list.iterator();
while (iter.hasNext()) {
Element url = (Element)iter.next();
String ur=url.getText();
String str1=ur.substring(0,7);
String str2=ur.substring(ur.indexOf(":8080"));
String str3=str1+LocalIP+str2;
url.setText(str3);
}
(2)服務(wù)器注冊(cè)、注銷和選舉
開啟服務(wù)器后,可以實(shí)現(xiàn)單機(jī)搜索。考慮到test.xml中關(guān)于服務(wù)器IP信息的不確定性,我們采取獲取本機(jī)IP后,在后臺(tái)手動(dòng)輸入主服務(wù)器IP并添加從機(jī)的方式(詳細(xì)步驟請(qǐng)看用戶操作手冊(cè))來實(shí)現(xiàn)服務(wù)器的分布式,這種方式能夠適合多種情況。
1、服務(wù)器初始化步驟如下:
(1)主服務(wù)器先行注冊(cè)后,開啟監(jiān)聽服務(wù)
(2)從機(jī)獲取主服務(wù)器IP后存入本地XML中
(3)開啟RMI注冊(cè)服務(wù),遠(yuǎn)程機(jī)器實(shí)現(xiàn)向主服務(wù)器注冊(cè)、注銷
(4)每臺(tái)服務(wù)器將在線服務(wù)器的IP動(dòng)態(tài)寫入本地的數(shù)據(jù)文件
(5)由Socket通信服務(wù)監(jiān)聽各服務(wù)器狀態(tài)
2、從機(jī)向主服務(wù)器遠(yuǎn)程注冊(cè)成功和注銷成功后,主服務(wù)器會(huì)通知已連接在線的其他從機(jī)有新的機(jī)器加入或有機(jī)器掉線。當(dāng)由于網(wǎng)絡(luò)不穩(wěn)定等異常發(fā)生導(dǎo)致主服務(wù)器掉線,通過選舉算法在從機(jī)中選舉出新主服務(wù)器,其他從機(jī)向新主服務(wù)器注冊(cè)建立連接,以保證用戶能繼續(xù)搜索。
3、具體實(shí)現(xiàn)通過Socket通信技術(shù),主服務(wù)器端開啟監(jiān)聽服務(wù),監(jiān)聽已注冊(cè)客戶端的狀態(tài),當(dāng)有客戶端因?yàn)楫惓5艟€時(shí),主服務(wù)器通過線程負(fù)責(zé)通知其他從機(jī)該客戶端已不在線。已注冊(cè)客戶端向服務(wù)端發(fā)送信息并接受主服務(wù)器端的反饋信息,當(dāng)客戶端沒有收到服務(wù)器端信息時(shí),說明主服務(wù)器因異常掉線,各客戶端相互通知,并通過選舉算法選舉出新主服務(wù)器。
(3) 拼音搜索功能
該搜索引擎實(shí)現(xiàn)拼音搜索功能。因?yàn)橹苯訉?shí)現(xiàn)拼音轉(zhuǎn)為漢字較為困難,我們通過將資源關(guān)鍵字以及對(duì)應(yīng)拼音寫入數(shù)據(jù)庫,實(shí)現(xiàn)拼音搜索功能。
實(shí)現(xiàn)步驟:
在服務(wù)器啟動(dòng)時(shí),檢索xml文件。
將xml中所有關(guān)鍵字檢索,并利用pinyin4j包分別將所有關(guān)鍵字轉(zhuǎn)化為對(duì)應(yīng)拼音。
將漢字及其對(duì)應(yīng)拼音作為一行記錄寫入數(shù)據(jù)庫中。
搜索時(shí),從數(shù)據(jù)庫中提取出與輸入拼音相對(duì)應(yīng)的關(guān)鍵字,作為參數(shù)傳遞給搜索方法,進(jìn)行搜索。
(4)搜索過程
?? 1.分詞.
索引過程與搜索過程中運(yùn)用的是JE分詞器,JE分詞器是一款輕量級(jí)的、易于安裝的分詞器,只需將包導(dǎo)入項(xiàng)目的lib中即可,JE分詞器分詞效率不錯(cuò),準(zhǔn)確度也不錯(cuò)。
?2.索引.
用dom4j讀取xml文檔,將節(jié)點(diǎn)信息封裝進(jìn)javabean中,然后利用lucene建立倒排索引表。
?3.普通搜索.
判斷輸入的關(guān)鍵字是否為拼音,如果為拼音則查詢數(shù)據(jù)庫選出相應(yīng)的漢語。然后,然后利用JE分詞器將關(guān)鍵字分詞,建立關(guān)鍵字?jǐn)?shù)組,遍歷關(guān)鍵字?jǐn)?shù)組,通過TermQuery建立BooleanQuery,然后對(duì)索引進(jìn)行查找。
?4.模糊查找.
判斷輸入的關(guān)鍵字是否為拼音,如果為拼音則查詢數(shù)據(jù)庫選出相應(yīng)的漢語。然后,然后利用JE分詞器將關(guān)鍵字分詞,建立關(guān)鍵字?jǐn)?shù)組,遍歷關(guān)鍵字?jǐn)?shù)組,通過FuzzyQuery建立BooleanQuery,然后對(duì)索引進(jìn)行查找。
?? 5.按種類進(jìn)行搜索.
在普通搜索的基礎(chǔ)上,通過重寫了lucene的過濾器,對(duì)多種格式的文件進(jìn)行了過濾,以實(shí)現(xiàn)按類別查找。
???? 6.高級(jí)搜索.
包括包含多關(guān)鍵字的搜索,包一任意關(guān)鍵字的搜索,包含完整關(guān)鍵字的搜索以及前綴搜索。包含多關(guān)鍵字可以通過BooleanQuery的MUST和SHOULD屬性來實(shí)現(xiàn)。包含任一關(guān)鍵字用BooleanQuery實(shí)現(xiàn)。包含完整關(guān)鍵字可以通過不對(duì)關(guān)鍵字進(jìn)行分詞而直接對(duì)索引進(jìn)行搜索的方式來實(shí)現(xiàn)。前綴搜索可以通過lucene的PrefixQuery來實(shí)現(xiàn)。
高級(jí)搜索還添加了不包含關(guān)鍵字,資源的作者和上傳者等限制條件,這些都是通過重寫lucene過濾器實(shí)現(xiàn)的.
? 7.高亮顯示模塊.
利用lucene的 Highlighter 類對(duì)于關(guān)鍵字匹配的信息進(jìn)行變紅處理,以供前臺(tái)的高亮顯示。
??? 8.對(duì)結(jié)果集的去除重復(fù)處理.
利用自己編寫的方法將檢索結(jié)果中的重復(fù)項(xiàng)去掉,然后通過冒泡排序算法對(duì)分布式檢索的結(jié)果進(jìn)行排序,排序是比較的是文檔的得分。lucene對(duì)文檔的匹配程度的衡量有一套評(píng)分公式,通過計(jì)算得出每個(gè)文檔的得分情況,通過得分來評(píng)價(jià)文檔的相關(guān)程度。
?? 9.將返回結(jié)果輸出到jsp頁面上.
??? lucene : Lucene是一套用于全文檢索和搜尋的開源程式庫,由Apache軟件基金會(huì)支持和提供。Lucene提供了一個(gè)簡單確強(qiáng)大的應(yīng)用程式接口,能夠做全文索引和搜尋,在Java開發(fā)環(huán)境里Lucene是一個(gè)成熟的免費(fèi)開放源代碼工具;
dom4j:dom4j是一個(gè)非常非常優(yōu)秀的Java XML API,具有性能優(yōu)異、功能強(qiáng)大和極端易用使用的特點(diǎn),同時(shí)它也是一個(gè)開放源代碼的軟件
(4)后臺(tái)管理
???? 1、用戶注冊(cè):用戶可以通過用戶注冊(cè)登陸我們的系統(tǒng),成為用戶,出于對(duì)資源安全的考慮,我們只允許已經(jīng)注冊(cè)過得用戶上傳資源,然后就可以使用我們的上傳功能。
???? 2、資源上傳:用戶可以通過上傳功能上傳包括(文檔,視頻,音頻,以及圖片),由于我們有大小以及格式的限制,所以會(huì)有一些格式的文件不
上傳;
???? 3、資源審核:對(duì)于用戶上傳的資源并不是直接就能搜索到的,而是要通過后臺(tái)管理員的確定,這里我們完成的是對(duì)已經(jīng)上傳的資源的審核功能,
定其合法性和有用性。
???? 4、上傳功能:在這里我們可以把已經(jīng)通過審核的資源批量的上傳,并且建立起索引,直接就可以把他們搜索出來。
???? 5、普通刪除:管理員可以通過普通刪除把不需要的文件進(jìn)行刪除,這里支持單個(gè)刪除也可以批量刪除。
???? 6、時(shí)間刪除:管理員可以把已經(jīng)過時(shí)的文件通過時(shí)間刪除進(jìn)行刪除,進(jìn)行文件的更新。
??? 用戶列表:管理員查看用戶列表信息,可以在這里把已經(jīng)注冊(cè)的用戶進(jìn)行刪除。
???? 7、服務(wù)器添加:可以手動(dòng)的添加服務(wù)器;
???? 8、服務(wù)器列表:可以查看在線的服務(wù)器
轉(zhuǎn)載于:https://www.cnblogs.com/yimindu/p/3367030.html
總結(jié)
以上是生活随笔為你收集整理的分布式检索系统的简单设计的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Firefox火狐广告过滤插件Adblo
- 下一篇: Pinger2