分布式检索系统的简单设计
(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、服务器列表:可以查看在线的服务器
转载于:https://www.cnblogs.com/yimindu/p/3367030.html
分布式检索系统的简单设计相关推荐
- 航班信息查询和检索系统-数据结构课程设计
问题及代码: 设计并实现一个航班信息查询和检索系统.要求:对飞机航班信息进行排序和查找,可按照航班号.起点站.到达站.起飞时间和到达时间等信息进行查询.航班信息表的样式如下: 航班号 起点站 终点站 ...
- 一个分布式***检测系统的研究与设计
一个分布式 ***检测 系统的研究与设计 安 娜,吴晓南,陈晓江,房鼎益 (西北大学 计算机科学系,陕西 西安 710069) 摘要:针对目前***检测系统不能适应异构 网络环境.缺乏协同响应的不 ...
- 深圳大学公文通简易检索系统
该系统是对深圳大学公文通的检索系统的简单实现,既然是简单实现,也就说只实现了初始的功能,现在暂时只能对一个月的公文通进行检索,而且是系统初始化时所抓取的数据.之后有时间会不断让系统升级,使得可以实时检 ...
- 分布式实时处理系统架构设计与机器学习实践
编者按:在2017年的1月11日,CSDN高级架构师金牌授课群为群友们带来了第一次的分享,讲师和主题参见这里,本文为课程后续的文字整理,第一时间发出来分享给读者,课件下载点击这里. 大家好,我们今天主 ...
- 从新手到专家:如何设计一套亿级消息量的分布式IM系统
本文原作者Chank,原题"如何设计一个亿级消息量的 IM 系统",为了提升内容质量,本次有修订和改动. 1.写有前面 本文将在亿级消息量.分布式IM系统这个技术前提下,分析和总结 ...
- 分布式爬虫系统的设计与实现(SourceForge.net数据爬取)
目录 本科生毕业论文(设计)中文摘要 I 本科生毕业论文(设计)英文摘要 II 目录 I 图目录 III 表目录 IV 第一章 引言 1 1.1 研究背景 1 1.1.1 SourceForge.ne ...
- R3 Corda:一个为金融服务设计的分布式账本系统
R3-CEV 因为联结了42家银行金融机构研究区块链,它的一举一动备受瞩目.这次是官方首次披露他们的系统 Corda 的相关细节,Corda 宣称的去「区块链」概念博人眼球,系统设计上确实有许多区别于 ...
- 一个简单检索系统的实现思想
简单实现了各个模块的功能,对整体有了了解,当然不是实用的系统.问题很多,抽时间继续学习. 系统的整体设计 (1)网络爬虫模块:该模块是从URL库中获得输入,解析URL中表明的Web服务器地址,建立连接 ...
- 分布式跟踪系统(一):Zipkin的背景和设计
原文链接: https://blog.csdn.net/manzhizhen/article/details/52811600 2010年谷歌发表了其内部使用的分布式跟踪系统Dapper的论文(htt ...
最新文章
- C#开发Unity游戏教程之判断语句
- WPF-常用布局容器
- 从成本角度看Java微服务
- 现在社交APP发展如何?
- 中国电力环保设备行业十四五发展形势与投资机会分析报告2022版
- 简单java题_java
- java解决跨域问题
- [html] 使用svg画一个微信的logo
- android 将图片路径转二进制,将图像转换为二进制图像中的android
- Linux C线程同步的三种方法
- 开源 php 报表,php网站流量统计系统-开源系统 | 学步园
- dreamweaver 8的替换功能
- python线程监控_Python监控php-fpm进程
- go语言渐入佳境[10]-function
- 输入数学函数c语言,C语言基本输入输出及数学函数.ppt
- java8--Lambda表达式
- 应该根据哪些判断云服务器的好坏
- 2022-2027年中国OLED市场竞争态势及行业投资前景预测报告
- python获取英文字母、英文标点符号、中文标点符号
- 有了这些视频画面裁剪软件,视频裁剪再也不是什么难题了
热门文章
- hash 建表 query 统计重复个数
- 台湾积体电路制造公司(简称为台积电(TSMC))的28nm LP、HPM、HPC、HPC+四种不同处理器工艺版本的区别?
- 三种工厂模式的分析以及C++实现
- a[0]和a 的区别?
- java: jstl.jar和standard.jar的下载地址与使用
- mybaits二十三:二级缓存
- [Java] SpringMVC工作原理之四:MultipartResolver
- 更改vsftp端口号
- LearningR-XML
- 全面剖析Redis Cluster原理和应用 (good)