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

本文针对企业内部信息资源丰富但缺乏高效搜索工具的问题,提出一种基于Lucene的企业级搜索引擎设计方案。系统具备自动采集、中文分词、多任务调度等功能,采用插件化设计提升扩展性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

基于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页面链接分析、文件目录递归遍历、基于词库的中文分词、多不同数据对象的解析如WordPdf、索引的建立等等。该部分实现一个可独立运行的应用程序,并最终以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

装载词典:把nn > 2词本身装载到内存中,然后在把C1C2C1C2C3...,一直到C1C2...Cn-1n-1个字串也装载到内存中 。

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

为提高算法的效率这里使用了Singleton模式(单态模式),这保证词典只被装载一次。另外,还专门选择了TreeMap这个数据结构 。

算法的具体描述如下:

使用一个变量word来保存切分过程中的字符序列

开始扫描句子C1C2...Ci...Cn,取出字符Ci

如果word的长度为0,那么将Ci附加到word中,将i1,返回到步骤

如果word的长度大于0,那么将Ciword连接到一起,并将连接后的字符序列与词典匹配(装载之后的形式)

如果匹配成功,则将Ci附加到word中同时将i1,返回到步骤

如果匹配不成功,说明word中的字符序列是可匹配的最长的词,进行切分,同时将word清空(即长度为0)但保持i不变,返回到步骤

当取完句子中的所有字符时结束

4.3       抓取器的插件体系设计

搜索对象包括结构化的信息和非结构化信息,包括格式化文本,如DOC文件、XLS文件、PDF文件及XML文件等,为了使系统具有较强的扩展性和极强的适应性,系统中采用了标准的插件设计思想,实现了对不同数据对象解析插件的即插即用。其体系结构如下:

4-2  多文档处理插件的体系结构

当系统启动抓取器时从DocumentFactory处产生一系列初始化行为。其中插件部分是外部的Jar包,每个插件解析固定的一个或几个文件类型。在解析文件时,根据不同的文件类型寻找不同的处理插件,再将字节流传给该插件处理器。我们可以很容易的想到,主系统与插件是毫不相关的,插件的有无并不影响主系统的正常运行。

4.4       DWRYUI-EXT的结合应用。

异步通信、良好的用户体验、Html页面中封装对象是DWRYUI-EXT结合的产生完美效果。YUI-EXT是一个使用JavaScrīpt编写的工具和控件库。它利用DOM脚本,DHTMLAJAX来构造具有丰富交互功能的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主要是JavaJavaScript的一个中间件,是客户端与服务器端通信中枢,可以把java中的数据类型(如对象,LinkListMap等等)直接传递给JavaScriptYui-ext是由JavaScript写的界面组建,可以直接接收这些数据类型在做相应处理并将其显示给用户。

5  运行效果


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

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

5.2任务调度的运行效果

 

从任务列表中加入任务

网页搜索运行效果

 

图片搜索效果


浅谈网络搜索引擎的实现 知识管理系统网络搜索模块开发实践交流 功能需求 可自定义要搜索的网站列表(以下简称目标列表) 可对目标列表网站的网页内容进行检索 可对目标列表网站的网页内容进行自动分类处理 可自定义更新周期及一些相关性能参数 系统主要功能模块 网络蜘蛛 采集、解析并保存目标列表网站的内容(网页) 全文索引/检索 为目标列表网站内容建立索引 提供内容的全文检索 自动分类 对目标列表网站内容进行分类 基本流程 网络蜘蛛 功能概要 目标文档地址队列 w/r 目标文档(网页)获取 目标文档保存 文档解析并得到新的目标文档地址队列和文档正文内容 网络蜘蛛 当前版本的实现 多线程 Apache HttpClient Hsql HTML Parser 全文索引/搜索 什么是全文索引? 为了快速搜索大量的文本文件 为一本书建立关键词的索引“书签” 什么是全文搜索? 在索引中查找关键字的过程,找到关键字在哪些地方出现 全文索引/搜索 Lucene简介 高性能、可扩展的信息检索工具库 为应用程序添加索引/搜索功能 一个典型的应用: 全文索引/搜索 全文索引/搜索 Lucene索引过程的核心类 IndexWriter :提供对索引的写入操作 Directory:描述了索引存放的位置 Analyzer:对文本进行分析,提取词汇(token),剔除无用的信息 Document:虚拟的文档 Field:每个Document包含一个或多个不同命名的Field,每个Field对应一段数据,这些数据在搜索过程中可能会被查询或在索引中被检索 全文索引/搜索 Lucene索引代码示例: Directory dir = FSDirectory.getDirectory(indexDir); Analyzer anlyzer = new SimpleAnalyzer(); IndexWriter writer = new IndexWriter(dir, analyzer, true); Document doc = new Document(); doc.add(Field.Keyword(“id”, “1000”); doc.add(Field.UnIndexed(“name”, “Yao Ming”); doc.add(Field.UnStored(“intro”, “Yao Ming is a player of Houseton Rockets.”); writer.addDocument(doc); writer.close(); 全文索引/搜索 Lucene搜索过程的核心类 IndexSearcher:用于搜索IndexWriter创建的索引 Term:用于搜索的一个基本单元包括了一对字符串元素,与Field相对应 Query :抽象的查询类 TermQuery:最基本的查询类型,用来匹配特定Field中包含特定值的文档 Hits:存放有序搜索结果指针的简单容器 全文索引/搜索 Lucene搜索代码示例: IndexSearcher searcher = new IndexSearcher(directory); Term t = new Term(“intro”, “Yao”); Query query = new TermQuery(t); Hits hits = searcher.search(query); assertEquals(“JUnit test”, 1, hits.length()); Lucene的线程安全性 不允许使用多个IndexWriter或IndexReader实例同时对一个索引进行修改 IndexWriter和IndexReader是线程安全的,可以被多线程共享 全文索引/搜索 中文分词器 最大匹配法(机械分词):按照一定的策略将待分析的汉字串与一个“充分大的”机器词典中的词条进行配,若在词典中找到某个字符串,则匹配成功。 二元分词 一元分词 自动分类 向量距离分类算法 根据算术平均,为每类文本集生成一个代表该类的特征向量 提取待分类文本的特征向量 计算该向量与每类特征向量之间的相似度 判定文本属于与文本距离最近相似度最大的类别 自动分类 相似度计算公式: 系统基础类图 Road map 自动分类学习 中文分词算法改进 支持多种格式的文档(doc, pdf…) 海量网站搜索的支持(分布式处理) 系统框架的优化和迭代改进
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值