目录

基于Lucene的企业级搜索引擎的

目录

基于Lucene的企业级搜索引擎的

基于 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

所示:

https://p-blog.csdn.net/images/p_blog_csdn_net/shuangpinglee/整体架构.png

图 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

)

等等。

https://p-blog.csdn.net/images/p_blog_csdn_net/shuangpinglee/lucene.png

图 4-1

一个集成 Lucene 的典型应用

4.2

简化的最大长度匹配分词算法

设定:

Ci

表示一个字符。这样一个句子就可以表示成

Ci

的序列,即

C 1C 2…Ci…Cn

装载词典:把

n

n > 2

词本身装载到内存中,然后在把

C 1C 2

C 1C 2C 3

,一直到

C 1C 2…Cn-1

n-1

个字串也装载到内存中 。

使用一个四字的词如一举成名来演示一下装载的过程。首先将一举成名装载到内存中,之后在将一举、一举成装载到内存中。

为提高算法的效率这里使用了

Singleton

模式(单态模式),这保证词典只被装载一次。另外,还专门选择了

TreeMap

这个数据结构 。

算法的具体描述如下:

使用一个变量

word

来保存切分过程中的字符序列

开始扫描句子

C 1C 2…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 文件等,为了使系统具有较强的扩展性和极强的适应性,系统中采用了标准的插件设计思想,实现了对不同数据对象解析插件的即插即用。其体系结构如下:

https://p-blog.csdn.net/images/p_blog_csdn_net/shuangpinglee/plugin.png

图 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 编写的客户端脚本组件,它包括对话框、按钮、数据网格、布局窗口、标签、树、菜单等等一系列显示组件。

https://p-blog.csdn.net/images/p_blog_csdn_net/shuangpinglee/dwr.png

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

本地文件系统数据抓取控制台效果

从图中我们可以看到多文档处理插件在处理不同数据对象的过程。

https://p-blog.csdn.net/images/p_blog_csdn_net/shuangpinglee/效果.png

5.2

任务调度的运行效果

https://p-blog.csdn.net/images/p_blog_csdn_net/shuangpinglee/效果2.png

从任务列表中加入任务

https://p-blog.csdn.net/images/p_blog_csdn_net/shuangpinglee/任务.png

网页搜索运行效果

https://p-blog.csdn.net/images/p_blog_csdn_net/shuangpinglee/网页.png

图片搜索效果

https://p-blog.csdn.net/images/p_blog_csdn_net/shuangpinglee/tupian.png