# 邮件检索系统
## 一、问题描述
实现邮件检索系统,被检索数据为安然公司 150 位用户 50 万封电子邮件,语言为英文。搜索引擎采用 Apache 的开源全文检索引擎 Lucene。检索时按照收件人、发件人、标题、内容等进行邮件检索。并实现交互系统。
## 二、实验环境介绍
开发使用的 IDE 为 IDEA,Java 版本为 11.0.2。Lucene 版本 8.2.0。Log4j 版本 2.12.1。Web 界面使用 JSP 动态网页,运行在 Tomcat 服务器中,Tomcat 版本为 7.0.92。
## 三、实现思路
邮件索引系统中的索引建立为一次性操作,一次索引即可反复使用。所以将该项目分为索引建立与查询两个部分并分别实现。其中索引建立部分使用 Console 界面实现。查询部分使用 Web 界面实现,运行时只需要在服务器端运行索引程序,或者直接将已经生成的索引放置在指定文件夹下即可。
## 四、具体实现
##### 四、建立索引
该子项目全部代码运行于 LuceneIndex 类中,main 函数入口点负责初始化类,构造函数完成构建索引器、分析器与索引写入对象等操作后,由主函数调用 LuceneIndex 类的 index()方法开始运行索引,index 方法会递归调用自身完成对待索引项目的遍历索引,期间有完善的错误处理与日志机制保证在较大数据集上运行时不会中途退出。最后由主函数调用 close()方法关闭索引写入对象结束索引过程。
##### 四、LuceneIndex 类的成员变量与成员方法
- logger 对象用于进行日志写入与信息输出。
- writer 对象为该程序中所有文件索引的共用索引写入对象。
- numIndexTotal 用于统计索引的文件总数。
- main 函数为入口点,负责启动与关闭索引,并计时。
- LuceneIndex 用于初始化索引器,分析器等对象。
- index 方法用于递归调用以递归遍历所有目录下的可读取文件进行索引。
- analyze 方法为文件解析器,解析文件结构分割进入 field 进行索引。
- close 方法用于关闭 writer。
![](https://www.writebug.com/myres/static/uploads/2021/12/6/7d1004955e69f82d6f4e35d69657c964.writebug)
![](https://www.writebug.com/myres/static/uploads/2021/12/6/4c3d7f73153b22d84d2522ee238fedaa.writebug)
##### 四、main()函数,程序入口点
在索引开始与结束时计时,并在最后利用 logger 输出耗时与索引文件总量。
在所有可能出现异常的位置使用 try-catch 语句环绕并处理对应异常,利用 logger 进行输出。
![](https://www.writebug.com/myres/static/uploads/2021/12/6/f61685576054f51ed1801ec33303ffd2.writebug)
##### 四、LuceneIndex 构造函数
创建一个磁盘索引器 FSDirectory,一个标准分析器并使用 CREATE 模式新建索引。这里不使用内存索引器的原因的内存索引器虽然更加高效,但是在 Lucene 8.2.0 版本中被弃用,且即便不使用内存索引器,索引也可以在半小时左右完成。
![](https://www.writebug.com/myres/static/uploads/2021/12/6/380d06b774e26b76ee458d37d76c6281.writebug)
##### 四、index 方法
递归遍历完成索引。
![](https://www.writebug.com/myres/static/uploads/2021/12/6/4f2d3537165183edae4dd6186dce18b5.writebug)
##### 四、analyze 方法
该方法会尝试解析文本中的标题,发件时间,发件人,收件人,正文,文件名与文件路径等信息并添加到字段中进行索引。
![](https://www.writebug.com/myres/static/uploads/2021/12/6/5da42d67e18dbfbc685664b34f66a288.writebug)
利用 FileInputStream 进行文件读取,因为是英文,不考虑文件编码问题。
![](https://www.writebug.com/myres/static/uploads/2021/12/6/2aa7b5b3e61a5b528a80fabfa5fcde5c.writebug)
使用 subString 方法进行截取,通过识别关键字进行截取。
最后使用 doc.add()将字符串添加到对应的字段中。
##### 四、close 方法
![](https://www.writebug.com/myres/static/uploads/2021/12/6/13c07b070bc10e92d6e4ca7d7e53fa0f.writebug)
关闭写入对象。
##### 四、日志与运行效率
![](https://www.writebug.com/myres/static/uploads/2021/12/6/04b9a1e4336b709f1faad74a769b1a33.writebug)
Log4j 被配置为将日志输出为三部分,info 级别以上的被输出到控制台。Debug 级别以上的输出到 IndexInfo.log 文件中,Warn 级别以上的单独输出到 IndexWarning.log 中。
经过实际索引运行,索引全部 517k 封邮件耗时约半小时,期间 CPU 占用低于 5%,磁盘占用低于 1%。该程序的性能瓶颈为磁盘存取的状态切换开销。通过多线程无法获得优化,但是可以通过减少磁盘写索引次数获得一定程度的优化。
##### 四、在线查询
查询网页由两部分组成,index.jsp 和 search.jsp。
index.jsp 负责处理前端显示并与用户交互,index.jsp 通过 get 方法把查询参数传输给 search.jsp,search.jsp 负责处理并完成查询。
##### 四、index.jsp
该页面构成主要基于 html5,并通过 CSS 与 JavaScript 美化了页面。界面支持 4 中检索方式,精确匹配、通配符匹配、前缀匹配与模糊匹配搜索。前三种在传参时只发送搜索内容和字段信息并附带搜索类型。最后一种额外附加一个模糊级别信息。
![](https://www.writebug.com/myres/static/uploads/2021/12/6/b302859d592a3e9355062925d42f0ddb.writebug)
界面中,搜索字段部分提供了中文的下拉列表方便输入。
另外,在模糊输入部分提供了更加用户友好的界面,使用一个可以滑动的滑块提供模糊级别的输入,并且利用 html5 特性进行实时显示。
![](https://www.writebug.com/myres/static/uploads/2021/12/6/196abff73d47a7a18ebe9a59d2717caa.writebug)
![](https://www.writebug.com/myres/static/uploads/2021/12/6/0c23e7fc821ceb41881c467a41277749.writebug)
利用 form 的 oninput 属性实现滑块值实时显示
![](https://www.writebug.com/myres/static/uploads/2021/12/6/9599bc47f71091e6563424830b3d0975.writebug)
输入页面整体效果
##### 四、search.jsp
首先进行参数解析,同时完成异常参数检测并进行处理。
![](https://www.writebug.com/myres/static/uploads/2021/12/6/ee7efef871b5c7a4980c00bafdd282ae.writebug)
在将 get 方法传递的参数进行解码和检测异常之后,当参数无误则进入服务器后台开始搜索。
![](https://www.writebug.com/myres/static/uploads/2021/12/6/d2da859d1fc9714e9c80ded5cc061d4b.writebug)
初始化各个搜索对象,并根据传入的搜索类型实例化不同的 query 对象,以实现不同的查找方式。
![](https://www.writebug.com/myres/static/uploads/2021/12/6/2b9ed4e7d4c7062a433663713244204a.writebug)
使用 search 进行搜索,将结果利用 highlighter 类提供的方法进行优化处理后输出。
![](https://www.writebug.com/myres/static/uploads/2021/12/6/3c8865ef9b102817ec7710239fa85da0.writebug)
![](https://www.writebug.com/myres/static/uploads/2021/12/6/9f3aedd12c9628b292257d86dc853524.writebug)
当检测出参数有异常时,则输出对应的错误信息,跳过服务器端的后台搜索部分。
# 五、结果展示
![](https://www.writebug.com/myres/static/uploads/2021/12/6/f93995c4f85d093cf444a234cefb33ff.writebug)
![](https://www.writebug.com/myres/static/uploads/2021/12/6/d811e189feabffb4ae6b254458d87ff2.writebug)
![](https://www.writebug.com/myres/static/uploads/2021/12/6/b82cd941fc2dc3f8939696efd21438cf.writebug)
![](https://www.writebug.com/myres/static/uploads/2021/12/6/af4fce2aa023f14ec4cb58e682e925d0.writebug)
![](https://www.writebug.com/myres/static/uploads/2021/12/6/3d46ce5b0e3caa174be8471127cd96d3.writebug)
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
实现邮件检索系统,被检索数据为安然公司 150 位用户 50 万封电子邮件,语言为英文。搜索引擎采用 Apache 的开源全文检索引擎 Lucene。检索时按照收件人、发件人、标题、内容等进行邮件检索。并实现交互系统。
资源推荐
资源详情
资源评论
收起资源包目录
100011043-基于 Java 实现(Web)邮件检索系统.zip (56个子文件)
luceneproject
.gitattributes 66B
src
LuceneProject
LuceneIndex.java 6KB
LICENSE 1KB
out
artifacts
LuceneProject
WEB-INF
classes
LuceneProject
LuceneIndex.class 6KB
log4j2.xml 966B
lib
lucene-memory-8.2.0.jar 51KB
lucene-highlighter-8.2.0.jar 205KB
log4j-core-2.12.1.jar 1.6MB
lucene-core-8.2.0.jar 3.07MB
lucene-queries-8.2.0.jar 360KB
log4j-api-2.12.1.jar 270KB
lucene-queryparser-8.2.0.jar 372KB
lucene-analyzers-common-8.2.0.jar 1.6MB
web.xml 304B
index.jsp 4KB
search.jsp 5KB
production
LuceneProject
LuceneProject
LuceneIndex.class 6KB
log4j2.xml 966B
web
WEB-INF
lib
lucene-memory-8.2.0.jar 51KB
lucene-highlighter-8.2.0.jar 205KB
log4j-core-2.12.1.jar 1.6MB
lucene-core-8.2.0.jar 3.07MB
lucene-queries-8.2.0.jar 360KB
log4j-api-2.12.1.jar 270KB
lucene-queryparser-8.2.0.jar 372KB
lucene-analyzers-common-8.2.0.jar 1.6MB
web.xml 304B
index.jsp 4KB
search.jsp 5KB
img.docx-md
1-1f115aeedd0b850d1d39de745d52bb67.png 69KB
12-213624d64015eae6ee7f59bc17f3877a.png 109KB
7-c6731e7580d775b5bf797f5570baa50f.png 86KB
13-fa0459392f1ad8230dd5b01f904e1e3b.png 270KB
15-29ee97c0d101d1fc7ff9f2d1814a807c.png 91KB
17-99b9d7fe30254b700ffd8fac68f50453.png 173KB
16-c12a238891aaf0f39879e2495153825d.png 69KB
18-3f6602d5e59bff5847a0100938965561.png 11KB
21-7b9d82ee274f04b2aacb97937b53f449.png 46KB
20-56c567b4def66dd2000cdbf027ed0b5c.png 148KB
14-1f375ec27c6abcc5a3247fbef47154c8.png 136KB
11-87c2fe954d2720af5cfed7670f081ff8.png 46KB
2-0b44eafca1acabc4522713653ccfd8c7.png 15KB
6-23459e9ea843d1c7402a77a9a246c7af.png 26KB
8-0fbe17c93c7d2d10d06243d5e55cccfb.png 10KB
10-7b9d82ee274f04b2aacb97937b53f449.png 46KB
5-64ce3e81628b18e860af7075396530ac.png 137KB
23-90d48f8865ef4e46c6ad69bfe9f2ece4.png 351KB
3-5e694b7037141701a1fbaad34bad4736.png 133KB
22-87c2fe954d2720af5cfed7670f081ff8.png 46KB
4-75b20f0826c17ede842b0b64c935b2c4.png 37KB
9-5d1fa66c7548c76535cf9910db8ec304.png 102KB
19-d929d403c51eb7916008a17610bc7d7d.png 53KB
Java实验报告.pdf 1.24MB
.gitignore 351B
README.md 8KB
Java实验报告.docx 2.09MB
共 56 条
- 1
资源评论
- Qs9131632023-04-22这个资源总结的也太全面了吧,内容详实,对我帮助很大。
神仙别闹
- 粉丝: 2680
- 资源: 7667
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- (matlab源码)基于Elman神经网络的电力负荷预测模型MATLAB实现
- 微信小程序源码 趣味互动机器人 - 机器人兔兔下载
- 2022年全国各区县年平均气温
- 05-16 周四 vscode 搭建远程调试环境
- (matlab源码)基于SOM神经网络的柴油机故障诊断MATLAB实现
- 1950-2022年全国各省份逐年平均降水数据
- (matlan源码)粒子群算法的寻优算法MATLAB实现
- MTB095N10KRN3-VB一款SOT23封装N-Channel场效应MOS管
- (MATLAB源码)灰色神经网络对订单需求预测分析与MATLAB实现 (2)
- (matlab源码)基于BP-Adaboost的强分类器设计与MATLAB实现
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功