—94—一种基于Lucene 的中文全文检索系统苏潭英1,郭宪勇2,金 鑫3(1. 解放军信息工程大学电子技术学院,郑州 450004;2. 北京飞燕技术公司,北京 100072;3. 解放军通信指挥学院,武汉 430010)摘 要:在开源全文索引引擎Lucene 的基础上,设计了一个中文全文检索系统模型,该模型系统由7个模块组成,索引模块、检索模块是其中的核心部分。
论述了模型的整体结构,分析设计了索引及检索模块,通过具体的索引技术和检索技术来提高整个系统的检索效率。
该系统增加了加密模块,实现对建立的全文索引进行加密处理,增强了信息的安全性。
关键词:全文检索;Lucene ;倒排索引Chinese Full-text Retrieval System Based on LuceneSU Tan-ying 1, GUO Xian-yong 2, JIN Xin 3(1. Institute of Electronic Technology, PLA Information Engineering University, Zhengzhou 450004; 2. Technology Company of Beijing Feiyan,Beijing 100072; 3. Institute of PLA Communication Command, Wuhan 430010)【Abstract 】This paper proposes a model of Chinese full-text retrieval system based on Lucene which is an open source full-text retrieval engine,and expatiates its frame. This model is composed of seven modules, among which the index module and the search module are the core parts. It designs them concretely, and improves the search efficiency of the full-text retrieval system with index technology and search technology. The system model concludes an encryption module to encrypt the index and increases the system security. 【Key words 】full-text retrieval; Lucene; inverse index计 算 机 工 程Computer Engineering 第33卷 第23期Vol.33 No.23 2007年12月December 2007·软件技术与数据库· 文章编号:1000—3428(2007)23—0094—03文献标识码:A中图分类号:TP3911 中文全文检索系统全文检索技术是一个最普遍的信息查询应用,人们每天在网上使用Google 、百度等搜索引擎查找自己所需的信息,这些搜索引擎的核心技术之一就是全文检索。
随着文档处理电子化、无纸化的发展,图书馆、新闻出版、企业甚至个人的电子数据激增,如何建立数据库、管理好自己的数据,是亟待解决的问题,而全文检索是其中一个非常实用的功能。
全文检索产品实际上是一个内嵌该项技术的数据库产品[1]。
西文的全文检索已有许多成熟的理论与方法,其中,开放源代码的全文检索引擎Lucene 是Apache 软件基金会Jakarta 项目组的一个子项目,它的目的是为软件开发人员提供一个简单易用的工具包,方便在目标系统中实现全文检索的功能。
很多项目使用了Lucene 作为其后台的全文索引引擎,比较著名的有:(1)Jive :Web 论坛系统;(2)Cocoon :基于XML 的Web 发布框架,全文检索部分使用了Lucene ;(3)Eclipse :基于Java 的开放开发平台,帮助部分的全文索引使用了Lucene 。
Lucene 不支持中文,但可以通过扩充它的语言分析器实现对中文的检索。
本文在深入学习研究Lucene 的前提下,设计了一个中文的全文检索系统,对其核心的索引模块和检索模块进行了阐释,并添加了加密模块对索引信息加密,增强了系统的安全性。
2 系统的总体结构本模型总体上采用了Lucene 的架构。
Lucene 的体系结构如表1所示,它的源代码程序由7个模块组成。
表1 Lucene 的组成结构模块名功能 org.apache.Lucene.search 搜索入口 org.apache.Lucene.index 索引入口 org.apache.Lucene.analysis 语言分析器 org.apache.Lucene.queryParser 查询分析器 org.apache.Lucene.document 存储结构 org.apache.Lucene.store 底层IO/存储结构 org.apache.Lucene.util一些公用的数据结构本文通过扩充Lucene 系统来完成中文的全文检索系统,Lucene 包含了大量的抽象类、接口、文档类型等,需要根据具体应用来定义实现,本文对其作了如下扩充修改:(1)按照中文的词法结构来构建相应的语言分析器。
Lucene 的语言分析器提供了抽象的接口,因此,语言分析(analyser)是可以定制的。
Lucene 缺省提供了2个比较通用的分析器SimpleAnalyser 和StandardAnalyser ,但这2个分析器缺省都不支持中文,因此,要加入对中文语言的切分规则,需要对其进行修改。
(2)按照被索引的文件的格式对不同类型的文档进行解析,进而建立全文索引。
例如HTML 文件,通常需要把其中的内容分类加入索引,这就需要从org.apache.lucene.子document 中定义的类Document 继承,定义自己的HTMLDocument 类,然后将之交给org. apache.lucene.index 模块写入索引文件。
Lucene 没有规定数据源的格式,只提供作者简介:苏潭英(1981-),女,硕士研究生,主研方向:数据库全文检索;郭宪勇,高级工程师;金 鑫,硕士研究生 收稿日期:2007-01-10 E-mail :sutanyingwendy@了一个通用的结构(Document对象)来接受索引的输入,因此,输入的数据源可以是数据库,WORD文档、PDF文档、HTML 文档等,只要能够设计相应的解析转换器将数据源构造成Docuement对象,即可进行索引。
(3)设计具体的搜索查询。
Lucene提供了方便自建查询的API,通过QueryParser提供了强大的查询语言。
在实际应用中,要按Lucene查询语句解析器的语法设计具体的搜索器,其功能包括默认域的指定、搜索域的接收、索引库位置的接收、操作符的接收以及多个查询通过布尔操作符连接起来形成复杂的查询语句。
(4)设计检索结果的相关度。
这一部分设定文档与相关主题的准确程度,即文档符合查询要求的相似度,输出结果按此排序。
但Lucene对此不如扩充词法解析和文档类型那样条理清晰,没有留下很好的接口,因此,需要仔细地分析其源代码的实现,自行扩充。
经过扩充与设计,本文的中文全文检索引擎系统结构如图1所示。
图1 系统结构本系统中包含了语言分析模块、查询分析模块、检索结果排序模块、索引建立模块、检索模块、存储抽象模块等6个模块,它们是进行检索必备的部分。
另外,本系统充分考虑了信息的安全性,增加了一个加密模块,对所建立的全文索引进行加密。
3 系统中模块的分析与设计3.1 索引建立模块索引是全文检索的关键机制之一。
中文全文检索索引的建立比英文复杂得多,建立和维护全文检索索引库需要从以下3个方面考虑:(1)索引组织单元在西文中,文档的基本组成单元是单词,单词之间以空格间隔,而以单词为单位的索引实现起来比较简单,因此,西文的全文检索方面有许多比较成熟的理论,应用也很广泛。
中文全文检索技术在原理上同西文全文检索一致,但由于中文的词与词之间没有分隔符,因此其实现过程复杂得多。
在中文文档中,基本元素可以是单个汉字字符,也可以是词。
相应地,建立索引时就有2种基本的索引结构:基于字表的索引和基于词表的索引。
字表法把源文档中的每一个字的出现位置记录到索引库中,索引库对每个不同的字符都保存了一个字表,记录同一个字在文档中的所有出现位置。
词表法以能表达一定意义的词为基本独立单位建立索引库。
也有一些学者将2种方法结合,提出基于单元词的索引,但目前没有被广泛应用。
本文选用了字表法。
字表法对每个字的出现位置进行统计,并依据位置信息进行检索,不采用分词,实用性很强,查准率较高。
但单个汉字经常不具有独立的含义,因此,字表法在特定情况下会出现多检。
(2)索引组织方式无论是字索引还是词索引,全文检索的索引组织有正排表和倒排表2种方式[2]。
正排表是以文档的ID为关键字,表中记录项记录文档中每个字的位置信息,查找时扫描表中每个文档中字的信息直到找出所有包含查询关键字的文档。
正排表结构如图2所示[3]。
图2 正排表的索引结构这种组织方法的结构比较简单,建立比较方便且易于维护,但是在查询时需要对所有文档进行扫描,以确保没有遗漏,这就大大延长了检索时间,降低了检索效率。
与大多数全文检索系统一样,本文的全文检索系统采用倒排表来组织索引。
倒排表以字或词为关键字进行索引,关键字对应的表项记录出现这个字或词的所有文档,每个表项记录着该文档的ID和所对应的关键字在该文档中出现的位置情况。
倒排表的组织结构如图3所示[3]。
图3 倒排表的索引结构因为每个字或词对应的文档数量是动态变化的,所以倒排表的建立和维护都较为复杂,但是在查询时可以一次得到查询关键字所对应的所有文档,因此效率高于正排表。
在全文检索中,检索的快速响应是最关键的性能之一,而索引的建立在后台进行,效率相对较低,不会影响整个搜索引擎的效率[3]。
(3)索引压缩在全文检索系统中,存储的数据信息是动态增加的。
由于索引记录了关键字每一次出现的位置信息,随着信息的不断增加,需要索引的内容会不断增加,索引量也将不断增大,如果不进行压缩处理,索引的大小会和原文档相当甚至是其的几倍,这必然会占用较多的存储空间[3]。
更重要的是,查询时需要读入的索引量也在增加,降低了查询速度。