基于Lucene的企业级搜索引擎的设计与实现
北京易维博科科技有限公司 李天一
【摘要】 针对企业文档信息资源丰富而又缺乏有效搜索工具的问题,提出构建企业级搜索引擎。首先分析企业搜索引擎应具有的功能和总体架构,在具体实现过程中,对Lucene索引器进行了深入研究;在抓取器的体系设计中,采用了插件设计思想,来对不同的文档类型解析、抽取;在任务调度方面,实现了一套多任务并行的调度机制;在用户接口设计上,采用了Yui-ext组件和DWR远程对象调用框架,实现了Web方式下的异步通信,提升了用户体验。
【关键字】 搜索引擎 Lucene 插件 抓取器
【Abstract】 Document information on enterprises and abundant resources lack of effective search tool, the proposal of building enterprise search engine. First Analysis of Enterprise Search engines shall have the function and the overall framework of the realization process, right Lucene index for the in-depth research. Grasp of the system design, the use of plug-in design, to document the different types of analysis, extraction; in task scheduling, the realization of a set of parallel multi-task scheduling mechanism; In user interface design, the use of Yui - ext components and DWR remote object invocations framework, Implementation of the Web asynchronous communication, enhance the user experience.
【Key Words】 Search Engine Lucene Plug-in Crawler
1 研究背景与内容
1.1 研究背景
随着计算机技术的发展和企业内部信息化需求的不断增长,现有的信息基础设施和信息共享逐渐暴露出了诸多问题。企业往往在海量的信息面前束手无策,一方面是海量数据白白占据企业内的存储空间得不到应用,一方面是为了寻找决策用数据,又投入大量资源,造成两方面的浪费。其原因是缺乏统一、快捷的操作方式——企业搜索引擎。
1.2 研究内容
经过对企业级搜索引擎系统的现状研究,并结合国家地震局的实际项目需求设计了系统的总体架构。该系统分为抓取器、分词器、索引器、搜索器、用户接口五部分,在抓取器部分深入研究了不同数据对象的插件体系结构;在索引器、搜索器部分深入研究了Lucene;在分词方面改进了基于词典的最大长度匹配分词算法;在用户接口部分采用了面向对象方式的三层结构对数据源管理、任务调度、插件管理、词库管理、统计管理、日志管理以及用户搜索等模块进行了实现。
2 实现方法
在系统的分析设计阶段,采用Rational Rose 来对系统进行UML建模。在编码阶段,以Java为开发环境,实现跨平台性,以J2ee为开发标准将系统组件化开发。在数据库设计上,采用Hibernate中间件,来实现面向对象语言与关系型数据库的映射,并实现了数据库平台的无关性。
3 系统总体设计
3.1系统功能结构总体设计
本课题提出的这套针对企业内部多种数据源及外部行业网站进行综合搜索,便于网络用户检索行业信息,以协助其它信息系统的应用。此搜索引擎系统建的总体架构如图3-1所示:
图3-1 企业级搜索引擎的总体架构
对于不同数据源的数据需采用自动采集引擎,将数据信息采集到本地机器,并通过格式转化、消重处理,将处理后的信息存入索引库内。
3.2 系统技术架构设计
在系统编码过程中,充分考虑了代码的可重用性、扩展性、易维护性。
1) 代码的可重用性:成熟组件的应用与新组件的开发是实现代码可重用的主要实现方式。在系统的程序结构上,我们抽取出了系统共有的如用户管理、权限管理、日志管理、配置管理等模块放在System包下,把如图片处理、字符编码、文件上传、数据库连接池等放在util包下。这样很容易的开发移植。
2) 系统的可扩展性:大量接口、Web Service的应用,为系统内部功能的扩展,与外部系统数据交互与集成提供了可能性。
3) 系统的易维护性:三层设计模式,即表示层、业务层、持久层使代码层次明显,模块间具有较低的偶合,给代码维护带了了方便。
4 关键技术
按照系统的五部分功能,将系统分为两个工程进行开发,一个工程主要是针对抓取器进行开发,主要包括Web页面链接分析、文件目录递归遍历、基于词库的中文分词、多不同数据对象的解析如Word,Pdf、索引的建立等等。该部分实现一个可独立运行的应用程序,并最终以jar包的形式发布在Web工程下。另一个工程是主要是针对用户接口进行开发的web工程,该部分主要负责管理员对搜索任务的定制、采集监控、辞典维护、日志维护、用户搜索等等,在任务调度过程中将调用抓取器。开发过程中的关键技术如下:
4.1 基于Lucene的索引功能模型
Lucene是一个高性能、可伸缩的信息搜索(IR)库。它可以为应用程序添加索引和搜索能力。把复杂的索引和搜索实现隐藏在一组简单易用的API之后。在系统中可以把Lucene认为成一层,应用程序位于它之上,如图4-1。从图中我们可以看到Lucene专注于两项工作,一是索引,它接收的是一个纯文本的二进制字节流,每个域有是否索引、是否存储、是否分词三个参数;二是搜索,它提供了丰富的搜索接口,如短语查询(PhraseQuery)、模糊查询(FuzzyQuery)、前缀匹配(PrefixQuery)、区间查询(RangeQuery)、条件过滤(FilteredQuery)、逻辑运算符(BooleanQuery)等等。
图4-1 一个集成Lucene的典型应用
4.2 简化的最大长度匹配分词算法
设定:Ci表示一个字符。这样一个句子就可以表示成Ci的序列,即C1C2...Ci...Cn。
装载词典:把n(n > 2)词本身装载到内存中,然后在把C1C2,C1C2C3,...,一直到C1C2...Cn-1这n-1个字串也装载到内存中 。
使用一个四字的词如一举成名来演示一下装载的过程。首先将一举成名装载到内存中,之后在将一举、一举成装载到内存中。
为提高算法的效率这里使用了Singleton模式(单态模式),这保证词典只被装载一次。另外,还专门选择了TreeMap这个数据结构 。
算法的具体描述如下:
⑴ 使用一个变量word来保存切分过程中的字符序列
⑵ 开始扫描句子C1C2...Ci...Cn,取出字符Ci
⑶ 如果word的长度为0,那么将Ci附加到word中,将i增1,返回到步骤 ⑵
⑷ 如果word的长度大于0,那么将Ci和word连接到一起,并将连接后的字符序列与词典匹配(装载之后的形式)
⑸ 如果匹配成功,则将Ci附加到word中同时将i增1,返回到步骤 ⑵
⑹ 如果匹配不成功,说明word中的字符序列是可匹配的最长的词,进行切分,同时将word清空(即长度为0)但保持i不变,返回到步骤 ⑵
⑺ 当取完句子中的所有字符时结束
4.3 抓取器的插件体系设计
搜索对象包括结构化的信息和非结构化信息,包括格式化文本,如DOC文件、XLS文件、PDF文件及XML文件等,为了使系统具有较强的扩展性和极强的适应性,系统中采用了标准的插件设计思想,实现了对不同数据对象解析插件的即插即用。其体系结构如下:
图4-2 多文档处理插件的体系结构
当系统启动抓取器时从DocumentFactory处产生一系列初始化行为。其中插件部分是外部的Jar包,每个插件解析固定的一个或几个文件类型。在解析文件时,根据不同的文件类型寻找不同的处理插件,再将字节流传给该插件处理器。我们可以很容易的想到,主系统与插件是毫不相关的,插件的有无并不影响主系统的正常运行。
4.4 DWR与YUI-EXT的结合应用。
异步通信、良好的用户体验、Html页面中封装对象是DWR与YUI-EXT结合的产生完美效果。YUI-EXT是一个使用JavaScrīpt编写的工具和控件库。它利用DOM脚本,DHTML和AJAX来构造具有丰富交互功能的Web程序。Yui也包含几个核心的CSS文件。YUI-Ext是一套js编写的客户端脚本组件,它包括对话框、按钮、数据网格、布局窗口、标签、树、菜单等等一系列显示组件。
4-3 dwr的工作原理
DWR(Direct Web Remoting)是一个Web远程调用框架。利用这个框架可以让AJAX开发变得很简单。利用DWR可以在客户端利用JavaScript直接调用服务端的Java方法并把返回值给JavaScript就好像直接本地客户端调用一样(DWR根据Java类来动态生成JavaScript代码)。它的最新版本DWR添加许多特性,如:支持Dom Trees的自动配置,支持Spring(JavaScript远程调用Spring Bean),更好的浏览器支持,还支持一个可选的Commons-logging日记操作。
从图我们可以看出,DWR主要是Java与JavaScript的一个中间件,是客户端与服务器端通信中枢,可以把java中的数据类型(如对象,LinkList,Map等等)直接传递给JavaScript,Yui-ext是由JavaScript写的界面组建,可以直接接收这些数据类型在做相应处理并将其显示给用户。
5 运行效果
5.1 本地文件系统数据抓取控制台效果
从图中我们可以看到多文档处理插件在处理不同数据对象的过程。
5.2任务调度的运行效果
从任务列表中加入任务
网页搜索运行效果
图片搜索效果