




免费预览已结束,剩余77页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于struts2,spring,lucene灵活性搜索平台的搭建本 科 毕 业 论 文 个性化搜索引擎及相关技术研究 基于struts2,spring,lucene灵活性搜索平台的搭建 Personalized search engine and related technology researchBuilding of flexible search engine platform based on struts2,spring and Lucene姓 名: 学 号:学院:软件学院系:软件工程专 业:软件工程年 级:指导教师: 年 月基于struts2,spring,lucene灵活性搜索平台的搭建摘 要 随着互联网信息爆发式增长,搜索引擎的负担也越来越重,目前出现了各种的搜索引擎包括全文搜索,垂直搜索,整合搜索等,它们的问题域虽然不一样,但是它们都面临一个同样的问题,如何提高检索速度,增加用户体验,因此如何能在短时间内从浩瀚的信息中获取用户想要的信息是一个很大挑战。个性化搜索引擎不仅能在短时间内提供搜索结果,并且还可以对搜索结果进行过滤筛选使得结果更加符合用户需求。目前JavaEE已经成长为了一个工业化的平台,在它上面也涌向出了大量优秀的框架,本文主要利用JavaEE领域中开源的优秀框架来搭建一个灵活的个性化搜索引擎。在实践过程中,本系统采用Struts2框架作为表现层框架,Spring作为应用层框架,lucene作为领域层的框架,通过Activemq消息中间件实现了服务器对查询关键字的异步处理,通过AJAX技术实现了客户端浏览器和服务器端的异步通信,同时采用了优秀的开源缓存系统Ehcache对搜索结果进行了缓存。 最后,本文通过实践描述了如何采用优秀的开源框架和设计模式构建一个灵活的可扩展的搜索引擎平台,并且实现了预期的目标。关键词:搜索引擎;设计模式;AJAX;JMS;缓存 AbstractWith the explosive growth of internet information,the search engine will encounter the increasing burden.The present situation of the various search engines, including full-text search, vertical search, integrated search, although their problem is not the same domain,they are facing a the same problem,how to improve the retrieval speed, increase the user experience.So how search engine can get the information from vast information is a serious challenge. The personalized search engine will not only provide search results in a short period of time, and can also filter the search results to more them in line with customer needs.JavaEE currently has grown to an industrialized platform,and a large number of excellent framework swarmed on it.This dissertation mainly forces on how to build a flexible and scalable personalized search engine using the JavaEE opensource framework.In practice,this system using the struts2 as the presentation layer framework,spring as the application layer framework,and lucene as the domain layer framework.at the mean time,this system also use the activemq message middleware to make the asynchronous data process, use the AJAX technology to achieve the client and server-side asynchronous communication, and use the excellent open-source caching system Ehcache to cache search results.Finally,This article describes how to practice the use of good open source framework and design patterns to build a flexible and scalable platform for search engines,whats more ,it realize the expectant aim.Key words: Search Engine;design patterns; AJAX; JMS; cache. 目录第一章 概述11.1 搜索引擎背景11.2 相关技术框架21.3本文的主要内容2第二章 系统层级架构42.1 系统架构分析22.2 表现层52.2.1 Struts2框架52.2.2 界面设计82.2.3 查询模块设计92.3 应用层112.3.1 Spring框架112.3.2索引模块设计142.3.3查询模块设计162.4 领域层172.4.1 lucene框架182.4.2 索引模块设计212.4.3 查询模块设计252.5 数据源层282.5.1系统数据源分析282.5.2数据源层设计29第三章 JMS异步设计303.1 JMS303.2 ActiveMQ313.3 JMS异步模块设计333.3.1部署ActiveMQ333.3.2测试ActiveMQ343.3.3集成ActiveMQ与Spring353.3.4查询模块异步设计37第四章 AJAX异步设计404.1 AJAX404.2 JQuery414.3 Ajax模块异步设计424.3.1 Suggest功能分析424.3.2 Suggest功能设计434.3.3 Suggest效果46第五章 系统缓存设计485.1 缓存485.1.1缓存的概念485.1.2缓存的范围485.1.3 Ehcache495.2系统性能分析505.3缓存模块设计515.3.1缓存键设计515.3.2 类的设计525.4缓存效果55第六章 总结57致谢58参考文献59ContentsChapter 1 Introduction11.1 Background of Search Enginee11.2 Related Framework Introduction21.3 Content2Chapter 2 System Architecture42.1 System Architecture Analysis52.2 Presentation Layer52.2.1 Struts2 Framework52.2.2 View Design82.2.3 Query Module Design92.3 Application Layer112.3.1 Spring Framework112.3.2 Index Module Design142.3.3 Query Module Design162.4 Domain Layer172.4.1 lucene Fraemwork182.4.2 Index Module Design212.4.3 Query Module Design252.5 Datasource Layer282.5.1 Datasource Analysis 282.5.2 Datasource Design29Chapter 3 JMS Asynchronous Design303.1 JMS303.2 ActiveMQ313.3 JMS Asynchronous Module Design333.3.1 Deploy ActiveMQ333.3.2 Test ActiveMQ343.3.3 ActiveMQ Integrated With Spring353.3.4 Query Module Asynchronous Design37Chapter 4 AJAX Asynchronous Design404.1 AJAX404.2 JQuery414.3 Ajax Module Asynchronous Design424.3.1 Suggest Function Analysis 424.3.2 Suggest Function Design434.3.3 Suggest Effect46Chapter 5 System Cache Design485.1 Cache485.1.1 Cache Conception485.1.2 Scope Of Cache485.1.3 Ehcache495.2 System Performance Analysis 505.3 Cache Module Design515.3.1 CacheKey Design515.3.2 Class Design525.4 Cache Effect55Chapter 6 Summary57Acknowledgement58Reference59VI基于struts2,spring,lucene灵活性搜索平台的搭建第1章 概述1.1 搜索引擎背景 搜索引擎是指根据一定的策略、运用特定的计算机程序搜集互联网上的信息,在对信息进行组织和处理后,为用户提供检索服务的系统。搜索引擎并不真正搜索互联网,它搜索的实际上是预先整理好的网页索引数据库。真正意义上的搜索引擎,通常指的是收集了互联网上几千万到几十亿个网页并对网页中的每一个词(即关键词)进行索引,建立索引数据库的全文搜索引擎。当用户查找某个关键词的时候,所有在页面内容中包含了该关键词的网页都将作为搜索结果被搜出来。在经过复杂的算法进行排序后,这些结果将按照与搜索关键词的相关度高低,依次排列。 Internet的出现改变了全球通讯和信息资源的共享方式,它将各种各样的资源整合联系在一起,构成了一个巨大的网络。而互联网的快速发展带来的是网上信息爆炸性的增长。2008年,Google宣称其目前索引的网页数量已经达到一万亿,这些信息都具有无固定结构、分布无规律性和动态性极强的特点。虽然Internet上的信息量每天成指数级增长,但对于用户只有少数是相关或有用的。如何将这些信息有效的组织利用,让人们可以比较容易的找到自己所需的资源,这已经成为了现代互联网研究的关键课题。 搜索引擎正是在这种情况下应运而生,它以一定的策略在互联网中搜集、发现信息,对信息进行理解、提取、组织和处理,并为用户提供检索服务,从而起到信息导航的目的。但是,随着信息多元化的增长,千篇一律的给所有用户提供同样的搜索结果已经不能满足特定用户更深入查询的需求。通常,不同领域背景、不同知识结构的用户对文档相关性的判断及检索结果的要求是不同的。因此,未来的搜索引擎,必将体现这种“个性化”的信息检索,减少垃圾信息,提高查准率,并能够根据用户背景、兴趣爱好、行为、检索目的等信息,检索出适量的、高质量的查询结果。 针对上述问题,本项目组主要研究搜索引擎的相关技术,及如何充分挖掘用户浏览网页过程中的各种信息,来构造用户兴趣模型,对检索结果进行过滤、排序,选择更有针对性的信息,提高用户对检索的满意度。并尝试搭建个性化搜索引擎平台,将理论研究转化为实际产品。 一般而言,可以按照搜索引擎对网页索引技术不同,将其分为若干阶段1。 第一阶段的代表系统式1994年出现的Yahoo搜索引擎,当时处于搜索引擎的早期阶段,网页资源总量较低,爬虫技术尚不成熟,所以类似于Yahoo等搜索引擎广泛地采用人工标引等辅助技术来对网页内容进行标注,同时在检索的时候,也主要借助系统的信息检索算法,如词语文档频率等。 第二阶段的代表系统式1998年推出的Google搜索引擎。此时的互联网已经进入快速发展的新阶段,网页数量激增,所以Google推出了以网页超链接分析为基础的Pagerank算法,以此来完成网页权重的表示和检索结果的排序。 现在正处于搜索引擎的第三阶段,代表性的系统还没有出现,但是这一时期的搜索引擎广泛地采用了现代信息检索技术的发展成果,在用户接口,网页权重表示和结果排序技术方面取得了较大的完善和改进。其中,广受重视的就是个性化搜索引擎的出现和推广。1.2 相关技术框架 本系统基于目前比较流行和稳定的J2EE平台,采用了目前J2EE中流行的IOC,AOP模式,优秀的开源框架,包括Struts2,spring2.x,lucene2.x,以及Ehcache缓存系统和activemq1.5 JMS消息中间件。 Struts22框架是一个优秀的MVC表现层框架,它使得视图逻辑和业务逻辑相互分离,有利于系统的解耦,本系统采用Struts2可以做到搜索界面灵活替换,而不会影响到检索和查询逻辑的实现。 Spring3是J2EE非常流行的轻量级的IOC容器,它提供了丰富的企业级应用程序所需要的服务,管理了系统中建立索引和查询的无状态功能性组件的生命周期。 Lucene4框架是一款优秀的开源搜索引擎库,提供了搜索引擎具备的基础特性,简化了搜索引擎的设计。本系统采用Lucene框架对数据源进行索引,同时封装lucene对索引进行查询的操作。Ehcache5是一款开源的缓存系统,它支持集群缓存,提供了丰富的特性。本系统采用Ehcache缓存用户搜索的前30条记录,减少磁盘IO操作。ActiveMQ6是一个性能优良的JMS消息中间件,它提供了企业消息服务的支持。ActiveMQ对异构系统的整合发挥了关键的作用。本系统采用Activemq异步的处理用户查询的关键字,方便对用户的搜索行为进行统计。1.3本文的主要内容 本文主要基于如何搭建一个灵活的可扩展的搜索引擎平台,结合目前J2EE流行的Struts2,Spring,lucene框架,采用面向对象的设计方式,分别从系统层级结构,Ajax异步设计,JMS异步设计以及缓存设计四个方面描述了构建灵活性搜索引擎平台的过程。分层结构方面主要考虑了领域逻辑如何封装以及领域逻辑如何组织的问题,领域逻辑的封装采用pojo facade模式,领域逻辑的组织采用了领域模型模式,其中通过外观模式封装了建立索引和查询的逻辑,这样使得子系统更加容易使用。异步设计主要是为了提高系统的响应性,改善用户体验,其中采用ajax技术实现客户端浏览器与服务器端的通信,同时采用JMS实现服务器端的异步通信,其中Ajax采用开源的JavaScript框架JQuery实现,而服务器端的异步处理采用开源的JMS消息中间件ActiveMQ实现。 缓存方面,主要考虑全局的缓存,系统会根据用户搜索的关键字将相应的结果的前30条记录保存到缓存中,这样所有的用户都可以通过内存中的记录集来完成查询,而不需要每次请求都需要进行IO操作,显著的提高了查询性能。第2章 系统总体架构本系统采用Struts2.1,spring2.0,lucene 2.3分别作为表现层,应用层以及领域逻辑层的框架,系统总体上划分为四层,表现层,应用层,领域层以及数据源层,层与层之间保持高度的解耦,从而使得系统更容易扩展和维护。2.1 系统架构分析 统架构主要从以下几个方面进行考虑:1 业务逻辑如何组织关于业务逻辑的组织,考虑到系统在建立索引,提供查询,缓存设计,异步设计等方面逻辑非常的复杂,所以采用7一书讲的领域模型模式组织业务逻辑,通过面向对象的设计方法,组织查询模块和索引模块的逻辑。2 业务逻辑如何封装关于业务逻辑的封装,考虑到此系统不会利用分布式的特性,所以没有采用EJB Facade模式来封装业务逻辑,而是采用Pojo Facade.8 封装业务逻辑,并且采用Spring框架的IOC容器管理索引建立和查询的无状态的线程安全组件,这样使得组件之间通过接口通信,并且组件的生命周期和依赖关系也由Spring框架管理。3 数据源的异步处理响应速度是衡量一个搜索引擎系统的重要指标,当用户进行查询的时候,如何做到既能不影响响应的速度又可以对用户查询行为进行统计和分析,这个时候就需要通过异步的设计使得搜索行为的分析和检索过程松耦合,这样对搜索行为的分析就不会影响对搜索请求的相应,从而保证了系统的可用性。本系统采用开源的消息中间件ActiveMQ实现异步的数据源处理,当用户搜索的时候,通过ActiveMQ发送用户搜索的关键字给服务器端处理程序进行搜索行为分析,而不会影响到响应时间。4 系统缓存设计搜索引擎面临的一个主要问题就是如何应对高并发的搜索请求,如果不对搜索的结果进行处理,那么当并发访问量很大的时候就会造成非常频繁的IO操作,而这些IO操作又是非常耗费性能的,所以为了减小IO操作的次数,搜索引擎一般都会对搜索结果进行一定的缓存。本系统采用了开源的缓存框架Ehcache作为底层的缓存系统,每次缓存结果的前30条记录,当用户在查看前30条记录的时候不需要进行IO操作,只有当查看超过30条的数据时才会进行真正的索引查询操作。以上从四个方面阐述了本搜索引擎系统中所设计到的技术框架以及系统架构时考虑的问题,其中系统的总体架构如图2-1所示: 图2-1系统架构图2.2 表现层本搜索引擎系统表现层采用经典的MVC Struts2框架,负责查询请求的处理以及搜索结果界面的展现。采用MVC框架以后,搜索界面视图以及查询结果视图和业务逻辑分离,这样界面的设计与索引建立和查询逻辑相互分之间松耦合,从而使得界面的展现和业务逻辑能独立的发展。表现层调用应用层的Facade来完成对客户端查询请求的处理,表现层Action不实现任何逻辑,也不包含任何与逻辑有关系的的状态,它只是负责将查询请求委托给应用层外观来处理以及对一些表单进行简单的验证。 2.2.1 Struts2框架1 MVC模式 MVC9模式是Model - View - controller模式的简称。其中在Java web开发当中,MVC经历了Model1和Model2两个阶段。 图2-2 MVC model1结构图 所谓Model 1就是JSP大行其道的时代,在Model 1模式下,整个Web应用几乎全部由JSP页面组成,JSP页面接收处理客户端请求,对请求处理后直接做出响应。用少量的JavaBean来处理数据库连接、数据库访问等操作。 Model 1模式的实现比较简单,适用于快速开发小规模项目。但从工程化的角度看,它的局限性非常明显:JSP页面身兼View和Controller两种角色,将控制逻辑和表现逻辑混杂在一起,从而导致代码的重用性非常低,增加了应用的扩展性和维护的难度,Model1模式如图2-2所示。 图2-3 MVC Model2结构图 Model 2架构中,Servlet作为前端控制器,负责接收客户端发送的请求,在Servlet中只包含控制逻辑和简单的前端处理;然后,调用后端JavaBean来完成实际的逻辑处理,最后转发到相应的JSP页面处理显示逻辑。Model2带来的好处就是视图展现于具体的业务逻辑相分离,这样视图和业务逻辑可以独立的发展,互相不影响,更加细化了界面设计人员和编程人员的分工,Model2模式结构图如2-3所示: Struts2框架是Model2模式的具体实现,它是基于webwork发展起来的,它有设计灵活的拦截器功能,从而使得应用程序更好的分离关注点,更好的划分职责。Struts2的体系结构如图2-4所示:图2-4 Struts2结构图Struts2的请求处理流程如下:1 当容器接收到一个请求,将其转发给Struts2应用程序。2 容器根据Struts2应用程序的配置,添加相应的过滤器给当前的请求。3 FilterDispatcher接受到请求,然后根据ActionMapper来查看具体对应的Action。4 如果找到了ActionMapper,那么就将请求转发给ActionProxy来处理,ActionProxy根据Configuration Manager解析struts.xml,然后调用XWork中的ActionInvocation。5 ActionInvaction调用相应的拦截器,并执行Action.6 Action执行完毕后,调用相应的Result.7 结果执行完后,以相反的顺序依次调用拦截器,调用完成后,整个请求处理结束。2.2.2 界面设计 搜索引擎一般的处理流程是用户输入关键字,浏览器通过http协议将关键字发送给服务器端处理程序,服务器端处理程序根据用户输入的关键字在索引中查找,最终将查询结构返回给表现层,表现层然后根据结构渲染界面视图,最终将视图发送到浏览器。1 界面设计 搜索引擎一般都要有一个主搜索界面,这个界面负责接收用户的输入,然后浏览器根据用户输入的关键字,发送请求给服务器端处理程序。本系统的搜索主界面采用JSP模板视图以及Javascript来完成,其中包括一个提交表单,这个表单负责获取用户输入的关键字并将表单中的数据发送给服务器,最终结果如图2-5所示:图2-5 搜索主界面当服务器端处理程序处理完用户的查询以后,应用程序要返回结果集给表现层,表现层最终根据搜索结果来渲染视图,然后将视图发送到客户端浏览器,本系统中的结果界面采用JSP模板视图完成,最终结果如图2-6所示: 图2-6 搜索结果界面2.2.3 查询模块设计查询模块负责响应用户的检索请求,当用户在搜索主界面输入查询关键查询的时候,浏览器通过http请求将查询关键字发送给表现层的控制器QueryAction类,此类负责调用IQuery接口检索结果,并且同时要将查询关键字通过JMS异步地发送给消息接受者,其中检索请求的响应顺序图如图2-7所示:图 2-7查询模块顺序图QueryBase类 QueryBase类继承自ActionSupport类,它封装了按照标题搜索和按照全文搜索的IQuery接口,同时它也封装了用于异步处理查询关键字的MessageSender接口,QueryAction类QueryAction类继承QueryBase类,它调用QueryBase类的initQuery方法初始化标题搜索和全文搜索的IQuery接口的实现类。它有两个方法,其中execute方法负责接受用户查询的请求,并将查询请求转发给IQuery接口,最终放回查询结果,getNextPageWithNumber方法负责分页查询搜索结果,它根据查询主界面的隐藏表单域来完成页号的跟踪以及查询结果的返回。MessageSender类 MessageSender类封装了发送JMS消息的逻辑,当用户搜索的时候,此类负责异步的将查询关键字发送给指定的接受者。IQuery接口IQuery接口封装了检索的逻辑,QueryAction委托查询给IQuery实现类来完成检索,然后IQuery接口的实现类负责返回结果给QueryAction类。具体的类图如图2-8所示:图2-8 表现层类图2.3 应用层应用层封装了索引以及查询的逻辑,提供了粗粒度的接口给表现层使用。应用层负责处理事务以及安全方面的问题。应用层定义了搜索引擎所要提供的接口,并且指挥具有丰富含义的领域层对象来解决问题,这个层对其它系统的应用层进行交互非常的必要,需要保持精炼。应用层不包括处理业务规则和知识,只是给下层中相互协作的领域对象协调任务,委托工作,在这个层次中不反应业务情况的状态,只能反应用户或者程序的任务进度的状态。2.3.1 Spring框架Spring是目前比较流行的IOC容器,是为了解决企业应用程序开发复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。1 IOC模式IOC10模式是 Inverse of control(控制反转)的简称,它体现了好莱坞法则:不要主动调用我,我会调用你。在应用程序中,各种类之间会存在负责的依赖关系,如何处理好这些依赖关系就是IOC模式所解决的问题。本搜索引擎系统采用IOC容器管理了建立索引以及查询组件的生命周期以及它们之间的依赖关系,使得系统更加松耦合,高内聚。IOC的实现策略可以分为依赖注入和依赖查找,如图2-9所示:图2-9 IOC模式实现策略从上图可以看出IOC模式主要可以通过以下两种方式来实现:l 依赖查找。容器提供回调接口以及上线问环境给组件,组件通过容器暴漏的API(J2EE目前来说就是JNDI API)来进行所需资源的查找,这个时候的控制反转也仅仅体现在容器提供的回调方法上,当组件需要其他组件的时候,通过回调接口查找,容器再调用相应的回调方法使得组件获得所需的资源。EJB就是采取了此种方式的IOC实现。l 依赖注入。依赖注入不要求组件主动的去定位查询,相反容器会根据组件自身暴漏的方法来将组建所需的资源注入进去。依赖注入(DI)通常又可以通过三种方式来实现: 接口注入,此种情况下要求组件实现特定的接口,这样容器在实例化组件的时候会根据组件实现的接口来按需注入依赖资源。 setter注入,此方式是通过组件自身暴漏的set方法来注入所需要的资源。 构造器注入,此方式通过组件的构造器来注入所需的资源。 2 AOP模式 AOP的全称是(Aspect oriented programming)面向方面编程,是近年来越来越流行的编程模式。AOP的思想与OOP不同,它作为对OOP的强有力的补充,用AOP的观点来看,一个系统被分解为不同的关注点(Concern)或者也可以称之为切面(Aspect)。Spring 框架是一个分层架构,由 7 个定义良好的模块组成。Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 bean 的方式,如图 2-10 所示:图2-10 Spring框架架构图组成 Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下:1 核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转 (IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。Spring 上下文:Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。2 Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何对象支持 AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中。 Spring 框架的功能可以用在任何 J2EE 服务器中,大多数功能也适用于不受管理的环境。Spring 的核心要点是:支持不绑定到特定 J2EE 服务的可重用业务和数据访问对象。毫无疑问,这样的对象可以在不同 J2EE 环境 (Web 或 EJB)、独立应用程序、测试环境之间重用。2.3.2索引模块设计 搜索引擎系统索引模块负责对爬虫搜集到的数据源进行索引处理,此模块的设计采用经典的Facade设计模式,索引建立模块封装了搜索引擎领域层的逻辑,提供了粗粒度的索引接口给客户端调用。1 Facade模式的应用Facade (外观)11模式为子系统提供一个一致的外观(界面),它定义了一个高层的接口,这个接口使得子系统更加容易使用。Facade模式将一个复杂的子系统接口简化,并且将对子系统的访问控制在了Facade类中,这样减低了代码的重复,并且提供了一个子系统的全局访问点,这样容易进行访问控制。在应用层索引建立模块中,IndexCreateService接口是一个外观接口,它封装了整个索引建立复杂的逻辑,使得此模块的使用更加容易。具体的类图如图2-11所示:图2-11 应用层索引模块类图 2 接口和类的设计IndexCreateService接口此接口负责封装索引建立的逻辑,它提供了3个索引建立的方法。无参数的createIndex方法采用系统默认配置的路径来存放索引,这个默认路径是在Spring配置文件中进行配置。一个参数的createIndex方法,此方法将会创建索引到参数指定的路径。两个参数的createIndex方法,一个参数是索引存放的路径,另外一个是待建立索引文件的目录。DefaultCreateService类DefaultCreateService类实现了IndexCreateService接口,它实现了IndexCreateService接口定义的索引建立的方法,其中索引建立模块的类图如图2-12所示: 图 2-12 索引子系统应用层类图3 索引模块流程分析 搜索引擎系统启动以后,系统管理员设置索引存放的路径以及待索引的文件路径,然后系统调用IndexCreateService接口进行索引建立操作,DefaultIndexCreateService类负责检查目录是否存,如果存在就调用领域层的IndexCreator接口创建索引,其中整个序列图如图2-13所示:图2-13索引模块顺序图2.3.3查询模块设计搜索引擎查询模块主要负责响应用户的查询请求,应用层查询模块负责对用户输入的关键字进行分词处理,然后将分词后的结果构成Lucene的Query对象,最后将Query对象发送给领域层进行检索。1 外观模式的应用因为查询模块的逻辑非常复杂,所以需要一个外观类封装查询逻辑,这样方便查询模块的使用。在查询模块中,IQuery是一个外观接口,它负责接收表现层的请求,并封装具体的查询逻辑根据关键字创建lucene的Query对象,然后将Query对象传递给领域层进行检索。具体的类图如图2-14所示:图2-14所示2 查询模块接口和类设计IQuery接口IQuery接口封装了查询子系统,它提供了query方法,此方法接受用户输入的查询关键字,然后委托给领域层的ISearcher接口实现类完成查询。DefaultQuery类DefaultQuery实现了IQuery接口,实现了IQuery接口的query方法。SearchResult接口SearchResult接口封装了查询结果,提供了根据分页查询接口的方法。DefaultSearchResult类DefaultSearchResult类实现了SearchResult接口,实现了分页查询的方法。其中查询子系统的领域层类图如图2-15所示:图 2-15 查询子系统应用层类图2.4领域层领域层负责实现搜索引擎建立索引和查询逻辑,以及一些领域中所设计的规则,领域层是整个搜索引擎系统的核心,建立索引以及查询的操作由领域层的组件完成,其中领域层采用Lucene框架作为底层支持框架。索引建立模块主要分析了索引建立的过程,以及如何通过面向对象的设计方式来设计系统索引建立的组件,以及如何采用设计模式来解耦组件之间的联系,从而使得索引建立模块更加具有扩展性和维护性。 查询模块主要分析了查询的过程,以及如何通过Lucene对索引进行查询,在设计中采用了装饰器设计模式,使得搜索结构可以动态的添加缓存功能。2.4.1 lucene框架1 Lucene 介绍Lucene 是一个基于 Java 的全文信息检索工具包,它不是一个完整的搜索应用程序,而是为你的应用程序提供索引和搜索功能。Lucene 目前是 Apache Jakarta 家族中的一个开源项目。也是目前最为流行的基于 Java 开源全文检索工具包。目前已经有很多应用程序的搜索功能是基于 Lucene 的,比如 Eclipse 的帮助系统的搜索功能。Lucene 能够为文本类型的数据建立索引,所以你只要能把你要索引的数据格式转化的文本的,Lucene 就能对你的文档进行索引和搜索。比如你要对一些 HTML 文档,PDF 文档进行索引的话你就首先需要把 HTML 文档和 PDF 文档转化成文本格式的,然后将转化后的内容交给 Lucene 进行索引,然后把创建好的索引文件保存到磁盘或者内存中,最后根据用户输入的查询条件在索引文件上进行查询。不指定要索引的文档的格式也使 Lucene 能够几乎适用于所有的搜索应用程序。搜索应用程序和 Lucene 之间的关系如下图2-16所示:图2-16应用程序与lucene关系图2 Lucene功能逻辑分析Lucene从逻辑上划分可以分为索引建立和查询两个部分,索引建立主要是通过分析器对文档进行分词处理并将分词后的词条建立索引,查询部分主要是根据对用户的输入进行分词,然后用分词后的此条对索引树进行查询。Lucene功能逻辑图如图2-17所示:图2-17 lucene功能逻辑图3 软件包分析 Package: org.apache.lucene.document 这个包提供了一些为封装要索引的文档所需要的类,比如 Document, Field。这样,每一个文档最终被封装成了一个 Document 对象。 Package: org.apache.lucene.Analysis 这个包主要功能是对文档进行分词,因为文档在建立索引之前必须要进行分词,所以这个包的作用可以看成是为建立索引做准备工作。 Package: org.apache.lucene.index 这个包提供了一些类来协助创建索引以及对创建好的索引进行更新。这里面有两个基础的类:IndexWriter 和 IndexReader,其中 IndexWriter 是用来创建索引并添加文档到索引中的,IndexReader 是用来删除索引中的文档的。 Package: org.apache.lucene.search 这个包提供了对在建立好的索引上进行搜索所需要的类。比如 IndexSearcher 和 Hits, IndexSearcher 定义了在指定的索引上进行搜索的方法,Hits 用来保存搜索得到的结果。4 常用类分析 Document Document 是用来描述文档的,这里的文档可以指一个 HTML 页面,一封电子邮件,或者是一个文本文件。一个 Document 对象由多个 Field 对象组成的。可以把一个 Document 对象想象成数据库中的一个记录,而每个 Field 对象就是记录的一个字段。 Field Field 对象是用来描述一个文档的某个属性的,比如一封电子邮件的标题和内容可以用两个 Field 对象分别描述。 Analyzer 在一个文档被索引之前,首先需要对文档内容进行分词处理,这部分工作就是由 Analyzer 来做的。Analyzer 类是一个抽象类,它有多个实现。针对不同的语言和应用需要选择适合的 Analyzer。Analyzer 把分词后的内容交给 IndexWriter 来建立索引。 IndexWriter IndexWriter 是 Lucene 用来创建索引的一个核心的类,他的作用是把一个个的 Document 对象加到索引中来。 Directory 这个类代表了 Lucene 的索引的存储的位置,这是一个抽象类,它目前有两个实现,第一个是 FSDirectory,它表示一个存储在文件系统中的索引的位置。第二个是 RAMDirectory,它表示一个存储在内存当中的索引的位置。 Query 这是一个抽象类,他有多个实现,比如TermQuery, BooleanQuery, PrefixQuery. 这个类的目的是把用户输入的查询字符串封装成Lucene能够识别的Query。 Term Term是搜索的基本单位,一个Term对象有两个String类型的域组成。生成一个Term对象可以有如下一条语句来完成:Term term = new Term(“fieldName”,”queryWord”); 其中第一个参数代表了要在文档的哪一个Field上进行查找,第二个参数代表了要查询的关键词。 TermQuery TermQuery是抽象类Query的一个子类,它同时也是Lucene支持的最为基本的一个查询类。生成一个TermQuery对象由如下语句完成: TermQuery termQuery = new TermQuery(new Term(“fieldName”,”queryWord”); 它的构造函数只接受一个参数,那就是一个Term对象。 IndexSearcher IndexSearcher是用来在建立好的索引上进行搜索的。它只能以只读的方式打开一个索引,所以可以有多个IndexSearcher的实例在一个索引上进行操作。 Hits Hits是用来保存搜索的结果的,通过Hits可以迭代搜索结果。2.4.2 索引模块设计领域层12是整个系统的核心,领域层实现了建立索引子系统和查询子系统的所有领域逻辑。下面分别描述反向索引,索引建立过程以及索引模块接口和类设计。1 反向索引分析 索引是现代搜索引擎的核心,建立索引的过程就是把源数据处理成非常方便查询的索引文件的过程。为什么索引这么重要呢,试想你现在要在大量的文档中搜索含有某个关键词的文档,那么如果不建立索引的话你就需要把这些文档顺序的读入内存,然后检查这个文章中是不是含有要查找的关键词,这样的话就会耗费非常多的时间,想想搜索引擎可是在毫秒级的时间内查找出要搜索的结果的。这就是由于建立了索引的原因,你可以把索引想象成这样一种数据结构,他能够使你快速的随机访问存储在索引中的关键词,进而找到该关键词所关联的文档。Lucene 采用的是一种称为反向索引(inverted index)的机制。 反向索引就是说维护了一个词/短语表,对于这个表中的每个词/短语,都有一个链表描述了有哪些文档包含了这个词/短语。这样在用户输入查询条件的时候,就能非常快的得到搜索结果。2 索引建立过程分析第一步:系统设计者定义到库中文档的结构,比如需要把网站内容加载到全文检索库,让用户通过“站内检索”搜索到相关的网页内容。入库文档结构与关系型数据库中的表结构类似,每个入库的文档由多个字段构成,假设这里需要入库的网站内容包括如下字段:文章标题、作者、发布时间、原文链接、正文内容(一般作为网页快照)。第二步:第一步得到的抽象文档(DOCUMENT)在真正入库前需要经过切词(或分词)索引,切词的规则由语言分析器(ANALYZER)完成。第三步:切分后的“单词”被注册到索引树上,供查询时用,另外也需要也其它不需要索引的内容入库,所有这些是文件操作均由STORAGE完成。3 索引模块接口和类设计IndexCreator接口IndexCreator接口定义了创建索引的方法,同时可以指定数据存放的路径和索引文件存放的路径。DefaultIndexCreator类DefaultIndexCreator实现了IndexCreator接口,实现了具体的创建索引的逻辑,它负责设置具体的索引文件存放路径和底层带索引文件存放路径。IndexWriterWrapper接口Inde
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年乡镇退役军人服务站招聘考试热点分析
- 2025年农村医疗保障员招聘面试模拟题及答案详解
- 2025年人力资源管理实战模拟题及案例分析教程
- 2025年中成药制药生产线合作协议书
- 2025年市政工程项目建议书
- 2025年镍压延加工材项目发展计划
- 福建省莆田市某校2024-2025学年一年级上学期第一次月考数学试题
- 心内科考试试题及答案
- 抗焦虑失眠药课件
- 抗心律失常课件
- 2025年重庆市永川区社区工作者招聘考试笔试试题(含答案)
- 电气自动化基础知识课件
- 家畜繁殖员上岗证考试题库及答案
- DG-TJ08-2097-2025 地下管线探测技术标准
- 数学鲁教版九年级上学期分层计划
- 甘肃省合理用药管理办法
- 新解读《建筑工程消防施工质量验收规范 DBJ-T 15-248-2022》
- 第十三章 三角形 单元测试 2025-2026学年人教版(2024)八年级数学上册
- 女生的青春期健康教育
- 以《论语》为翼:高中生价值观构建的教学实践与探索
- 妇产科电子护理文书书写规范
评论
0/150
提交评论