支持全文检索的邮件代理服务平台-多邮箱管理及Lucene在邮件搜索上的应用_第1页
支持全文检索的邮件代理服务平台-多邮箱管理及Lucene在邮件搜索上的应用_第2页
支持全文检索的邮件代理服务平台-多邮箱管理及Lucene在邮件搜索上的应用_第3页
支持全文检索的邮件代理服务平台-多邮箱管理及Lucene在邮件搜索上的应用_第4页
支持全文检索的邮件代理服务平台-多邮箱管理及Lucene在邮件搜索上的应用_第5页
已阅读5页,还剩40页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目录摘要1ABSTRACT2第1章引言311课题背景312国内外研究现状313课题的目的和意义414本章小结4第2章相关技术及开发工具介绍521J2EE简介522LUCENE623开发环境及工具7第3章系统总体设计831总体设计框架832系统基本功能833数据库设计1134本章小结13第4章部分系统模块详细设计与实现1441邮箱管理模块1442用户管理模块1843JMS应用1944本章小结22第5章邮件检索模块详细设计与实现2351邮件的索引2352邮件的搜索2753搜索结果的高亮显示3054本章小结31第6章总结与展望3261系统总结3262系统实现部分效果图3263发展前景34I谢辞35参考文献36附录370支持全文检索的邮件代理服务平台多邮箱管理及LUCENE在邮件搜索上的应用摘要本文阐述了设计与实现支持全文检索的邮件代理服务平台的理论基础,设计思想,整体架构等。其中最主要的是应用了J2EE中的JAVAMAIL、JMS、EJB3中的消息驱动BEAN和LUCENE。本文着重阐述了LUCENE全文索引及检索技术在该系统中的应用,包括索引的建立,索引的修改,搜索,对搜索结果的高亮显示等。关键字J2EE;JAVAMAIL;消息驱动BEAN;LUCENE;全文检索1SUPPORTFULLTEXTSEARCHPLATFORMFOREMAILPROXYSERVICEMANAGEMENTOFMULTIPLEMAILBOXESANDAPPLICATIONOFLUCENEINMAILSEARCHABSTRACTTHISPAPERDESCRIBESTHEDESIGNANDIMPLEMENTATIONSUPPORTFORFULLTEXTINDEXINGOFEMAILPROXYSERVICEPLATFORMBASEDONTHETHEORY,DESIGNTHINKING,THEOVERALLSTRUCTUREANDSOONTHEMOSTIMPORTANTISTHEUSEOFJ2EEINTHEJAVAMAIL,JMS,EJB3OFMESSAGEDRIVENBEANANDLUCENETHISARTICLEFOCUSESONTHELUCENEFULLTEXTINDEXINGANDRETRIEVALTECHNOLOGYINTHESYSTEM,INCLUDINGTHEESTABLISHMENTOFTHEINDEX,INDEXCHANGES,ANDSEARCHONTHEHIGHLIGHTEDSEARCHRESULTSDISPLAYKEYWORDSJ2EEJAVAMAILMESSAGEDRIVENBEANLUCENEFULLTEXTSEARCH2第1章引言11课题背景电子邮件是一种用电子手段提供信息交换的通信方式。是INTERNET应用最广的服务通过网络的电子邮件系统,用户可以用非常低廉的价格,以非常快速的方式,与世界上任何一个角落的网络用户联系,这些电子邮件可以是文字、图像、声音等各种方式。同时,用户可以得到大量免费的新闻、专题邮件,并实现轻松的信息搜索。这是任何传统的方式也无法相比的。正是由于电子邮件的使用简易、投递迅速、收费低廉,易于保存、全球畅通无阻,使得电子邮件被广泛地应用,它使人们的交流方式得到了极大的改变。另外,电子邮件还可以进行一对多的邮件传递,同一邮件可以一次发送给许多人。最重要的是,电子邮件是整个网间网以至所有其他网络系统中直接面向人与人之间信息交流的系统,它的数据发送方和接收方都是人,所以极大地满足了大量存在的人与人通信的需求。当今社会是信息化的社会,人们并不仅仅满足于现有的电子邮件服务,由于移动办公的需要,电子邮件服务由单纯的客户端收发邮件发展到了WEB邮件,但电子邮件的发展还未就此停止,现在的人群当中存在一大批人是拥有不止一个电子邮箱的,他们对电子邮件服务又有了新的需求,此时电子邮件服务就必须满足支持多个邮箱管理的功能。12国内外研究现状电子邮件发展到现在,用户使用电子邮件服务的方式有两种一种是用户使用个人计算机上的客户端软件,比如OUTLOOK,FOXMAIL等。OUTLOOK是由美国微软公司MICROSOFT出品的免费软件,与INTERNETEXPLORER浏览器软件捆绑发行;FOXMAIL是由国人张小龙编写的一个功能强大非商业软件,它实现了真正的多用户、多账户、多POP3支持,自动进行拨号,能设置邮件过滤功能,能阅读和收发BIG5码的邮件,可以直接查看HTML格式邮件。这两种客户端软件只要通过适当的配置后,就可以对邮件进行接收和发送,但单纯使用邮件客户端程序进行邮件的收发已经不能满足用户移动办公的需要。另一种就是使用WEBMAIL系统,将EMAIL和WEB结合在一起,即通过WEB编程和适当的系统设置,使用户仅仅以访问WEB的方式就可以得到和使用完整的邮件服务的系统称为WEBMAIL系统。WEBMAIL是目前INTERNET上最受欢迎和使用最多的服务之一,也是很多网站3必备功能之一。像网易、新浪等大型门户网站都提供了免费的WEBMAIL服务,并在其中加入了一些别的实用功能。如GOOGLE的GMAIL提供给邮箱用户网络硬盘,用户可以将一些电子资料存入网络硬盘中,并提供了全文检索的功能。现在许多WEBMAIL系统在这些方面的改进越来越多,并在一定程度上满足了用户的要求,但仅此还是不够的。13课题的目的和意义本课题意在设计并实现一种支持全文检索的邮件代理服务平台,使用户进一步感受到电子邮件服务给他们带来的方便与快捷。虽然现有的邮件服务系统已经比较完善,但对于多个邮箱的支持还是比较少的,而且对多个邮箱中的文件进行统一管理的更少,因此有必要设计并实现一个支持多个邮箱收发邮件的系统。对于这种服务系统,虽然现在在用户中使用地比较少,而且专门提供类似服务的系统也不多。但随着电子邮件的发展,相信在这方面的需求会越来越突出,而这种系统将会越来越得到用户的青睐。14本章小结本章主要介绍了支持全文检索的邮件代理服务平台的研究背景、国内外的研究状况及本课题的目的和意义。4第2章相关技术及开发工具介绍21J2EE简介J2EE是一种利用JAVA2平台来简化企业解决方案的开发、部署和管理相关的复杂问题的体系结构。J2EE技术的基础就是核心JAVA平台或JAVA2平台的标准版,J2EE不仅巩固了标准版中的许多优点,例如“编写一次、随处运行”的特性、方便存取数据库的JDBCAPI、CORBA技术以及能够在INTERNET应用中保护数据的安全模式等等,同时还提供了对EJBENTERPRISEJAVABEANS、JAVASERVLETAPI、JSPJAVASERVERPAGES以及XML技术的全面支持。其最终目的就是成为一个能够使企业开发者大幅缩短投放市场时间的体系结构。J2EE体系结构提供中间层集成框架用来满足无需太多费用而又需要高可用性、高可靠性以及可扩展性的应用的需求。通过提供统一的开发平台,J2EE降低了开发多层应用的费用和复杂性,同时提供对现有应用程序集成强有力支持,完全支持ENTERPRISEJAVABEANS,有良好的向导支持打包和部署应用,添加目录支持,增强了安全机制,提高了性能13。211JAVAMAILJAVAMAIL,顾名思义,提供给开发者处理电子邮件相关的编程接口。它是SUN发布的用来处理EMAIL的API。它可以方便地执行一些常用的邮件传输。我们可以基于JAVAMAIL开发出类似于MICROSOFTOUTLOOK的应用程序。虽然JAVAMAIL是SUN的API之一,但它目前还没有被加在标准的JAVA开发工具包中JAVADEVELOPMENTKIT,这就意味着你在使用前必须另外下载JAVAMAIL文件。除此以外,你还需要有SUN的JAVABEANSACTIVATIONFRAMEWORKJAF。JAVABEANSACTIVATIONFRAMEWORK的运行很复杂,在这里简单的说就是JAVAMAIL的运行必须得依赖于它的支持。在WINDOWS2000下使用需要指定这些文件的路径,在其它的操作系统上也类似。212JMSJMSJAVAMESSAGESERVICE,JAVA消息服务是一组JAVA应用接口,它提供创建、发送、接收、读取消息的服务。JMSAPI定义了一组公共的应用程序接口和相应语法,使得JAVA应用能够和各种消息中间件进行通信,这些消息中间件5包括IBMMQSERIES、MICROSOFTMSMQ及纯JAVA的SONICMQ。通过使用JMSAPI,开发人员无需掌握不同消息产品的使用方法,也可以使用统一的JMSAPI来操纵各种消息中间件。通过使用JMS,能够最大限度地提升消息应用的可移植性。JMS既支持点对点的消息通信,也支持发布/订阅式的消息通信。213EJB3EJB是SUN的服务器端组件模型,最大的用处是部署分布式应用程序,类似微软的COM技术。凭借JAVA跨平台的优势,用EJB技术部署的分布式系统可以不限于特定的平台。EJBENTERPRISEJAVABEAN是J2EE的一部分,定义了一个用于开发基于组件的企业多重应用程序的标准。其特点包括网络服务支持和核心开发工具SDK。在J2EE里,ENTERPRISEJAVABEANSEJB称为JAVA企业BEAN,是JAVA的核心代码,分别是会话BEANSESSIONBEAN,实体BEANENTITYBEAN和消息驱动BEANMESSAGEDRIVENBEAN。SESSIONBEAN用于实现业务逻辑,它可以是有状态的,也可以是无状态的。每当客户端请求时,容器就会选择一个SESSIONBEAN来为客户端服务。SESSIONBEAN可以直接访问数据库,但更多时候,它会通过ENTITYBEAN实现数据访问。ENTITYBEAN是域模型对象,用于实现O/R映射,负责将数据库中的表记录映射为内存中的ENTITY对象,事实上,创建一个ENTITYBEAN对象相当于新建一条记录,删除一个ENTITYBEAN会同时从数据库中删除对应记录,修改一个ENTITYBEAN时,容器会自动将ENTITYBEAN的状态和数据库同步。MESSAGEDRIVENBEAN是EJB20中引入的新的企业BEAN,它基于JMS消息,只能接收客户端发送的JMS消息然后处理。MDB实际上是一个异步的无状态SESSIONBEAN,客户端调用MDB后无需等待,立刻返回,MDB将异步处理客户请求。这适合于需要异步处理请求的场合,比如订单处理,这样就能避免客户端长时间的等待一个方法调用直到返回结果。22LUCENELUCENE是APACHE软件基金会JAKARTA项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。LUCENE的目的是为软件开发人员提供一个简单6易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。LUCENE作为一个全文检索引擎,其具有如下突出的优点索引文件格式独立于应用平台。LUCENE定义了一套以8位字节为基础的索引文件格式,使得兼容系统或者不同平台的应用能够共享建立的索引文件。在传统全文检索引擎的倒排索引的基础上,实现了分块索引,能够针对新的文件建立小文件索引,提升索引速度。然后通过与原有索引的合并,达到优化的目的。优秀的面向对象的系统架构,使得对于LUCENE扩展的学习难度降低,方便扩充新功能。设计了独立于语言和文件格式的文本分析接口,索引器通过接受TOKEN流完成索引文件的创立,用户扩展新的语言和文件格式,只需要实现文本分析的接口。已经默认实现了一套强大的查询引擎,用户无需自己编写代码即使系统可获得强大的查询能力,LUCENE的查询实现中默认实现了布尔操作、模糊查询、分组查询等等9。23开发环境及工具开发环境WINDOWSXPSP2JAVA环境JDK60开发工具MYECLIPSE60部署环境SUNJAVASYSTEMAPPLICATIONSERVER917第3章系统总体设计31总体设计框架支持全文检索的邮件代理服务平台主要是利用J2EE和LUCENE来架构,涉及到J2EE中的JSP、SERVLET、JAVAMAIL、JMS、EJB3中的消息驱动BEAN,以及LUCENE中的索引、搜索和高亮等。该系统的整体框架如图31所示。图31支持全文检索的邮件代理服务平台整体框架32系统基本功能支持全文检索的邮件代理服务平台主要是为满足用户有多个邮箱,并且需要对多个邮箱进行统一管理,包括接收各个邮箱中的邮件,通过各个不同的邮箱来发送邮件等,因此在该系统中需要提供的功能有接收多个邮箱中的邮件;通过不同的邮箱发送不同的邮件;8添加不同的邮箱;可以对收件箱中的邮件进行全文检索;对用户密码进行修改;对已添加的邮箱进行修改。321系统模块结构图根据系统所具有的基本功能得到该系统的功能模块结构示意图,如图32所示。支持全文检索的邮件代理服务平台注册登录邮件管理邮件收发邮件检索邮箱管理用户管理注册登录查看邮件删除邮件发送邮件修改邮箱删除邮箱修改密码索引邮件搜索邮件添加邮箱接收邮件图32系统功能模块结构示意图322各个模块功能概述该系统中包含的功能有注册、登录、接收邮件、写邮件、邮件管理(查看/删除/回复)、已发邮件管理(查看/删除/转发)、邮箱管理(添加/删除/修改)、邮件的索引和邮件的搜索。各个功能模块分别介绍如下1注册注册部分主要是为了使刚开始使用该系统的用户能有自己唯一的一个账户,并能在注册之后使用该系统。用户所提供的密码是经过DES加密后才存储的。2登录登录部分主要是为了验证用户所提供的用户名和密码的合法性,若合法的话,则提供给该用户相应的可靠服务,否则做非法用户处理,并且要求该用户9注册或者是提示该用户他所提供的用户名和密码是非法的,要求其重新登录。3接收邮件接收邮件部分主要是为了帮用户接收用户所提供的邮箱中的邮件,这是一个后台的服务程序,用户自己是感觉不到什么时候接收到邮件的,但后台程序会定时地为每一个用户提供邮件接收的服务。并且每个邮箱中的邮件是不会被重复接收的。4发送邮件发送邮件部分是给用户提供发送新邮件之用,这里可以支持不同的邮箱发送邮件,就是说虽然用户是在同一个地方写新邮件、发送邮件,但是该系统可以根据用户所提供的不同的发件人,让用户用他自己的不同邮箱来发送信件,而接收信件的人则看到的也是不同的发件人。5邮件管理(查看/删除/回复)邮件管理部分主要是提供用户查看邮件、删除邮件和回复邮件的功能。当用户接收到新邮件时,收到的新邮件都会重点提示用户这是一封新邮件,让用户很快就能看到是否有新的邮件。当有邮件时,用户可以查看邮件。查看的时候,如果用户想回复该邮件,则点击“回复”,系统就自动产生一封新的邮件,用户只需写好信的内容即可发送。当然,如果用户认为收件箱中的邮件已经没有利用价值,就可以删除邮件。6已发邮件管理(查看/删除/转发)已发邮件管理部分主要是为了用户方便管理已经发送的邮件和未发送成功的邮件。凡是用户发送过的邮件,不管是否发送成功,用户都可以在已发邮件中找到该邮件,并且可以删除和转发。7邮箱管理(添加/删除/修改)邮箱管理部分主要是让用户可以添加自己已有的所有邮箱,之后该系统可以帮用户在后台接收这些邮箱中的所有邮件,这是为了方便用户统一管理自己的所有邮箱。在这里,用户可以随意添加、删除和修改自己的邮箱。8邮件的索引邮件的索引主要是为邮件的搜索做准备,只要系统在后台接收到新邮件,系统就会自动的为该邮件建立索引,方便用户以后对该邮件的搜索。这是由LUCENE来实现的,这与直接对数据库进行搜索相比较,效率比较高,而且功能也比较强,易于在以后扩展。9邮件的搜索邮件的搜索主要是提供给用户查找自己的相关邮件之用,这是通过之前建立的邮件全文索引来实现的,应用LUCENE中提供的搜索功能构建自己的搜索器,10将搜索的结果返回给用户,并高亮显示一些关键字,能使用户很准确的找到自己想要的邮件。33数据库设计支持全文检索的邮件代理服务平台中存在有四种不同用处的表,包括用户表,已收邮件表,已发邮件表,邮箱表。331用户表用户表是用来存放已注册的用户名和密码,因此该表只有2个字段,包括用户名和密码。用户实体ER图如图33所示,用户表的具体各字段设计如表31所示。用户用户名密码图33用户实体ER图表31用户表NAMETYPENULLABLEKEYUSERNAMEVARCHAR250NOTNULLPASSWORDVARCHAR250NOTNULL332已收邮件表已收邮件表是用来存放该用户所有邮箱中的邮件,该表中有8个字段,包括序列SID、邮件的ID、发件人MAILFROM、收件人MAILTO、邮件主题SUBJECT、邮件内容CONTENT、时间TIME和状态STATE。已收邮件实体ER图如图34所示,已收邮件表的具体各字段设计如表32所示。11已收邮件序列邮件ID收件人发件人主题内容状态时间图34已收邮件实体ER图表32已收邮件表NAMETYPENULLABLEKEYSIDNUMBERNOTNULLIDVARCHAR2100NOTNULLMAILFROMVARCHAR2100NOTNULLMAILTOVARCHAR2100NOTNULLSUBJECTVARCHAR2200NOTNULLCONTENTCLOBTIMEVARCHAR230NOTNULLSTATEVARCHAR22333已发邮件表已发邮件表是用来存放该用户已经发送过的邮件,该表中有8个字段,包括序列SID、邮件的ID、发件人MAILFROM、收件人MAILTO、邮件主题SUBJECT、邮件内容CONTENT、时间TIME和状态STATE。该表与收件箱表的设计相同,已发邮件实体ER图如图35所示,已发邮件表的具体各字段设计如表33所示。已发邮件序列邮件ID收件人发件人主题内容状态时间图35已发邮件实体ER图12表33已发邮件表NAMETYPENULLABLEKEYSIDNUMBERNOTNULLIDVARCHAR2100NOTNULLMAILFROMVARCHAR2100NOTNULLMAILTOVARCHAR2100NOTNULLSUBJECTVARCHAR2200NOTNULLCONTENTCLOBTIMEVARCHAR230NOTNULLSTATEVARCHAR22334邮箱表邮箱表是用来存放该用户所添加的所有邮箱,该表中有3个字段,包括序列ID、邮箱名EMAIL和密码PASSWORD。邮箱实体ER图如图36所示,邮箱表的具体各字段设计如表34所示。邮箱序列邮箱名密码图36邮箱实体ER图表34邮箱表NAMETYPENULLABLEKEYIDNUMBERNOTNULLEMAILVARCHAR250NOTNULLPASSWORDVARCHAR250NOTNULL34本章小结本章主要介绍了支持全文检索的邮件代理服务平台的总体设计框架、系统基本功能模块、数据库的设计,让读者对该系统有一个总体的认识。下一章将具体阐述邮箱管理、用户管理及JMS应用的详细设计和实现。13第4章部分系统模块详细设计与实现在支持全文检索的邮件代理服务平台中一共有六个模块,如图32所示,分别为注册登录、邮件管理、写邮件、邮箱管理、用户管理和邮件检索。由于该系统是由两人合作完成,因此在本章将详细介绍该系统的邮箱管理和用户管理模块。41邮箱管理模块在邮箱管理模块中,包括添加邮箱、修改邮箱和删除邮箱,其给用户所提供的功能为用户可以添加其所有邮箱到该系统中,系统在后台负责管理其已添加的所有邮箱。但有一点用户应该注意的在添加邮箱的时候,用户应该提供其正确的邮箱用户名和密码,确保系统能真正管理该邮箱。因为系统不会去检查该邮箱的合法性。当然用户还可以修改其之前所添加的邮箱,以防用户输入错误。如该邮箱对用户来说已经没有使用价值的话,该邮箱可以被删除。411添加邮箱在该模块中的添加邮箱部分,系统只是比较简单的将用户所提供的用户名和密码存入了系统的数据库中。若用户提供的邮箱用户名和密码有误的话,系统将接收不到该邮箱中的邮件,自然不能为用户起到管理邮箱的作用。在用户添加邮箱的时候,为了能让用户能及时的看到他那个邮箱中的邮件,在添加邮箱成功的时候,程序会开一个接收邮件的线程,让这个线程去接收这个邮箱中的邮件。这样在后台开启一个线程,毕业设计论文代做平台580毕业设计网是专业代做团队也有大量毕业设计成品提供参考WWWBYSJ580COMQQ3449649974用户也不能觉察到接收邮件的过程,但后台程序确实已经开始接收邮件的工作了。只要过一定时间,用户就可以在他的收件箱中看到已经收到的邮件。该模块中添加邮箱部分的具体实现用REQUEST类中的GETPARAMETER方法得到用户在SETUPMAILBOXJSP页面中所提交的邮箱名和密码;用DES加密算法对用户提交的密码进行加密处理;根据以上得到的邮箱名和密码,实例化一个邮箱类;通过JNDI查找数据源JDBC/ORACLEDS,得到一个数据库的连接;14将实例化的一个邮箱类,通过MAILBOXDAOJDBC类来存入数据库;存入数据库成功的话就开启一个接收邮件的一个线程,来接收刚添加的邮箱中的邮件。否则,页面跳转回添加邮箱的页面SETUPMAILBOXJSP。在该模块的实现中,添加邮箱部分用到了JDBC、SERVLET和JSP技术。实现的流程图如图41所示。当前用户的输入的密码与数据库中的是否相同用户输入当前用户的密码和新密码开始通过数据源得到一个数据库的连接结束更新数据库中的当前用户的密码是否图41添加邮箱部分流程图部分代码简析/通过REQUEST类的GETPARAMETER方法得到邮箱名和密码STRINGEMAILREQUESTGETPARAMETER“EMAIL“TOSTRINGSTRINGMAILSERVERNAMEREQUESTGETPARAMETER“MAILSERVERNAME“TOSTRINGSTRINGEMAILPWDREQUESTGETPARAMETER“EMAILPWD“TOSTRING/DES加密STRINGEMAILPWDDESENCRYPTREQUESTGETPARAMETER“EMAILPWD“TOSTRING/实例化一个邮箱类MAILBOXMBNEWMAILBOXMBSETEMAILEMAILMAILSERVERNAME/设置邮箱名MBSETPASSWORDEMAILPWD/设置密码/通过JNDI查找数据源CONTEXTINITCONTEXTINITCONTEXTNEWINITIALCONTEXT15DATASOURCEDSDATASOURCEINITCONTEXTLOOKUP“JDBC/ORACLEDS“/将邮箱类存入数据库STRINGINSERTSQL“INSERTINTO“CURRENTUSER“MAILBOXID,EMAIL,PASSWORDVALUES“CURRENTUSER“_SEQNEXTVAL,“PREPAREDSTATEMENTPSTMTPSTMTCONNPREPARESTATEMENTINSERTSQLPSTMTSETSTRING1,MBGETEMAILPSTMTSETSTRING2,MBGETPASSWORDPSTMTEXECUTEPSTMTCLOSE412修改邮箱在该模块的修改邮箱部分,系统也只是简单的将数据库中原有的密码更新为用户新提交的密码,并不会去检查别的,因此该功能的实现比较简单。该模块中修改邮箱部分的具体实现用REQUEST类中的GETPARAMETER方法得到用户在MODIFYMAILBOXJSP页面中所提交的邮箱名和密码;用DES加密算法对用户提交的密码进行加密处理;根据以上得到的邮箱名和密码,实例化一个邮箱类;通过JNDI查找数据源JDBC/ORACLEDS,得到一个数据库的连接;将实例化的一个邮箱类,通过MAILBOXDAOJDBC类中的UPDATEMAILBOX方法来更新数据库中的密码。修改邮箱部分的流程图如图42所示。图42修改邮箱部分流程图部分代码简析由于在添加邮箱部分已经分析过部分相同的代码,在这里只简析不同的代16码片段。/根据邮箱名来更新邮箱密码STRINGUPDATESQL“UPDATE“CURRENTUSER“MAILBOXSETPASSWORD“PASSWORD“WHEREID“IDPREPAREDSTATEMENTPSTMTPSTMTCONNPREPARESTATEMENTUPDATESQLPSTMTEXECUTEPSTMTCLOSE413删除邮箱在该模块的删除邮箱部分,系统根据邮箱在数据库中存储的ID来删除邮箱在数据库中的记录,因此该功能的实现也比较简单。该模块中修改邮箱部分的具体实现用REQUEST类中的GETPARAMETER方法得到用户在MODIFYMAILBOXJSP页面中得到邮箱在数据库中的ID;通过JNDI查找数据源JDBC/ORACLEDS,得到一个数据库的连接;将实例化的一个邮箱类,通过MAILBOXDAOJDBC类中的DELETEMAILBOX方法来删除数据库中的邮箱。修改邮箱部分的流程图如图43所示。图43删除邮箱部分流程图部分代码简析由于在添加邮箱部分已经分析过部分相同的代码,在这里只简析不同的代得到邮箱在数据库中的ID开始通过数据源得到一个数据库的连接根据邮箱ID删除邮箱结束17码片段。/根据邮箱ID来删除邮箱STRINGDELETESQL“DELETEFROM“CURRENTUSER“MAILBOXWHEREID“IDPREPAREDSTATEMENTPSTMTPSTMTCONNPREPARESTATEMENTDELETESQLPSTMTEXECUTEPSTMTCLOSE42用户管理模块在用户管理模块中,只包括用户密码的修改部分,其给用户所提供的功能为用户可以为自己在该系统中的当前用户修改密码,这只是为了某些用户要修改密码的需要。该模块中用户密码修改部分的具体实现用REQUEST类中的GETPARAMETER方法得到用户在MODIFYUSERPWDJSP页面中得到用户输入的先前密码和新的密码;根据当前用户,从数据库中读取先前的密码,与用户输入的当前密码比对,看是否相同;如果相同的话,则实例化一个用户类,将数据库中的密码更新为用户输入的新密码,若不相同的话,修改密码失败。用户密码修改部分的流程图如图44所示。18当前用户的输入的密码与数据库中的是否相同用户输入当前用户的密码和新密码开始通过数据源得到一个数据库的连接结束更新数据库中的当前用户的密码是否图44用户密码修改部分流程图部分代码简析/更新数据库中的用户密码PUBLICSTATICFINALSTRINGUPDATE_USER_SQL“UPDATEUSERSSETPASSWORDWHEREUSERNAME“PREPAREDSTATEMENTPSTMTCONNPREPARESTATEMENTUPDATE_USER_SQLPSTMTSETSTRING1,UGETPASSWORDPSTMTSETTRING2,UGETUSERNAMEPSTMTEXECUTEUPDATEPSTMTCLOSE43JMS应用在本系统中,为了提高系统后台的工作效率,采用了消息中间件,实现异步的消息传递。这对于本系统的稳定性是很关键的。由于本系统在后台要不断地帮用户处理业务,包括邮件的接受和邮件的索引,而就这两部分,在系统中就有可能随着时间的推移而业务不断地加重。因为有可能使用该系统的用户会越来越多,这样的话接收邮件和索引邮件的工作量就会越来越重。如果采用同步机制,则严重影响系统的运行效率,用户体验也会越来越差,最终本系统就选择使用JMS的异步消息处理来解决此问题。431JMS消息模型在JMS中,提供了两种模型一种是点对点模型,另一种是发布/订阅模型。点对点模型是与消息队列一起工作的。它们是点对点的,是因为客户端将消息发送到一个队列,而另一个客户端将从这个队列中接收消息。点对点模型示意图如图45所示。19客户端1队列客户端2消息消息发送接收确认图45点对点模型示意图发布/订阅模型是发送方针对一个主题发送消息,多个接收方可以订阅他们的主题。一个主题消息只能被传递给订阅该主题的接收方,同时一个接收方只能接收他所订阅的主题中的消息。发布/订阅模型示意图如图46所示。发布者TOPIC发布消息订阅者1订阅者2消息接收订阅消息接收订阅图46发布/订阅模型示意图432消息模型的选择根据本系统的特点,我们选择了点对点的消息模型,这是出于容易构建本系统的基础上的。433点对点模型在系统中的应用确定选择点对点模型之后,开始构建本系统中特有的点对点模型。在本系20统中,消息的生产者是接收邮件的线程,接收邮件的线程一接收完一封邮件就马上向消息队列中发送一条消息。而本系统中的消息队列是通过SUNJAVASYSTEMAPPLICATIONSERVER这个应用服务器提供的,只要对服务器中的某些设置项进行适当的配置即可产生一个消息队列。消息的消费者是消息驱动BEAN,这是EJB3里提供的。只要消息队列中一有消息,EJB容器就会自动让消息驱动BEAN去处理消息。在本系统中实现的点对点消息模型示意图如图47所示。接收邮件线程消息队列消息驱动BEAN图47系统实现点对点模型示意图由于接收邮件是多线程的,因此消息驱动BEAN的处理也是多线程的,这样大大地提高了本系统的性能。但这样也给系统带来了其他问题,如线程之间的同步问题,这下一章讲到邮件索引的时候会给出解决方案。434消息驱动BEAN的实现本系统中,消息驱动BEANMDB是一个很重的部分。MDB负责将邮件存入数据库并索引邮件。1具体实现当消息到达时,判断是不是欲接收的消息,若是的话,就下一步,否则就不接收;将消息转换为本地的一般邮件对象,将邮件对象存入数据库;若成功存入数据库,则索引这邮件对象,否则就不索引。2核心代码PUBLICVOIDONMESSAGEMESSAGEMESSAGEOBJECTMESSAGEOMSGNULLJMSMESSAGEJMSGNULLTRYIFMESSAGEINSTANCEOFOBJECTMESSAGEOMSGOBJECTMESSAGEMESSAGEJMSGJMSMESSAGEOMSGGETOBJECT/转化为本地对象STRINGUSERNAMEJMSGGETUSERNAMESTRINGCURRENTUSERUSERNAMESUBSTRINGUSERNAMELASTINDEXOF“/“1,USERNAMELENGTH21MAILMESSAGEMSGJMSGGETMSG/获取邮件对象MSGSAVETODBMSTDBNEWMSGSAVETODBBOOLEANFALGFALSEFALGMSTDBSAVEMESSAGECURRENTUSER,MSG/保存邮件IFFALGINDEXUTILADDINDEXJMSG/索引邮件CATCHEXCEPTIONEEPRINTSTACKTRACE44本章小结本章详细地介绍了支持全文检索的邮件代理服务平台中的两个模块邮箱管理和用户管理。这两个模块主要是侧重数据库的插入、删除和更新,使用户比较方便的管理其所有邮箱和其账号密码。下一章将重点介绍在该系统中邮件检索模块的详细设计与实现。22第5章邮件检索模块详细设计与实现在支持全文检索的邮件代理服务平台中,邮件检索模块主要包括两部分1邮件的索引;2邮件的搜索。本章将具体介绍LUCENE各方面的原理及在该系统中的应用,包括对每一封邮件建立索引的过程、对邮件的搜索过程和对搜索结果的高亮显示。51邮件的索引在该系统中的邮件索引是应用LUCENE来实现的。511LUCENE索引介绍LUCENE是一个高性能的JAVA全文检索工具包,它使用的是倒排文件索引结构。从实现方式上来看,倒排索引是典型的为满足实际应用需要而设计的一种数据结构。这种数据结构中的每一个元素是一个索引项,每一个索引项是由关键字属性值和关键字关联记录,或者记录的存放地址组成。这种结构的最大特点是改变了以往的检索过程。通常的查找方法是先确定文档,然后在文档中顺序查找后续的文档。倒排索引则是利用索引关键字直接确定文档列表,最后才确定希望找到的文档列表2。LUCENE索引结构图如图51所示图51LUCENE索引结构图在LUCENE中,索引文件的存储还分两种结构一种是多文件索引结构,另一种是复合索引结构。23多文件索引是使用一系列索引文件分别存储索引,分散管理数据的索引存储格式。多文件索引在打开时需要读取大量文件,会大大占用系统的文件句柄等资源,造成系统响应速度慢,甚至系统崩溃2。因此,在本系统中,我们采用复合索引结构。复合索引是把索引相关的一系列数据结构组织到少数几个文件中进行管理的索引存储模式。复合索引把所有的索引数据被组合成简单的3个文件,大大减少了打开大量文件的压力。但是使用统一文件存储大量数据会造成数据更新的问题,每次更改需要操作一个大的数据文件,读取和存储都会比较慢。对本系统来说,因为数据量不是很大,所以并不会产生大的数据文件。因此,选择以这种结构来存储邮件的索引文件是一种比较好的解决方案。512LUCENE中的分词对于分词,在LUCENE这个全文检索工具包中,是一个非常重要的。因为如果要对一篇文章建立全文索引,就必须先对这篇文章进行文本分析,对文章要进行有意义的分词。这就必须要用到分词器。由于LUCENE不是本国人开发的全文检索工具包,因此LUCENE中自带的分词器对于中文分词的支持不是很好。LUCENE包中有两个支持中文的分词器一个是CHINESEANALYZER,另一个是CJKANALYZER。但是CHINESEANALYZER这个分词器只是单字切分,而CJKANALYZER分词器则是一个二分法的分词器。因此,总的来说,LUCENE自带包中的分词器对中文分词的支持都不是很好。国内有一个比较出名的中文分词器,是中科院计算所开发的ICTCLAS。但由于这个分词器是用C开发的,因此如果在JAVA应用程序中使用的话,容易出现不稳定的现象。毕业设计论文代做平台580毕业设计网是专业代做团队也有大量毕业设计成品提供参考WWWBYSJ580COMQQ3449649974最后,在我们这个系统中选择一个第三方提供的分词器JE分词器。这个分词器是基于词库的,所以分词的效果相对其余分词器的分词效果要好。各种分词器分词效果比较对“我爱我伟大的老爸老妈,我爱我壮丽的中华”这句话进行分词。CHINESEANALYZER分词结果我|爱|我|伟|大|的|老|爸|老|妈|我|爱|我|壮|丽|的|中|华CJKANALYZER分词结果我爱|爱我|我伟|伟大|大的|的老|老爸|爸老|老妈|我爱|爱我|我壮|壮丽|丽的|的中|中华24JE分词器分词结果我|爱我|伟大|老爸|老妈|我|爱我|壮丽|中华513建立邮件索引了解LUCENE建立索引过程的原理之后,我们要对本系统进行定制邮件索引器。在本系统中的一封邮件包括6个部分,分别是邮件ID、收件人、发件人、邮件主题、邮件内容和发信时间。1邮件索引的需求在本系统中,要求建立的邮件索引必须能够支持用户对邮件的收件人、发件人、邮件主题、邮件内容和发信时间进行搜索。因此在一封邮件中,除了邮件ID不被搜索到,邮件的其余部分都要能被搜索到。但是邮件ID有其特殊的功能,所以在本系统中,每一封邮件的各个部分都建立相关的索引。2建立索引的具体实现判断要存放索引的路径是否被锁定,若没被锁定,就下一步,否则就等待该锁定的路径被解锁;用路径名和JE分词器生成一个INDEXWRITER对象;生成一个DOCUMENT对象;生成一个邮件ID的索引域,并加入到DOCUMENT对象中;生成一个收件人的索引域,并加入到DOCUMENT对象中;生成一个发件人的索引域,并加入到DOCUMENT对象中;生成一个邮件主题的索引域,并加入到DOCUMENT对象中;生成一个邮件内容的索引域,并加入到DOCUMENT对象中;生成一个发信时间的索引域,并加入到DOCUMENT对象中;将DOCUMENT对象添加到INDEXWRITER对象中;INDEXWRITER对象进行索引优化操作;关闭INDEXWRITER。3建立邮件索引核心代码PUBLICSTATICBOOLEANADDINDEXSTRINGPATH,MAILMESSAGEMSGSTRINGINDEXPATHPATHTRYWHILEINDEXREADERISLOCKEDINDEXPATH25INDEXWRITERWRITERNEWINDEXWRITERINDEXPATH,NEWMMANALYZERDOCUMENTDOCNEWDOCUMENTFIELDFIELDNEWFIELD“ID“,MSGGETID,FIELDSTOREYES,FIELDINDEXUN_TOKENIZEDDOCADDFIELDFIELDNEWFIELD“FROM“,MSGGETMAILFROM,FIELDSTOREYES,FIELDINDEXTOKENIZEDDOCADDFIELDFIELDNEWFIELD“TO“,MSGGETMAILTO,FIELDSTOREYES,FIELDINDEXTOKENIZEDDOCADDFIELDFIELDNEWFIELD“SUBJECT“,MSGGETSUBJECT,FIELDSTOREYES,FIELDINDEXTOKENIZEDDOCADDFIELDFIELDNEWFIELD“CONTENT“,STRINGUTILREMOVEHTMLMSGGETCONTENT,FIELDSTOREYES,FIELDINDEXTOKENIZEDDOCADDFIELDFIELDNEWFIELD“TIME“,MSGGETTIME,FIELDSTOREYES,FIELDINDEXTOKENIZEDDOCADDFIELDWRITERADDDOCUMENTDOCWRITEROPTIMIZEWRITERCLOSECATCHIOEXCEPTIONEEPRINTSTACKTRACERETURNFALSECATCHEXCEPTIONEEPRINTSTACKTRACERETURNTRUE4邮件建立索引过程中的三处细节由于邮件建立索引是采用多线程实现的,就是在同一时刻有可能存在多个索引程序在运行。如果有一个程序在为邮件建立索引的时候,则另一个索引程序要等待其完成才能开始为邮件建立索引,否则将产生写冲突。即WHILEINDEXREADERISLOCKEDINDEXPATH这行代码是至关重要的。邮件ID在建立索引的时候不能被分词,否则就失去了邮件ID的特点。本系统中,对邮件建立索引的过程是增量索引。26514删除邮件索引删除邮件索引要实现的功能当用户将自己的某一封邮件删除时,与该邮件相对应的邮件索引也应该被删除,因此这邮件的索引应该与数据库中存在的邮件保持一致性。删除邮件索引的具体实现判断要存放索引的路径是否被锁定,若没被锁定,就下一步,否则就等待该锁定的路径被解锁;用路径名生成一个INDEXREADER对象并打开索引文件;根据邮件ID生成一个索引项;用邮件ID索引项来删除索引文件中包含此索引项的索引,并关闭INDEXREADER对象;再判断要存放索引的路径是否被锁定,若没被锁定,就下一步,否则就等待该锁定的路径被解锁;用路径名和JE分词器生成一个INDEXWRITER对象;优化索引,并关闭INDEXWRITER对象。建立邮件索引核心代码PUBLICSTATICBOOLEANDELETEINDEXSTRINGPATH,STRINGIDSTRINGINDEXPATHPATHTRY/判断索引是否被锁定WHILEINDEXREADERISLOCKEDINDEXPATHINDEXREADERIRINDEXREADEROPENINDEXPATHTERMTNEWTERM“ID“,IDIRDELETEDOCUMENTST/删除索引IRCLOSEWHILEINDEXREADERISLOCKEDINDEXPATHMMANALYZERMANEWMMANALYZERINDEXWRITERIWNEWINDEXWRITERINDEXPATH,MAIWOPTIMIZE/优化索引IWCLOSECATCHIOEXCEPTIONEEPRINTSTACKTRACERETURNFALSERETURNTRUE2752邮件的搜索在该系统中的邮件搜索是应用LUCENE来实现的。521LUCENE搜索介绍与通常搜索引擎的流程一致,LUCENE的检索查询也按照基本的检索流程操作。由于索引结构的限定,查询分析过程与索引过程类似,需要制定一个索引目录,并且要求目录下预先保存了创建好的索引。利用创建的INDEXSEARCHER实例,实现对目录索引的访问。通常构造TERM对象来保存查询信息,并传递给QUERY对象来构造查询器。INDEXSEARCHER根据QUERY查询器的内容进行实际的检索查询,得到的结果通过HITS对象形式返回,HITS对象存放了一个结果数组集合。通过循环访问,就可以得到各个具体的内容了。LUCENE中基本的搜索调用流程如图52所示。索引已建立准备索引目录INDEXSEARCHER实例化生成索引项TERM生成检索QUERY类对象检索查询生成HITS对象循环获取HITS结果集中文档内容关闭INDEXSEARCHER结束图52LUCENE基本搜索调用流程图28522搜索邮件了解LUCENE基本搜索调用流程之后,我们要对本系统进行定制邮件搜索器。在本系统中的一封邮件包括6个部分,分别是邮件ID、收件人、发件人、邮件主题、邮件内容和发信时间。针对邮件的6个不同部分,对于搜索的要求也有所不同,因此针对每个不同的部分还要选择合适的分词器。1邮件每个部分分词器的选择邮件ID由于邮件ID是不会被搜索的,因此这就没有必要分词了。收件人由于收件人是一串英文字符串,而且经过测试,CJKANALYZER可以将邮箱名以“”和“”为间隔分开,而JE分词器做不到,因此邮件的收件人部分用CJKANALYZER来分词。发件人邮件的发件人这部分与收件人的处理方式一样。邮件主题由于邮件的主题对于中国人来说,使用的语言大部分是中文,因此选择用JE分词器。而且JE分词器又支持英文的分词,所以就更加偏向选择JE分词器,最终就可以达到既可以对中文分词又可以对英文分词的效果。邮件内容邮件的内容这部分与邮件主题的处理方式一样。发信时间邮件的发信时间与收件人的处理方式一样。2邮件搜索的需求在本系统中,要求邮件搜索功能必须能够支持用户对邮件的收件人、发件人、邮件主题、邮件内容和发信时间进行搜索。因此在一封邮件中,除了邮件ID不被搜索到,邮件的其余部分都要能被搜索到。3搜索邮件的具体实现搜索邮件的具体实现分成两部分1对邮件的发件人、收件人和发信时间的搜索将搜索的关键字转换成IO流;用CJKTOKENIZER类来处理IO流,转换成一个一个的分词,并存入链表;将链表中的每一个分词构造成对应索引域的索引项,并利用LUCENE提供的字串前缀搜索来构造字串前缀搜索;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论