(1) XML预处理
读取test.xml并修改url节点下的localhost信息,以保证预览和下载用户所需正确资源。过程如下:
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)服务器注册、注销和选举
开启服务器后,可以实现单机搜索。考虑到test.xml中关于服务器IP信息的不确定性,我们采取获取本机IP后,在后台手动输入主服务器IP并添加从机的方式(详细步骤请看用户操作手册)来实现服务器的分布式,这种方式能够适合多种情况。
1、服务器初始化步骤如下:
(1)主服务器先行注册后,开启监听服务
(2)从机获取主服务器IP后存入本地XML中
(3)开启RMI注册服务,远程机器实现向主服务器注册、注销
(4)每台服务器将在线服务器的IP动态写入本地的数据文件
(5)由Socket通信服务监听各服务器状态
2、从机向主服务器远程注册成功和注销成功后,主服务器会通知已连接在线的其他从机有新的机器加入或有机器掉线。当由于网络不稳定等异常发生导致主服务器掉线,通过选举算法在从机中选举出新主服务器,其他从机向新主服务器注册建立连接,以保证用户能继续搜索。
3、具体实现通过Socket通信技术,主服务器端开启监听服务,监听已注册客户端的状态,当有客户端因为异常掉线时,主服务器通过线程负责通知其他从机该客户端已不在线。已注册客户端向服务端发送信息并接受主服务器端的反馈信息,当客户端没有收到服务器端信息时,说明主服务器因异常掉线,各客户端相互通知,并通过选举算法选举出新主服务器。
(3) 拼音搜索功能
该搜索引擎实现拼音搜索功能。因为直接实现拼音转为汉字较为困难,我们通过将资源关键字以及对应拼音写入数据库,实现拼音搜索功能。
实现步骤:
-
在服务器启动时,检索xml文件。
-
将xml中所有关键字检索,并利用pinyin4j包分别将所有关键字转化为对应拼音。
-
将汉字及其对应拼音作为一行记录写入数据库中。
-
搜索时,从数据库中提取出与输入拼音相对应的关键字,作为参数传递给搜索方法,进行搜索。
(4)搜索过程
1.分词.
索引过程与搜索过程中运用的是JE分词器,JE分词器是一款轻量级的、易于安装的分词器,只需将包导入项目的lib中即可,JE分词器分词效率不错,准确度也不错。
2.索引.
用dom4j读取xml文档,将节点信息封装进javabean中,然后利用lucene建立倒排索引表。
3.普通搜索.
判断输入的关键字是否为拼音,如果为拼音则查询数据库选出相应的汉语。然后,然后利用JE分词器将关键字分词,建立关键字数组,遍历关键字数组,通过TermQuery建立BooleanQuery,然后对索引进行查找。
4.模糊查找.
判断输入的关键字是否为拼音,如果为拼音则查询数据库选出相应的汉语。然后,然后利用JE分词器将关键字分词,建立关键字数组,遍历关键字数组,通过FuzzyQuery建立BooleanQuery,然后对索引进行查找。
5.按种类进行搜索.
在普通搜索的基础上,通过重写了lucene的过滤器,对多种格式的文件进行了过滤,以实现按类别查找。
6.高级搜索.
包括包含多关键字的搜索,包一任意关键字的搜索,包含完整关键字的搜索以及前缀搜索。包含多关键字可以通过BooleanQuery的MUST和SHOULD属性来实现。包含任一关键字用BooleanQuery实现。包含完整关键字可以通过不对关键字进行分词而直接对索引进行搜索的方式来实现。前缀搜索可以通过lucene的PrefixQuery来实现。
高级搜索还添加了不包含关键字,资源的作者和上传者等限制条件,这些都是通过重写lucene过滤器实现的.
7.高亮显示模块.
利用lucene的 Highlighter 类对于关键字匹配的信息进行变红处理,以供前台的高亮显示。
8.对结果集的去除重复处理.
利用自己编写的方法将检索结果中的重复项去掉,然后通过冒泡排序算法对分布式检索的结果进行排序,排序是比较的是文档的得分。lucene对文档的匹配程度的衡量有一套评分公式,通过计算得出每个文档的得分情况,通过得分来评价文档的相关程度。
9.将返回结果输出到jsp页面上.
lucene : Lucene是一套用于全文检索和搜寻的开源程式库,由Apache软件基金会支持和提供。Lucene提供了一个简单确强大的应用程式接口,能够做全文索引和搜寻,在Java开发环境里Lucene是一个成熟的免费开放源代码工具;
dom4j:dom4j是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件
(4)后台管理
1、用户注册:用户可以通过用户注册登陆我们的系统,成为用户,出于对资源安全的考虑,我们只允许已经注册过得用户上传资源,然后就可以使用我们的上传功能。
2、资源上传:用户可以通过上传功能上传包括(文档,视频,音频,以及图片),由于我们有大小以及格式的限制,所以会有一些格式的文件不
上传;
3、资源审核:对于用户上传的资源并不是直接就能搜索到的,而是要通过后台管理员的确定,这里我们完成的是对已经上传的资源的审核功能,
定其合法性和有用性。
4、上传功能:在这里我们可以把已经通过审核的资源批量的上传,并且建立起索引,直接就可以把他们搜索出来。
5、普通删除:管理员可以通过普通删除把不需要的文件进行删除,这里支持单个删除也可以批量删除。
6、时间删除:管理员可以把已经过时的文件通过时间删除进行删除,进行文件的更新。
用户列表:管理员查看用户列表信息,可以在这里把已经注册的用户进行删除。
7、服务器添加:可以手动的添加服务器;
8、服务器列表:可以查看在线的服务器