热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

分布式检索系统的简单设计

(1)XML预处理读取test.xml并修改url节点下的localhost信息,以保证预览和下载用户所需正确资源。过程如下:

(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) 拼音搜索功能

该搜索引擎实现拼音搜索功能。因为直接实现拼音转为汉字较为困难,我们通过将资源关键字以及对应拼音写入数据库,实现拼音搜索功能。

实现步骤:

  1. 在服务器启动时,检索xml文件。

  2. xml中所有关键字检索,并利用pinyin4j包分别将所有关键字转化为对应拼音。

  3. 将汉字及其对应拼音作为一行记录写入数据库中。

  4. 搜索时,从数据库中提取出与输入拼音相对应的关键字,作为参数传递给搜索方法,进行搜索。

(4)搜索过程

   1.分词.

索引过程与搜索过程中运用的是JE分词器,JE分词器是一款轻量级的、易于安装的分词器,只需将包导入项目的lib中即可,JE分词器分词效率不错,准确度也不错。

 2.索引.

dom4j读取xml文档,将节点信息封装进javabean中,然后利用lucene建立倒排索引表。

 3.普通搜索.

判断输入的关键字是否为拼音,如果为拼音则查询数据库选出相应的汉语。然后,然后利用JE分词器将关键字分词,建立关键字数组,遍历关键字数组,通过TermQuery建立BooleanQuery,然后对索引进行查找。

 4.模糊查找.

判断输入的关键字是否为拼音,如果为拼音则查询数据库选出相应的汉语。然后,然后利用JE分词器将关键字分词,建立关键字数组,遍历关键字数组,通过FuzzyQuery建立BooleanQuery,然后对索引进行查找。

   5.按种类进行搜索.

在普通搜索的基础上,通过重写了lucene的过滤器,对多种格式的文件进行了过滤,以实现按类别查找。

     6.高级搜索.

包括包含多关键字的搜索,包一任意关键字的搜索,包含完整关键字的搜索以及前缀搜索。包含多关键字可以通过BooleanQueryMUSTSHOULD属性来实现。包含任一关键字用BooleanQuery实现。包含完整关键字可以通过不对关键字进行分词而直接对索引进行搜索的方式来实现。前缀搜索可以通过lucenePrefixQuery来实现。

高级搜索还添加了不包含关键字,资源的作者和上传者等限制条件,这些都是通过重写lucene过滤器实现的.

  7.高亮显示模块.

利用luceneHighlighter 类对于关键字匹配的信息进行变红处理,以供前台的高亮显示。

    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


推荐阅读
  • Java EE CDI:解决依赖关系冲突的实例
    在本教程中,我们将探讨如何在Java EE的CDI(上下文和依赖注入)框架中有效解决依赖关系的冲突问题。通过学习如何使用限定符,您将能够为应用程序的不同客户端提供多种接口实现,并确保每个客户端都能正确调用其所需的实现。 ... [详细]
  • 在尝试使用C# Windows Forms客户端通过SignalR连接到ASP.NET服务器时,遇到了内部服务器错误(500)。本文将详细探讨问题的原因及解决方案。 ... [详细]
  • Spring Boot 中静态资源映射详解
    本文深入探讨了 Spring Boot 如何简化 Web 应用中的静态资源管理,包括默认的静态资源映射规则、WebJars 的使用以及静态首页的处理方法。通过本文,您将了解如何高效地管理和引用静态资源。 ... [详细]
  • 搭建Jenkins、Ant与TestNG集成环境
    本文详细介绍了如何在Ubuntu 16.04系统上配置Jenkins、Ant和TestNG的集成开发环境,涵盖从安装到配置的具体步骤,并提供了创建Windows Slave节点及项目构建的指南。 ... [详细]
  • 本文详细介绍了JSP(Java Server Pages)的九大内置对象及其功能,探讨了JSP与Servlet之间的关系及差异,并提供了实际编码示例。此外,还讨论了网页开发中常见的编码转换问题以及JSP的两种页面跳转方式。 ... [详细]
  • Eclipse 中 JSP 开发环境配置指南
    本文详细介绍了如何在 Eclipse 集成开发环境中配置 JSP 运行环境,包括必要的软件下载、Tomcat 服务器的配置以及常见问题的解决方法。 ... [详细]
  • 本文介绍了如何在WildFly 10中配置MySQL数据源时遇到的服务依赖问题及其解决方案。 ... [详细]
  • 本文探讨了浏览器的同源策略限制及其对 AJAX 请求的影响,并详细介绍了如何在 Spring Boot 应用中优雅地处理跨域请求,特别是当请求包含自定义 Headers 时的解决方案。 ... [详细]
  • MapReduce原理是怎么剖析的
    这期内容当中小编将会给大家带来有关MapReduce原理是怎么剖析的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1 ... [详细]
  • 本文详细比较了CSS选择器和XPath在Selenium中通过页面结构定位元素的优劣,并提供了具体的代码示例,帮助读者理解两者在不同场景下的适用性。 ... [详细]
  • 软件工程课堂测试2
    要做一个简单的保存网页界面,首先用jsp写出保存界面,本次界面比较简单,首先是三个提示语,后面是三个输入框,然 ... [详细]
  • Java实现文本到图片转换,支持自动换行、字体自定义及图像优化
    本文详细介绍了如何使用Java实现将文本转换为图片的功能,包括自动换行、自定义字体加载、抗锯齿优化以及图片压缩等技术细节。 ... [详细]
  • 详细指南:使用IntelliJ IDEA构建多模块Maven项目
    本文在前两篇文章的基础上,进一步指导读者如何在IntelliJ IDEA中创建和配置多模块Maven项目。通过详细的步骤说明,帮助读者掌握项目模块化管理的方法。 ... [详细]
  • Java Servlet中获取客户端IP与MAC地址的方法
    本文介绍了一种在Java Servlet应用中获取客户端IP地址及MAC地址的技术实现方法,通过示例代码详细解析了获取过程中的关键步骤和技术点。 ... [详细]
  • 本文探讨了在JavaScript中执行字符串形式代码的多种方法,包括使用eval()函数以及跨页面调用的方法。同时,文章详细介绍了JavaScript中字符串的各种常用方法及其应用场景。 ... [详细]
author-avatar
周周微商互联
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有