版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 目 錄</b></p><p><b> 摘要1</b></p><p> Abstract2</p><p><b> 第1章 引言3</b></p><p> 1.1 課題背景3</p><p>
2、1.2 國(guó)內(nèi)外研究現(xiàn)狀3</p><p> 1.3 課題的目的和意義4</p><p> 1.4 本章小結(jié)4</p><p> 第2章 相關(guān)技術(shù)及開(kāi)發(fā)工具介紹5</p><p> 2.1 J2EE簡(jiǎn)介5</p><p> 2.2 Lucene6</p><p>
3、 2.3 開(kāi)發(fā)環(huán)境及工具7</p><p> 第3章 系統(tǒng)總體設(shè)計(jì)8</p><p> 3.1 總體設(shè)計(jì)框架8</p><p> 3.2 系統(tǒng)基本功能8</p><p> 3.3 數(shù)據(jù)庫(kù)設(shè)計(jì)11</p><p> 3.4 本章小結(jié)13</p><p> 第4
4、章 部分系統(tǒng)模塊詳細(xì)設(shè)計(jì)與實(shí)現(xiàn)14</p><p> 4.1 郵箱管理模塊14</p><p> 4.2 用戶(hù)管理模塊18</p><p> 4.3 JMS應(yīng)用19</p><p> 4.4 本章小結(jié)22</p><p> 第5章 郵件檢索模塊詳細(xì)設(shè)計(jì)與實(shí)現(xiàn)23</p>
5、<p> 5.1 郵件的索引23</p><p> 5.2 郵件的搜索27</p><p> 5.3 搜索結(jié)果的高亮顯示30</p><p> 5.4 本章小結(jié)31</p><p> 第6章 總結(jié)與展望32</p><p> 6.1 系統(tǒng)總結(jié)32</p>&l
6、t;p> 6.2 系統(tǒng)實(shí)現(xiàn)部分效果圖32</p><p> 6.3 發(fā)展前景34</p><p><b> 謝辭35</b></p><p><b> 參考文獻(xiàn)36</b></p><p><b> 附 錄37</b></p><
7、;p> 支持全文檢索的郵件代理服務(wù)平臺(tái)—多郵箱管理及Lucene在郵件搜索上的應(yīng)用</p><p> 摘要:本文闡述了設(shè)計(jì)與實(shí)現(xiàn)支持全文檢索的郵件代理服務(wù)平臺(tái)的理論基礎(chǔ),設(shè)計(jì)思想,整體架構(gòu)等。其中最主要的是應(yīng)用了J2EE中的JavaMail、JMS、EJB3中的消息驅(qū)動(dòng)Bean和Lucene。本文著重闡述了Lucene全文索引及檢索技術(shù)在該系統(tǒng)中的應(yīng)用,包括索引的建立,索引的修改,搜索,對(duì)搜索結(jié)果的高
8、亮顯示等。</p><p> 關(guān)鍵字:J2EE;JavaMail;消息驅(qū)動(dòng)Bean;Lucene;全文檢索</p><p> Support Full-text Search Platform for E-mail Proxy Service</p><p> ——Management of Multiple Mailboxes and Application
9、 of Lucene in Mail Search</p><p> Abstract: This paper describes the design and implementation support for full-text indexing of e-mail proxy service platform based on the theory, design thinking, the overa
10、ll structure and so on. The most important is the use of J2EE in the JavaMail, JMS, EJB3 of Message-Driven Bean and Lucene.This article focuses on the Lucene full-text indexing and retrieval technology in the system, inc
11、luding the establishment of the index, index changes, and search on the highlighted search results display.</p><p> Key words: J2EE; JavaMail; Message-Driven Bean; Lucene; Full-text Search</p><p&
12、gt;<b> 第1章 引言</b></p><p><b> 1.1 課題背景</b></p><p> 電子郵件是一種用電子手段提供信息交換的通信方式。是Internet應(yīng)用最廣的服務(wù):通過(guò)網(wǎng)絡(luò)的電子郵件系統(tǒng),用戶(hù)可以用非常低廉的價(jià)格,以非??焖俚姆绞?,與世界上任何一個(gè)角落的網(wǎng)絡(luò)用戶(hù)聯(lián)系,這些電子郵件可以是文字、圖像、聲音等各種方式
13、。同時(shí),用戶(hù)可以得到大量免費(fèi)的新聞、專(zhuān)題郵件,并實(shí)現(xiàn)輕松的信息搜索。這是任何傳統(tǒng)的方式也無(wú)法相比的。正是由于電子郵件的使用簡(jiǎn)易、投遞迅速、收費(fèi)低廉,易于保存、全球暢通無(wú)阻,使得電子郵件被廣泛地應(yīng)用,它使人們的交流方式得到了極大的改變。另外,電子郵件還可以進(jìn)行一對(duì)多的郵件傳遞,同一郵件可以一次發(fā)送給許多人。最重要的是,電子郵件是整個(gè)網(wǎng)間網(wǎng)以至所有其他網(wǎng)絡(luò)系統(tǒng)中直接面向人與人之間信息交流的系統(tǒng),它的數(shù)據(jù)發(fā)送方和接收方都是人,所以極大地滿(mǎn)足了
14、大量存在的人與人通信的需求。</p><p> 當(dāng)今社會(huì)是信息化的社會(huì),人們并不僅僅滿(mǎn)足于現(xiàn)有的電子郵件服務(wù),由于移動(dòng)辦公的需要,電子郵件服務(wù)由單純的客戶(hù)端收發(fā)郵件發(fā)展到了Web郵件,但電子郵件的發(fā)展還未就此停止,現(xiàn)在的人群當(dāng)中存在一大批人是擁有不止一個(gè)電子郵箱的,他們對(duì)電子郵件服務(wù)又有了新的需求,此時(shí)電子郵件服務(wù)就必須滿(mǎn)足支持多個(gè)郵箱管理的功能。</p><p> 1.2 國(guó)內(nèi)外研
15、究現(xiàn)狀</p><p> 電子郵件發(fā)展到現(xiàn)在,用戶(hù)使用電子郵件服務(wù)的方式有兩種:一種是用戶(hù)使用個(gè)人計(jì)算機(jī)上的客戶(hù)端軟件,比如Outlook,F(xiàn)oxmail等。Outlook是由美國(guó)微軟公司(Microsoft)出品的免費(fèi)軟件,與Internet Explorer瀏覽器軟件捆綁發(fā)行;Foxmail是由國(guó)人張小龍編寫(xiě)的一個(gè)功能強(qiáng)大非商業(yè)軟件,它實(shí)現(xiàn)了真正的多用戶(hù)、多賬戶(hù)、多POP3支持,自動(dòng)進(jìn)行撥號(hào),能設(shè)置郵件過(guò)濾
16、功能,能閱讀和收發(fā)Big5碼的郵件,可以直接查看HTML格式郵件。這兩種客戶(hù)端軟件只要通過(guò)適當(dāng)?shù)呐渲煤?,就可以?duì)郵件進(jìn)行接收和發(fā)送,但單純使用郵件客戶(hù)端程序進(jìn)行郵件的收發(fā)已經(jīng)不能滿(mǎn)足用戶(hù)移動(dòng)辦公的需要。另一種就是使用WebMail系統(tǒng),將E-mail和Web結(jié)合在一起,即通過(guò)Web編程和適當(dāng)?shù)南到y(tǒng)設(shè)置,使用戶(hù)僅僅以訪(fǎng)問(wèn)Web的方式就可以得到和使用完整的郵件服務(wù)的系統(tǒng)稱(chēng)為WebMail系統(tǒng)。WebMail是目前Internet上最受歡迎和
17、使用最多的服務(wù)之一,也是很多網(wǎng)站必備功能之一。像網(wǎng)易、新浪等大型門(mén)戶(hù)網(wǎng)站都提供了免費(fèi)的WebMail服務(wù),并在其中加入了一些別的實(shí)用功能。如Google的GMail提供給郵</p><p> 1.3 課題的目的和意義</p><p> 本課題意在設(shè)計(jì)并實(shí)現(xiàn)一種支持全文檢索的郵件代理服務(wù)平臺(tái),使用戶(hù)進(jìn)一步感受到電子郵件服務(wù)給他們帶來(lái)的方便與快捷。雖然現(xiàn)有的郵件服務(wù)系統(tǒng)已經(jīng)比較完善,但對(duì)
18、于多個(gè)郵箱的支持還是比較少的,而且對(duì)多個(gè)郵箱中的文件進(jìn)行統(tǒng)一管理的更少,因此有必要設(shè)計(jì)并實(shí)現(xiàn)一個(gè)支持多個(gè)郵箱收發(fā)郵件的系統(tǒng)。</p><p> 對(duì)于這種服務(wù)系統(tǒng),雖然現(xiàn)在在用戶(hù)中使用地比較少,而且專(zhuān)門(mén)提供類(lèi)似服務(wù)的系統(tǒng)也不多。但隨著電子郵件的發(fā)展,相信在這方面的需求會(huì)越來(lái)越突出,而這種系統(tǒng)將會(huì)越來(lái)越得到用戶(hù)的青睞。</p><p><b> 1.4 本章小結(jié)</b&g
19、t;</p><p> 本章主要介紹了支持全文檢索的郵件代理服務(wù)平臺(tái)的研究背景、國(guó)內(nèi)外的研究狀況及本課題的目的和意義。</p><p> 第2章 相關(guān)技術(shù)及開(kāi)發(fā)工具介紹</p><p> 2.1 J2EE簡(jiǎn)介</p><p> J2EE是一種利用Java 2平臺(tái)來(lái)簡(jiǎn)化企業(yè)解決方案的開(kāi)發(fā)、部署和管理相關(guān)的復(fù)雜問(wèn)題的體系結(jié)構(gòu)。J2EE
20、技術(shù)的基礎(chǔ)就是核心Java平臺(tái)或Java 2平臺(tái)的標(biāo)準(zhǔn)版,J2EE不僅鞏固了標(biāo)準(zhǔn)版中的許多優(yōu)點(diǎn),例如“編寫(xiě)一次、隨處運(yùn)行”的特性、方便存取數(shù)據(jù)庫(kù)的JDBC API、CORBA技術(shù)以及能夠在Internet應(yīng)用中保護(hù)數(shù)據(jù)的安全模式等等,同時(shí)還提供了對(duì)EJB(Enterprise JavaBeans)、Java Servlet API、JSP(Java Server Pages)以及XML技術(shù)的全面支持。其最終目的就是成為一個(gè)能夠使企業(yè)開(kāi)發(fā)
21、者大幅縮短投放市場(chǎng)時(shí)間的體系結(jié)構(gòu)。</p><p> J2EE體系結(jié)構(gòu)提供中間層集成框架用來(lái)滿(mǎn)足無(wú)需太多費(fèi)用而又需要高可用性、高可靠性以及可擴(kuò)展性的應(yīng)用的需求。通過(guò)提供統(tǒng)一的開(kāi)發(fā)平臺(tái),J2EE降低了開(kāi)發(fā)多層應(yīng)用的費(fèi)用和復(fù)雜性,同時(shí)提供對(duì)現(xiàn)有應(yīng)用程序集成強(qiáng)有力支持,完全支持Enterprise JavaBeans,有良好的向?qū)еС执虬筒渴饝?yīng)用,添加目錄支持,增強(qiáng)了安全機(jī)制,提高了性能[13]。</p>
22、;<p> 2.1.1 JavaMail</p><p> JavaMail,顧名思義,提供給開(kāi)發(fā)者處理電子郵件相關(guān)的編程接口。它是Sun發(fā)布的用來(lái)處理email的API。它可以方便地執(zhí)行一些常用的郵件傳輸。我們可以基于JavaMail開(kāi)發(fā)出類(lèi)似于Microsoft Outlook的應(yīng)用程序。</p><p> 雖然JavaMail是Sun的API之一,但它目前還沒(méi)有
23、被加在標(biāo)準(zhǔn)的java開(kāi)發(fā)工具包中(Java Development Kit),這就意味著你在使用前必須另外下載JavaMail文件。除此以外,你還需要有Sun的JavaBeans Activation Framework (JAF)。JavaBeans Activation Framework的運(yùn)行很復(fù)雜,在這里簡(jiǎn)單的說(shuō)就是JavaMail的運(yùn)行必須得依賴(lài)于它的支持。在Windows 2000下使用需要指定這些文件的路徑,在其它的操作系
24、統(tǒng)上也類(lèi)似。</p><p> 2.1.2 JMS</p><p> JMS(Java Message Service,Java消息服務(wù))是一組Java應(yīng)用接口,它提供創(chuàng)建、發(fā)送、接收、讀取消息的服務(wù)。JMS API定義了一組公共的應(yīng)用程序接口和相應(yīng)語(yǔ)法,使得Java應(yīng)用能夠和各種消息中間件進(jìn)行通信,這些消息中間件包括IBM MQ-Series、Microsoft MSMQ及純Jav
25、a的Sonic MQ。通過(guò)使用JMS API,開(kāi)發(fā)人員無(wú)需掌握不同消息產(chǎn)品的使用方法,也可以使用統(tǒng)一的JMS API來(lái)操縱各種消息中間件。通過(guò)使用JMS,能夠最大限度地提升消息應(yīng)用的可移植性。JMS既支持點(diǎn)對(duì)點(diǎn)的消息通信,也支持發(fā)布/訂閱式的消息通信。</p><p> 2.1.3 EJB3</p><p> EJB是sun的服務(wù)器端組件模型,最大的用處是部署分布式應(yīng)用程序,類(lèi)似微軟
26、的com技術(shù)。憑借java跨平臺(tái)的優(yōu)勢(shì),用EJB技術(shù)部署的分布式系統(tǒng)可以不限于特定的平臺(tái)。</p><p> EJB(Enterprise Java Bean)是J2EE的一部分,定義了一個(gè)用于開(kāi)發(fā)基于組件的企業(yè)多重應(yīng)用程序的標(biāo)準(zhǔn)。其特點(diǎn)包括網(wǎng)絡(luò)服務(wù)支持和核心開(kāi)發(fā)工具(SDK)。</p><p> 在J2EE里,Enterprise Java Beans(EJB)稱(chēng)為Java企業(yè)Bea
27、n,是Java的核心代碼,分別是會(huì)話(huà)Bean(Session Bean),實(shí)體Bean(Entity Bean)和消息驅(qū)動(dòng)Bean(MessageDriven Bean)。</p><p> Session Bean用于實(shí)現(xiàn)業(yè)務(wù)邏輯,它可以是有狀態(tài)的,也可以是無(wú)狀態(tài)的。每當(dāng)客戶(hù)端請(qǐng)求時(shí),容器就會(huì)選擇一個(gè)Session Bean來(lái)為客戶(hù)端服務(wù)。Session Bean可以直接訪(fǎng)問(wèn)數(shù)據(jù)庫(kù),但更多時(shí)候,它會(huì)通過(guò)Ent
28、ity Bean實(shí)現(xiàn)數(shù)據(jù)訪(fǎng)問(wèn)。</p><p> Entity Bean是域模型對(duì)象,用于實(shí)現(xiàn)O/R映射,負(fù)責(zé)將數(shù)據(jù)庫(kù)中的表記錄映射為內(nèi)存中的Entity對(duì)象,事實(shí)上,創(chuàng)建一個(gè)Entity Bean對(duì)象相當(dāng)于新建一條記錄,刪除一個(gè)Entity Bean會(huì)同時(shí)從數(shù)據(jù)庫(kù)中刪除對(duì)應(yīng)記錄,修改一個(gè)Entity Bean時(shí),容器會(huì)自動(dòng)將Entity Bean的狀態(tài)和數(shù)據(jù)庫(kù)同步。</p><p>
29、 MessageDriven Bean是EJB2.0中引入的新的企業(yè)Bean,它基于JMS消息,只能接收客戶(hù)端發(fā)送的JMS消息然后處理。MDB實(shí)際上是一個(gè)異步的無(wú)狀態(tài) Session Bean,客戶(hù)端調(diào)用MDB后無(wú)需等待,立刻返回,MDB將異步處理客戶(hù)請(qǐng)求。這適合于需要異步處理請(qǐng)求的場(chǎng)合,比如訂單處理,這樣就能避免客戶(hù)端長(zhǎng)時(shí)間的等待一個(gè)方法調(diào)用直到返回結(jié)果。</p><p> 2.2 Lucene</p
30、><p> Lucene是apache軟件基金會(huì)jakarta項(xiàng)目組的一個(gè)子項(xiàng)目,是一個(gè)開(kāi)放源代碼的全文檢索引擎工具包,即它不是一個(gè)完整的全文檢索引擎,而是一個(gè)全文檢索引擎的架構(gòu),提供了完整的查詢(xún)引擎和索引引擎,部分文本分析引擎(英文與德文兩種西方語(yǔ)言)。Lucene的目的是為軟件開(kāi)發(fā)人員提供一個(gè)簡(jiǎn)單易用的工具包,以方便的在目標(biāo)系統(tǒng)中實(shí)現(xiàn)全文檢索的功能,或者是以此為基礎(chǔ)建立起完整的全文檢索引擎。</p>
31、<p> Lucene作為一個(gè)全文檢索引擎,其具有如下突出的優(yōu)點(diǎn):</p><p> 索引文件格式獨(dú)立于應(yīng)用平臺(tái)。Lucene定義了一套以8位字節(jié)為基礎(chǔ)的索引文件格式,使得兼容系統(tǒng)或者不同平臺(tái)的應(yīng)用能夠共享建立的索引文件。</p><p> 在傳統(tǒng)全文檢索引擎的倒排索引的基礎(chǔ)上,實(shí)現(xiàn)了分塊索引,能夠針對(duì)新的文件建立小文件索引,提升索引速度。然后通過(guò)與原有索引的合并,達(dá)到
32、優(yōu)化的目的。</p><p> 優(yōu)秀的面向?qū)ο蟮南到y(tǒng)架構(gòu),使得對(duì)于Lucene擴(kuò)展的學(xué)習(xí)難度降低,方便擴(kuò)充新功能。</p><p> 設(shè)計(jì)了獨(dú)立于語(yǔ)言和文件格式的文本分析接口,索引器通過(guò)接受Token流完成索引文件的創(chuàng)立,用戶(hù)擴(kuò)展新的語(yǔ)言和文件格式,只需要實(shí)現(xiàn)文本分析的接口。</p><p> 已經(jīng)默認(rèn)實(shí)現(xiàn)了一套強(qiáng)大的查詢(xún)引擎,用戶(hù)無(wú)需自己編寫(xiě)代碼即使系統(tǒng)可獲
33、得強(qiáng)大的查詢(xún)能力,Lucene的查詢(xún)實(shí)現(xiàn)中默認(rèn)實(shí)現(xiàn)了布爾操作、模糊查詢(xún)、分組查詢(xún)等等[9]。</p><p> 2.3 開(kāi)發(fā)環(huán)境及工具</p><p> 開(kāi)發(fā)環(huán)境:Windows XP SP2</p><p> Java環(huán)境:JDK 6.0</p><p> 開(kāi)發(fā)工具:MyEclipse 6.0</p><p&g
34、t; 部署環(huán)境:Sun Java System Application Server 9.1</p><p> 第3章 系統(tǒng)總體設(shè)計(jì)</p><p> 3.1 總體設(shè)計(jì)框架</p><p> 支持全文檢索的郵件代理服務(wù)平臺(tái)主要是利用J2EE和Lucene來(lái)架構(gòu),涉及到J2EE中的JSP、Servlet、JavaMail、JMS、EJB3中的消息驅(qū)動(dòng)Bea
35、n,以及Lucene中的索引、搜索和高亮等。該系統(tǒng)的整體框架如圖3-1所示。</p><p> 圖3-1 支持全文檢索的郵件代理服務(wù)平臺(tái)整體框架</p><p> 3.2 系統(tǒng)基本功能</p><p> 支持全文檢索的郵件代理服務(wù)平臺(tái)主要是為滿(mǎn)足用戶(hù)有多個(gè)郵箱,并且需要對(duì)多個(gè)郵箱進(jìn)行統(tǒng)一管理,包括接收各個(gè)郵箱中的郵件,通過(guò)各個(gè)不同的郵箱來(lái)發(fā)送郵件等,因此在該
36、系統(tǒng)中需要提供的功能有:</p><p> 接收多個(gè)郵箱中的郵件;</p><p> 通過(guò)不同的郵箱發(fā)送不同的郵件;</p><p><b> 添加不同的郵箱;</b></p><p> 可以對(duì)收件箱中的郵件進(jìn)行全文檢索;</p><p> 對(duì)用戶(hù)密碼進(jìn)行修改;</p>&
37、lt;p> 對(duì)已添加的郵箱進(jìn)行修改。</p><p> 3.2.1 系統(tǒng)模塊結(jié)構(gòu)圖</p><p> 根據(jù)系統(tǒng)所具有的基本功能得到該系統(tǒng)的功能模塊結(jié)構(gòu)示意圖,如圖3-2所示。</p><p> 圖3-2 系統(tǒng)功能模塊結(jié)構(gòu)示意圖</p><p> 3.2.2 各個(gè)模塊功能概述</p><p> 該系
38、統(tǒng)中包含的功能有:注冊(cè)、登錄、接收郵件、寫(xiě)郵件、郵件管理(查看/刪除/回復(fù))、已發(fā)郵件管理(查看/刪除/轉(zhuǎn)發(fā))、郵箱管理(添加/刪除/修改)、郵件的索引和郵件的搜索。各個(gè)功能模塊分別介紹如下:</p><p><b> 1.注冊(cè)</b></p><p> 注冊(cè)部分主要是為了使剛開(kāi)始使用該系統(tǒng)的用戶(hù)能有自己唯一的一個(gè)賬戶(hù),并能在注冊(cè)之后使用該系統(tǒng)。用戶(hù)所提供的密碼是
39、經(jīng)過(guò)DES加密后才存儲(chǔ)的。</p><p><b> 2.登錄</b></p><p> 登錄部分主要是為了驗(yàn)證用戶(hù)所提供的用戶(hù)名和密碼的合法性,若合法的話(huà),則提供給該用戶(hù)相應(yīng)的可靠服務(wù),否則做非法用戶(hù)處理,并且要求該用戶(hù)注冊(cè)或者是提示該用戶(hù)他所提供的用戶(hù)名和密碼是非法的,要求其重新登錄。</p><p><b> 3.接收郵件
40、</b></p><p> 接收郵件部分主要是為了幫用戶(hù)接收用戶(hù)所提供的郵箱中的郵件,這是一個(gè)后臺(tái)的服務(wù)程序,用戶(hù)自己是感覺(jué)不到什么時(shí)候接收到郵件的,但后臺(tái)程序會(huì)定時(shí)地為每一個(gè)用戶(hù)提供郵件接收的服務(wù)。并且每個(gè)郵箱中的郵件是不會(huì)被重復(fù)接收的。</p><p><b> 4.發(fā)送郵件</b></p><p> 發(fā)送郵件部分是給用戶(hù)
41、提供發(fā)送新郵件之用,這里可以支持不同的郵箱發(fā)送郵件,就是說(shuō)雖然用戶(hù)是在同一個(gè)地方寫(xiě)新郵件、發(fā)送郵件,但是該系統(tǒng)可以根據(jù)用戶(hù)所提供的不同的發(fā)件人,讓用戶(hù)用他自己的不同郵箱來(lái)發(fā)送信件,而接收信件的人則看到的也是不同的發(fā)件人。</p><p> 5.郵件管理(查看/刪除/回復(fù))</p><p> 郵件管理部分主要是提供用戶(hù)查看郵件、刪除郵件和回復(fù)郵件的功能。當(dāng)用戶(hù)接收到新郵件時(shí),收到的新郵件
42、都會(huì)重點(diǎn)提示用戶(hù)這是一封新郵件,讓用戶(hù)很快就能看到是否有新的郵件。當(dāng)有郵件時(shí),用戶(hù)可以查看郵件。查看的時(shí)候,如果用戶(hù)想回復(fù)該郵件,則點(diǎn)擊“回復(fù)”,系統(tǒng)就自動(dòng)產(chǎn)生一封新的郵件,用戶(hù)只需寫(xiě)好信的內(nèi)容即可發(fā)送。當(dāng)然,如果用戶(hù)認(rèn)為收件箱中的郵件已經(jīng)沒(méi)有利用價(jià)值,就可以刪除郵件。</p><p> 6.已發(fā)郵件管理(查看/刪除/轉(zhuǎn)發(fā))</p><p> 已發(fā)郵件管理部分主要是為了用戶(hù)方便管理已經(jīng)
43、發(fā)送的郵件和未發(fā)送成功的郵件。凡是用戶(hù)發(fā)送過(guò)的郵件,不管是否發(fā)送成功,用戶(hù)都可以在已發(fā)郵件中找到該郵件,并且可以刪除和轉(zhuǎn)發(fā)。</p><p> 7.郵箱管理(添加/刪除/修改)</p><p> 郵箱管理部分主要是讓用戶(hù)可以添加自己已有的所有郵箱,之后該系統(tǒng)可以幫用戶(hù)在后臺(tái)接收這些郵箱中的所有郵件,這是為了方便用戶(hù)統(tǒng)一管理自己的所有郵箱。在這里,用戶(hù)可以隨意添加、刪除和修改自己的郵箱。
44、</p><p><b> 8.郵件的索引</b></p><p> 郵件的索引主要是為郵件的搜索做準(zhǔn)備,只要系統(tǒng)在后臺(tái)接收到新郵件,系統(tǒng)就會(huì)自動(dòng)的為該郵件建立索引,方便用戶(hù)以后對(duì)該郵件的搜索。這是由Lucene來(lái)實(shí)現(xiàn)的,這與直接對(duì)數(shù)據(jù)庫(kù)進(jìn)行搜索相比較,效率比較高,而且功能也比較強(qiáng),易于在以后擴(kuò)展。</p><p><b> 9
45、.郵件的搜索</b></p><p> 郵件的搜索主要是提供給用戶(hù)查找自己的相關(guān)郵件之用,這是通過(guò)之前建立的郵件全文索引來(lái)實(shí)現(xiàn)的,應(yīng)用Lucene中提供的搜索功能構(gòu)建自己的搜索器,將搜索的結(jié)果返回給用戶(hù),并高亮顯示一些關(guān)鍵字,能使用戶(hù)很準(zhǔn)確的找到自己想要的郵件。</p><p> 3.3 數(shù)據(jù)庫(kù)設(shè)計(jì)</p><p> 支持全文檢索的郵件代理服務(wù)平
46、臺(tái)中存在有四種不同用處的表,包括用戶(hù)表,已收郵件表,已發(fā)郵件表,郵箱表。</p><p> 3.3.1 用戶(hù)表</p><p> 用戶(hù)表是用來(lái)存放已注冊(cè)的用戶(hù)名和密碼,因此該表只有2個(gè)字段,包括用戶(hù)名和密碼。用戶(hù)實(shí)體E-R圖如圖3-3所示,用戶(hù)表的具體各字段設(shè)計(jì)如表3-1所示。</p><p> 圖3-3 用戶(hù)實(shí)體E-R圖</p><p&
47、gt;<b> 表3-1 用戶(hù)表</b></p><p> 3.3.2 已收郵件表</p><p> 已收郵件表是用來(lái)存放該用戶(hù)所有郵箱中的郵件,該表中有8個(gè)字段,包括序列sid、郵件的ID、發(fā)件人mailfrom、收件人mailto、郵件主題subject、郵件內(nèi)容content、時(shí)間time和狀態(tài)state。已收郵件實(shí)體E-R圖如圖3-4所示,已收郵件表的
48、具體各字段設(shè)計(jì)如表3-2所示。</p><p> 圖3-4 已收郵件實(shí)體E-R圖</p><p> 表3-2 已收郵件表</p><p> 3.3.3 已發(fā)郵件表</p><p> 已發(fā)郵件表是用來(lái)存放該用戶(hù)已經(jīng)發(fā)送過(guò)的郵件,該表中有8個(gè)字段,包括序列sid、郵件的ID、發(fā)件人mailfrom、收件人mailto、郵件主題subje
49、ct、郵件內(nèi)容content、時(shí)間time和狀態(tài)state。該表與收件箱表的設(shè)計(jì)相同,已發(fā)郵件實(shí)體E-R圖如圖3-5所示,已發(fā)郵件表的具體各字段設(shè)計(jì)如表3-3所示。</p><p> 圖3-5 已發(fā)郵件實(shí)體E-R圖</p><p> 表3-3 已發(fā)郵件表</p><p> 3.3.4 郵箱表</p><p> 郵箱表是用來(lái)存放該用戶(hù)
50、所添加的所有郵箱,該表中有3個(gè)字段,包括序列id、郵箱名email和密碼password。郵箱實(shí)體E-R圖如圖3-6所示,郵箱表的具體各字段設(shè)計(jì)如表3-4所示。</p><p> 圖3-6 郵箱實(shí)體E-R圖</p><p><b> 表3-4 郵箱表</b></p><p><b> 3.4 本章小結(jié)</b><
51、;/p><p> 本章主要介紹了支持全文檢索的郵件代理服務(wù)平臺(tái)的總體設(shè)計(jì)框架、系統(tǒng)基本功能模塊、數(shù)據(jù)庫(kù)的設(shè)計(jì),讓讀者對(duì)該系統(tǒng)有一個(gè)總體的認(rèn)識(shí)。下一章將具體闡述郵箱管理、用戶(hù)管理及JMS應(yīng)用的詳細(xì)設(shè)計(jì)和實(shí)現(xiàn)。</p><p> 第4章 部分系統(tǒng)模塊詳細(xì)設(shè)計(jì)與實(shí)現(xiàn)</p><p> 在支持全文檢索的郵件代理服務(wù)平臺(tái)中一共有六個(gè)模塊,如圖3-2所示,分別為注冊(cè)登錄、郵
52、件管理、寫(xiě)郵件、郵箱管理、用戶(hù)管理和郵件檢索。由于該系統(tǒng)是由兩人合作完成,因此在本章將詳細(xì)介紹該系統(tǒng)的郵箱管理和用戶(hù)管理模塊。</p><p> 4.1 郵箱管理模塊</p><p> 在郵箱管理模塊中,包括添加郵箱、修改郵箱和刪除郵箱,其給用戶(hù)所提供的功能為:用戶(hù)可以添加其所有郵箱到該系統(tǒng)中,系統(tǒng)在后臺(tái)負(fù)責(zé)管理其已添加的所有郵箱。但有一點(diǎn)用戶(hù)應(yīng)該注意的:在添加郵箱的時(shí)候,用戶(hù)應(yīng)該提
53、供其正確的郵箱用戶(hù)名和密碼,確保系統(tǒng)能真正管理該郵箱。因?yàn)橄到y(tǒng)不會(huì)去檢查該郵箱的合法性。當(dāng)然用戶(hù)還可以修改其之前所添加的郵箱,以防用戶(hù)輸入錯(cuò)誤。如該郵箱對(duì)用戶(hù)來(lái)說(shuō)已經(jīng)沒(méi)有使用價(jià)值的話(huà),該郵箱可以被刪除。</p><p> 4.1.1 添加郵箱</p><p> 在該模塊中的添加郵箱部分,系統(tǒng)只是比較簡(jiǎn)單的將用戶(hù)所提供的用戶(hù)名和密碼存入了系統(tǒng)的數(shù)據(jù)庫(kù)中。若用戶(hù)提供的郵箱用戶(hù)名和密碼有誤
54、的話(huà),系統(tǒng)將接收不到該郵箱中的郵件,自然不能為用戶(hù)起到管理郵箱的作用。</p><p> 在用戶(hù)添加郵箱的時(shí)候,為了能讓用戶(hù)能及時(shí)的看到他那個(gè)郵箱中的郵件,在添加郵箱成功的時(shí)候,程序會(huì)開(kāi)一個(gè)接收郵件的線(xiàn)程,讓這個(gè)線(xiàn)程去接收這個(gè)郵箱中的郵件。這樣在后臺(tái)開(kāi)啟一個(gè)線(xiàn)程,畢業(yè)設(shè)計(jì)論文代做平臺(tái) 《580畢業(yè)設(shè)計(jì)網(wǎng)》 是專(zhuān)業(yè)代做團(tuán)隊(duì) 也有大量畢業(yè)設(shè)計(jì)成品提供參考 www.bysj580.com QQ34496499
55、74</p><p> 用戶(hù)也不能覺(jué)察到接收郵件的過(guò)程,但后臺(tái)程序確實(shí)已經(jīng)開(kāi)始接收郵件的工作了。只要過(guò)一定時(shí)間,用戶(hù)就可以在他的收件箱中看到已經(jīng)收到的郵件。</p><p> 該模塊中添加郵箱部分的具體實(shí)現(xiàn):</p><p> 用request類(lèi)中的getParameter()方法得到用戶(hù)在setupMailBox.jsp頁(yè)面中所提交的郵箱名和密碼;</
56、p><p> 用DES加密算法對(duì)用戶(hù)提交的密碼進(jìn)行加密處理;</p><p> 根據(jù)以上得到的郵箱名和密碼,實(shí)例化一個(gè)郵箱類(lèi);</p><p> 通過(guò)JNDI查找數(shù)據(jù)源jdbc/oracleds,得到一個(gè)數(shù)據(jù)庫(kù)的連接;</p><p> 將實(shí)例化的一個(gè)郵箱類(lèi),通過(guò)MailBoxDAOJdbc類(lèi)來(lái)存入數(shù)據(jù)庫(kù);</p><
57、p> 存入數(shù)據(jù)庫(kù)成功的話(huà)就開(kāi)啟一個(gè)接收郵件的一個(gè)線(xiàn)程,來(lái)接收剛添加的郵箱中的郵件。否則,頁(yè)面跳轉(zhuǎn)回添加郵箱的頁(yè)面setupMailBox.jsp。</p><p> 在該模塊的實(shí)現(xiàn)中,添加郵箱部分用到了JDBC、Servlet和JSP技術(shù)。實(shí)現(xiàn)的流程圖如圖4-1所示。</p><p> 圖4-1 添加郵箱部分流程圖</p><p><b>
58、部分代碼簡(jiǎn)析:</b></p><p> //通過(guò)request類(lèi)的getParameter()方法得到郵箱名和密碼</p><p> String email=request.getParameter("email").toString();</p><p> String mailServerName=request.get
59、Parameter("mailServerName").toString();</p><p> String emailpwd= request.getParameter("emailpwd").toString();</p><p><b> //DES加密</b></p><p> Strin
60、g emailpwd=DES.encrypt(request.getParameter("emailpwd").toString());</p><p> //實(shí)例化一個(gè)郵箱類(lèi)</p><p> MailBox mb=new MailBox();</p><p> mb.setEmail(email+mailServerName);//設(shè)置
61、郵箱名</p><p> mb.setPassword(emailpwd);//設(shè)置密碼</p><p> //通過(guò)JNDI查找數(shù)據(jù)源</p><p> Context initContext;</p><p> initContext = new InitialContext();</p><p> Dat
62、aSource ds = (DataSource) initContext.lookup("jdbc/oracleds");</p><p> //將郵箱類(lèi)存入數(shù)據(jù)庫(kù)</p><p> String insertSql = "insert into " + currentUser</p><p> + "mai
63、lbox(id,email,password) values(" + currentUser+ "_seq.nextval,?,?)";</p><p> PreparedStatement pstmt;</p><p> pstmt = conn.prepareStatement(insertSql);</p><p> pst
64、mt.setString(1, mb.getEmail());</p><p> pstmt.setString(2, mb.getPassword());</p><p> pstmt.execute();</p><p> pstmt.close();</p><p> 4.1.2 修改郵箱</p><p&g
65、t; 在該模塊的修改郵箱部分,系統(tǒng)也只是簡(jiǎn)單的將數(shù)據(jù)庫(kù)中原有的密碼更新為用戶(hù)新提交的密碼,并不會(huì)去檢查別的,因此該功能的實(shí)現(xiàn)比較簡(jiǎn)單。</p><p> 該模塊中修改郵箱部分的具體實(shí)現(xiàn):</p><p> 用request類(lèi)中的getParameter()方法得到用戶(hù)在modifyMailBox.jsp頁(yè)面中所提交的郵箱名和密碼;</p><p> 用DES
66、加密算法對(duì)用戶(hù)提交的密碼進(jìn)行加密處理;</p><p> 根據(jù)以上得到的郵箱名和密碼,實(shí)例化一個(gè)郵箱類(lèi);</p><p> 通過(guò)JNDI查找數(shù)據(jù)源jdbc/oracleds,得到一個(gè)數(shù)據(jù)庫(kù)的連接;</p><p> 將實(shí)例化的一個(gè)郵箱類(lèi),通過(guò)MailBoxDAOJdbc類(lèi)中的updateMailBox方法來(lái)更新數(shù)據(jù)庫(kù)中的密碼。</p><p
67、> 修改郵箱部分的流程圖如圖4-2所示。</p><p> 圖4-2 修改郵箱部分流程圖</p><p><b> 部分代碼簡(jiǎn)析:</b></p><p> 由于在添加郵箱部分已經(jīng)分析過(guò)部分相同的代碼,在這里只簡(jiǎn)析不同的代碼片段。</p><p> //根據(jù)郵箱名來(lái)更新郵箱密碼</p>&l
68、t;p> String updateSql = "update " + currentUser + "mailbox set password='"+ password + "' where id=" + id;</p><p> PreparedStatement pstmt;</p><p> ps
69、tmt = conn.prepareStatement(updateSql);</p><p> pstmt.execute();</p><p> pstmt.close();</p><p> 4.1.3 刪除郵箱</p><p> 在該模塊的刪除郵箱部分,系統(tǒng)根據(jù)郵箱在數(shù)據(jù)庫(kù)中存儲(chǔ)的id來(lái)刪除郵箱在數(shù)據(jù)庫(kù)中的記錄,因此該功能的
70、實(shí)現(xiàn)也比較簡(jiǎn)單。</p><p> 該模塊中修改郵箱部分的具體實(shí)現(xiàn):</p><p> 用request類(lèi)中的getParameter()方法得到用戶(hù)在modifyMailBox.jsp頁(yè)面中得到郵箱在數(shù)據(jù)庫(kù)中的id;</p><p> 通過(guò)JNDI查找數(shù)據(jù)源jdbc/oracleds,得到一個(gè)數(shù)據(jù)庫(kù)的連接;</p><p> 將實(shí)例
71、化的一個(gè)郵箱類(lèi),通過(guò)MailBoxDAOJdbc類(lèi)中的deleteMailBox方法來(lái)刪除數(shù)據(jù)庫(kù)中的郵箱。</p><p> 修改郵箱部分的流程圖如圖4-3所示。</p><p> 圖4-3 刪除郵箱部分流程圖</p><p><b> 部分代碼簡(jiǎn)析:</b></p><p> 由于在添加郵箱部分已經(jīng)分析過(guò)部分相
72、同的代碼,在這里只簡(jiǎn)析不同的代碼片段。</p><p> //根據(jù)郵箱ID來(lái)刪除郵箱</p><p> String deleteSql = "delete from " + currentUser + "mailbox where id="+ id;</p><p> PreparedStatement pstmt;&
73、lt;/p><p> pstmt = conn.prepareStatement(deleteSql);</p><p> pstmt.execute();</p><p> pstmt.close();</p><p> 4.2 用戶(hù)管理模塊</p><p> 在用戶(hù)管理模塊中,只包括用戶(hù)密碼的修改部分,其給
74、用戶(hù)所提供的功能為:用戶(hù)可以為自己在該系統(tǒng)中的當(dāng)前用戶(hù)修改密碼,這只是為了某些用戶(hù)要修改密碼的需要。</p><p> 該模塊中用戶(hù)密碼修改部分的具體實(shí)現(xiàn):</p><p> 用request類(lèi)中的getParameter()方法得到用戶(hù)在modifyUserpwd.jsp頁(yè)面中得到用戶(hù)輸入的先前密碼和新的密碼;</p><p> 根據(jù)當(dāng)前用戶(hù),從數(shù)據(jù)庫(kù)中讀取
75、先前的密碼,與用戶(hù)輸入的當(dāng)前密碼比對(duì),看是否相同;</p><p> 如果相同的話(huà),則實(shí)例化一個(gè)用戶(hù)類(lèi),將數(shù)據(jù)庫(kù)中的密碼更新為用戶(hù)輸入的新密碼,若不相同的話(huà),修改密碼失敗。</p><p> 用戶(hù)密碼修改部分的流程圖如圖4-4所示。</p><p> 圖4-4 用戶(hù)密碼修改部分流程圖</p><p><b> 部分代碼簡(jiǎn)析:
76、</b></p><p> //更新數(shù)據(jù)庫(kù)中的用戶(hù)密碼</p><p> public static final String UPDATE_USER_SQL = "update users set password=? where username=?";</p><p> PreparedStatement pstmt =
77、conn.prepareStatement(UPDATE_USER_SQL);</p><p> pstmt.setString(1, u.getPassword());</p><p> pstmt.settring(2, u.getUsername());</p><p> pstmt.executeUpdate();</p><p&g
78、t; pstmt.close();</p><p> 4.3 JMS應(yīng)用</p><p> 在本系統(tǒng)中,為了提高系統(tǒng)后臺(tái)的工作效率,采用了消息中間件,實(shí)現(xiàn)異步的消息傳遞。</p><p> 這對(duì)于本系統(tǒng)的穩(wěn)定性是很關(guān)鍵的。由于本系統(tǒng)在后臺(tái)要不斷地幫用戶(hù)處理業(yè)務(wù),包括郵件的接受和郵件的索引,而就這兩部分,在系統(tǒng)中就有可能隨著時(shí)間的推移而業(yè)務(wù)不斷地加重。因?yàn)橛?/p>
79、可能使用該系統(tǒng)的用戶(hù)會(huì)越來(lái)越多,這樣的話(huà)接收郵件和索引郵件的工作量就會(huì)越來(lái)越重。如果采用同步機(jī)制,則嚴(yán)重影響系統(tǒng)的運(yùn)行效率,用戶(hù)體驗(yàn)也會(huì)越來(lái)越差,最終本系統(tǒng)就選擇使用JMS的異步消息處理來(lái)解決此問(wèn)題。</p><p> 4.3.1 JMS消息模型</p><p> 在JMS中,提供了兩種模型:一種是點(diǎn)對(duì)點(diǎn)模型,另一種是發(fā)布/訂閱模型。</p><p> 點(diǎn)對(duì)
80、點(diǎn)模型是與消息隊(duì)列一起工作的。它們是點(diǎn)對(duì)點(diǎn)的,是因?yàn)榭蛻?hù)端將消息發(fā)送到一個(gè)隊(duì)列,而另一個(gè)客戶(hù)端將從這個(gè)隊(duì)列中接收消息。點(diǎn)對(duì)點(diǎn)模型示意圖如圖4-5所示。</p><p> 圖4-5 點(diǎn)對(duì)點(diǎn)模型示意圖</p><p> 發(fā)布/訂閱模型是發(fā)送方針對(duì)一個(gè)主題發(fā)送消息,多個(gè)接收方可以訂閱他們的主題。一個(gè)主題消息只能被傳遞給訂閱該主題的接收方,同時(shí)一個(gè)接收方只能接收他所訂閱的主題中的消息。發(fā)布/訂
81、閱模型示意圖如圖4-6所示。</p><p> 圖4-6 發(fā)布/訂閱模型示意圖</p><p> 4.3.2 消息模型的選擇</p><p> 根據(jù)本系統(tǒng)的特點(diǎn),我們選擇了點(diǎn)對(duì)點(diǎn)的消息模型,這是出于容易構(gòu)建本系統(tǒng)的基礎(chǔ)上的。</p><p> 4.3.3 點(diǎn)對(duì)點(diǎn)模型在系統(tǒng)中的應(yīng)用</p><p> 確定選
82、擇點(diǎn)對(duì)點(diǎn)模型之后,開(kāi)始構(gòu)建本系統(tǒng)中特有的點(diǎn)對(duì)點(diǎn)模型。在本系統(tǒng)中,消息的生產(chǎn)者是接收郵件的線(xiàn)程,接收郵件的線(xiàn)程一接收完一封郵件就馬上向消息隊(duì)列中發(fā)送一條消息。而本系統(tǒng)中的消息隊(duì)列是通過(guò)Sun Java System Application Server這個(gè)應(yīng)用服務(wù)器提供的,只要對(duì)服務(wù)器中的某些設(shè)置項(xiàng)進(jìn)行適當(dāng)?shù)呐渲眉纯僧a(chǎn)生一個(gè)消息隊(duì)列。消息的消費(fèi)者是消息驅(qū)動(dòng)Bean,這是EJB3里提供的。只要消息隊(duì)列中一有消息,EJB容器就會(huì)自動(dòng)讓消息驅(qū)動(dòng)
83、Bean去處理消息。在本系統(tǒng)中實(shí)現(xiàn)的點(diǎn)對(duì)點(diǎn)消息模型示意圖如圖4-7所示。</p><p> 圖4-7 系統(tǒng)實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)模型示意圖</p><p> 由于接收郵件是多線(xiàn)程的,因此消息驅(qū)動(dòng)Bean的處理也是多線(xiàn)程的,這樣大大地提高了本系統(tǒng)的性能。但這樣也給系統(tǒng)帶來(lái)了其他問(wèn)題,如線(xiàn)程之間的同步問(wèn)題,這下一章講到郵件索引的時(shí)候會(huì)給出解決方案。</p><p> 4.3.
84、4 消息驅(qū)動(dòng)Bean的實(shí)現(xiàn)</p><p> 本系統(tǒng)中,消息驅(qū)動(dòng)Bean(MDB)是一個(gè)很重的部分。MDB負(fù)責(zé)將郵件存入數(shù)據(jù)庫(kù)并索引郵件。</p><p><b> 1.具體實(shí)現(xiàn)</b></p><p> 當(dāng)消息到達(dá)時(shí),判斷是不是欲接收的消息,若是的話(huà),就下一步,否則就不接收;</p><p> 將消息轉(zhuǎn)換為本
85、地的一般郵件對(duì)象,將郵件對(duì)象存入數(shù)據(jù)庫(kù);</p><p> 若成功存入數(shù)據(jù)庫(kù),則索引這郵件對(duì)象,否則就不索引。</p><p><b> 2.核心代碼:</b></p><p> public void onMessage(Message message) {</p><p> ObjectMessage oms
86、g = null;</p><p> JMSMessage jmsg = null;</p><p><b> try {</b></p><p> if (message instanceof ObjectMessage) {</p><p> omsg = (ObjectMessage) message;&l
87、t;/p><p> jmsg = (JMSMessage)omsg.getObject();//轉(zhuǎn)化為本地對(duì)象</p><p> String username=jmsg.getUsername();</p><p> String currentUser = username.substring(username.lastIndexOf("/"
88、;)+1, </p><p> username.length());</p><p> MailMessage msg=jmsg.getMsg();//獲取郵件對(duì)象</p><p> MsgSaveToDB mstdb=new MsgSaveToDB();</p><p> boolean falg=false;</p>
89、<p> falg=mstdb.saveMessage(currentUser, msg);//保存郵件</p><p><b> if(falg){</b></p><p> IndexUtil.addIndex(jmsg);//索引郵件</p><p><b> }</b></p>
90、<p><b> }</b></p><p> } catch (Exception e) {</p><p> e.printStackTrace();</p><p><b> }</b></p><p><b> }</b></p>&l
91、t;p><b> 4.4 本章小結(jié)</b></p><p> 本章詳細(xì)地介紹了支持全文檢索的郵件代理服務(wù)平臺(tái)中的兩個(gè)模塊:郵箱管理和用戶(hù)管理。這兩個(gè)模塊主要是側(cè)重?cái)?shù)據(jù)庫(kù)的插入、刪除和更新,使用戶(hù)比較方便的管理其所有郵箱和其賬號(hào)密碼。下一章將重點(diǎn)介紹在該系統(tǒng)中郵件檢索模塊的詳細(xì)設(shè)計(jì)與實(shí)現(xiàn)。</p><p> 第5章 郵件檢索模塊詳細(xì)設(shè)計(jì)與實(shí)現(xiàn)</p
92、><p> 在支持全文檢索的郵件代理服務(wù)平臺(tái)中,郵件檢索模塊主要包括兩部分:1.郵件的索引;2.郵件的搜索。本章將具體介紹Lucene各方面的原理及在該系統(tǒng)中的應(yīng)用,包括對(duì)每一封郵件建立索引的過(guò)程、對(duì)郵件的搜索過(guò)程和對(duì)搜索結(jié)果的高亮顯示。</p><p> 5.1 郵件的索引</p><p> 在該系統(tǒng)中的郵件索引是應(yīng)用Lucene來(lái)實(shí)現(xiàn)的。</p>
93、<p> 5.1.1 Lucene索引介紹</p><p> Lucene是一個(gè)高性能的java全文檢索工具包,它使用的是倒排文件索引結(jié)構(gòu)。從實(shí)現(xiàn)方式上來(lái)看,倒排索引是典型的為滿(mǎn)足實(shí)際應(yīng)用需要而設(shè)計(jì)的一種數(shù)據(jù)結(jié)構(gòu)。這種數(shù)據(jù)結(jié)構(gòu)中的每一個(gè)元素是一個(gè)索引項(xiàng),每一個(gè)索引項(xiàng)是由關(guān)鍵字屬性值和關(guān)鍵字關(guān)聯(lián)記錄,或者記錄的存放地址組成。這種結(jié)構(gòu)的最大特點(diǎn)是改變了以往的檢索過(guò)程。通常的查找方法是先確定文檔,然
94、后在文檔中順序查找后續(xù)的文檔。倒排索引則是利用索引關(guān)鍵字直接確定文檔列表,最后才確定希望找到的文檔列表[2]。</p><p> Lucene索引結(jié)構(gòu)圖如圖5-1所示:</p><p> 圖5-1 Lucene索引結(jié)構(gòu)圖</p><p> 在Lucene中,索引文件的存儲(chǔ)還分兩種結(jié)構(gòu):一種是多文件索引結(jié)構(gòu),另一種是復(fù)合索引結(jié)構(gòu)。</p><
95、p> 多文件索引是使用一系列索引文件分別存儲(chǔ)索引,分散管理數(shù)據(jù)的索引存儲(chǔ)格式。多文件索引在打開(kāi)時(shí)需要讀取大量文件,會(huì)大大占用系統(tǒng)的文件句柄等資源,造成系統(tǒng)響應(yīng)速度慢,甚至系統(tǒng)崩潰[2]。因此,在本系統(tǒng)中,我們采用復(fù)合索引結(jié)構(gòu)。</p><p> 復(fù)合索引是把索引相關(guān)的一系列數(shù)據(jù)結(jié)構(gòu)組織到少數(shù)幾個(gè)文件中進(jìn)行管理的索引存儲(chǔ)模式。復(fù)合索引把所有的索引數(shù)據(jù)被組合成簡(jiǎn)單的3個(gè)文件,大大減少了打開(kāi)大量文件的壓力。但
96、是使用統(tǒng)一文件存儲(chǔ)大量數(shù)據(jù)會(huì)造成數(shù)據(jù)更新的問(wèn)題,每次更改需要操作一個(gè)大的數(shù)據(jù)文件,讀取和存儲(chǔ)都會(huì)比較慢。對(duì)本系統(tǒng)來(lái)說(shuō),因?yàn)閿?shù)據(jù)量不是很大,所以并不會(huì)產(chǎn)生大的數(shù)據(jù)文件。因此,選擇以這種結(jié)構(gòu)來(lái)存儲(chǔ)郵件的索引文件是一種比較好的解決方案。</p><p> 5.1.2 Lucene中的分詞</p><p> 對(duì)于分詞,在Lucene這個(gè)全文檢索工具包中,是一個(gè)非常重要的。因?yàn)槿绻獙?duì)一篇文章
97、建立全文索引,就必須先對(duì)這篇文章進(jìn)行文本分析,對(duì)文章要進(jìn)行有意義的分詞。這就必須要用到分詞器。</p><p> 由于Lucene不是本國(guó)人開(kāi)發(fā)的全文檢索工具包,因此Lucene中自帶的分詞器對(duì)于中文分詞的支持不是很好。Lucene包中有兩個(gè)支持中文的分詞器:一個(gè)是ChineseAnalyzer,另一個(gè)是CJKAnalyzer。但是ChineseAnalyzer這個(gè)分詞器只是單字切分,而CJKAnalyzer分
98、詞器則是一個(gè)二分法的分詞器。因此,總的來(lái)說(shuō),Lucene自帶包中的分詞器對(duì)中文分詞的支持都不是很好。</p><p> 國(guó)內(nèi)有一個(gè)比較出名的中文分詞器,是中科院計(jì)算所開(kāi)發(fā)的ICTCLAS。但由于這個(gè)分詞器是用C++開(kāi)發(fā)的,因此如果在Java應(yīng)用程序中使用的話(huà),容易出現(xiàn)不穩(wěn)定的現(xiàn)象。畢業(yè)設(shè)計(jì)論文代做平臺(tái) 《580畢業(yè)設(shè)計(jì)網(wǎng)》 是專(zhuān)業(yè)代做團(tuán)隊(duì) 也有大量畢業(yè)設(shè)計(jì)成品提供參考 www.bysj580.com Q
99、Q3449649974</p><p> 最后,在我們這個(gè)系統(tǒng)中選擇一個(gè)第三方提供的分詞器——JE分詞器。這個(gè)分詞器是基于詞庫(kù)的,所以分詞的效果相對(duì)其余分詞器的分詞效果要好。</p><p> 各種分詞器分詞效果比較:</p><p> 對(duì)“我愛(ài)我偉大的老爸老媽?zhuān)覑?ài)我壯麗的中華!”這句話(huà)進(jìn)行分詞。</p><p> ChineseA
100、nalyzer分詞結(jié)果:</p><p> 我 | 愛(ài) | 我 | 偉 | 大 | 的 | 老 | 爸 | 老 | 媽 | 我 | 愛(ài) | 我 | 壯 | 麗 | 的 | 中 | 華</p><p> CJKAnalyzer分詞結(jié)果:</p><p> 我愛(ài) | 愛(ài)我 | 我偉 | 偉大 | 大的 | 的老 | 老爸 | 爸老 | 老媽 | 我愛(ài) | 愛(ài)我 |
101、 我壯 | 壯麗 | 麗的 | 的中 | 中華</p><p> JE分詞器分詞結(jié)果:</p><p> 我 | 愛(ài)我 | 偉大 | 老爸 | 老媽 | 我 | 愛(ài)我 | 壯麗 | 中華</p><p> 5.1.3 建立郵件索引</p><p> 了解Lucene建立索引過(guò)程的原理之后,我們要對(duì)本系統(tǒng)進(jìn)行定制郵件索引器。</
102、p><p> 在本系統(tǒng)中的一封郵件包括6個(gè)部分,分別是郵件ID、收件人、發(fā)件人、郵件主題、郵件內(nèi)容和發(fā)信時(shí)間。</p><p><b> 郵件索引的需求</b></p><p> 在本系統(tǒng)中,要求建立的郵件索引必須能夠支持用戶(hù)對(duì)郵件的收件人、發(fā)件人、郵件主題、郵件內(nèi)容和發(fā)信時(shí)間進(jìn)行搜索。因此在一封郵件中,除了郵件ID不被搜索到,郵件的其余部分
103、都要能被搜索到。但是郵件ID有其特殊的功能,所以在本系統(tǒng)中,每一封郵件的各個(gè)部分都建立相關(guān)的索引。</p><p><b> 建立索引的具體實(shí)現(xiàn)</b></p><p> 判斷要存放索引的路徑是否被鎖定,若沒(méi)被鎖定,就下一步,否則就等待該鎖定的路徑被解鎖;</p><p> 用路徑名和JE分詞器生成一個(gè)IndexWriter對(duì)象;<
104、/p><p> 生成一個(gè)Document對(duì)象;</p><p> 生成一個(gè)郵件ID的索引域,并加入到Document對(duì)象中;</p><p> 生成一個(gè)收件人的索引域,并加入到Document對(duì)象中;</p><p> 生成一個(gè)發(fā)件人的索引域,并加入到Document對(duì)象中;</p><p> 生成一個(gè)郵件主題的
105、索引域,并加入到Document對(duì)象中;</p><p> 生成一個(gè)郵件內(nèi)容的索引域,并加入到Document對(duì)象中;</p><p> 生成一個(gè)發(fā)信時(shí)間的索引域,并加入到Document對(duì)象中;</p><p> 將Document對(duì)象添加到IndexWriter對(duì)象中;</p><p> IndexWriter對(duì)象進(jìn)行索引優(yōu)化操作
106、;</p><p> 關(guān)閉IndexWriter。</p><p> 建立郵件索引核心代碼:</p><p> public static boolean addIndex(String path,MailMessage msg){</p><p> String indexPath=path;</p><p>
107、;<b> try {</b></p><p> while(IndexReader.isLocked(indexPath)){;}</p><p> IndexWriter writer = new IndexWriter(indexPath,new MMAnalyzer());</p><p> Document doc=new D
108、ocument();</p><p> Field field=new Field("id",msg.getId(),</p><p> Field.Store.YES,Field.Index.UN_TOKENIZED);</p><p> doc.add(field);</p><p> field=new Fi
109、eld("from",msg.getMailfrom(),</p><p> Field.Store.YES,Field.Index.TOKENIZED);</p><p> doc.add(field);</p><p> field=new Field("to",msg.getMailto(),</p>
110、<p> Field.Store.YES,Field.Index.TOKENIZED);</p><p> doc.add(field);</p><p> field=new Field("subject",msg.getSubject(),</p><p> Field.Store.YES,Field.Index.TOKE
111、NIZED);</p><p> doc.add(field);</p><p> field=new Field("content",StringUtil.removeHtml(msg.getContent()),</p><p> Field.Store.YES,Field.Index.TOKENIZED);</p>&l
112、t;p> doc.add(field);</p><p> field=new Field("time",msg.getTime(),</p><p> Field.Store.YES,Field.Index.TOKENIZED);</p><p> doc.add(field);</p><p> wri
113、ter.addDocument(doc);</p><p> writer.optimize();</p><p> writer.close();</p><p> } catch (IOException e) {</p><p> e.printStackTrace();</p><p> return
114、 false;</p><p> } catch (Exception e) {</p><p> e.printStackTrace();</p><p><b> }</b></p><p> return true;</p><p><b> }</b><
115、;/p><p> 郵件建立索引過(guò)程中的三處細(xì)節(jié)</p><p> 由于郵件建立索引是采用多線(xiàn)程實(shí)現(xiàn)的,就是在同一時(shí)刻有可能存在多個(gè)索引程序在運(yùn)行。如果有一個(gè)程序在為郵件建立索引的時(shí)候,則另一個(gè)索引程序要等待其完成才能開(kāi)始為郵件建立索引,否則將產(chǎn)生寫(xiě)沖突。即while(IndexReader.isLocked(indexPath)){;};這行代碼是至關(guān)重要的。</p><
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- Lucene全文檢索技術(shù)在專(zhuān)利服務(wù)平臺(tái)中的研究與應(yīng)用.pdf
- 全文檢索應(yīng)用于郵件的設(shè)計(jì)與實(shí)現(xiàn)
- 全文檢索應(yīng)用于郵件的設(shè)計(jì)與實(shí)現(xiàn).pdf
- qq郵箱如何設(shè)置smtp代理收發(fā)郵件
- 郵件服務(wù)智能代理的研究.pdf
- PKI在安全郵件傳輸上的應(yīng)用.pdf
- 基于lucene全文檢索的搜索引擎的設(shè)計(jì)與實(shí)現(xiàn)
- 代理重加密的研究及在郵件系統(tǒng)中的應(yīng)用.pdf
- Lucene全文檢索在網(wǎng)絡(luò)教學(xué)平臺(tái)中的應(yīng)用研究.pdf
- 搜索引擎開(kāi)發(fā)實(shí)踐全文檢索與lucene簡(jiǎn)介
- 基于Lucene全文檢索的搜索引擎的設(shè)計(jì)與實(shí)現(xiàn).doc
- 可操作郵件及其在郵件社會(huì)網(wǎng)絡(luò)中的應(yīng)用.pdf
- 公司郵箱管理規(guī)定
- plc在郵件分揀中的應(yīng)用
- 基于Lucene搜索引擎的中文全文信息檢索技術(shù)的研究.pdf
- 郵件服務(wù)器上的反垃圾郵件技術(shù)設(shè)計(jì)與實(shí)現(xiàn).pdf
- 電子郵件禮儀及郵件管理-課件
- 基于Lucene的全文檢索技術(shù)研究與應(yīng)用.pdf
- 基于java的郵箱管理服務(wù)器設(shè)計(jì)與實(shí)現(xiàn)
- 企業(yè)郵箱管理規(guī)定
評(píng)論
0/150
提交評(píng)論