基于Lucene 的中文分词全文搜索引擎设计与实现
2015-07-13李炳练
李炳练
摘要:基于Lucene的全文检索开源项目基础上,采用PaodingAnalyzer中文分词器,设计了一个基于中文环境的高效分词与全文搜索引擎系统,实现多种类型文件内容的文本全文检索功能。
关键词: 全文搜索;中文分词;搜索引擎;Lucene
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2015)13-0236-02
Abstract: This paper design and implement an efficient Chinese segmentation search engine based on Lucene and PaodingAnalyzer, which mainly for dealing with Chinese words to improve the ability of full text search system.
Key words: full text search; chinese segmentation; search engine; lucene
基于关键字的文本搜索是信息系统最重要最常用的功能之一,而开放源代码的Lucene全文检索技术是信息检索领域广泛使用的基本技术,被大量的集成到各种系统软件以及构建Web应用系统中去,作为软件的全文检索子系统的核心。基于关键字的文本搜索首先要解决分词问题,虽然Lucene内置了分词器功能,但无法支持复杂的中文分词。因此,本文在比较各类中文分词器的基础上,采用PaodingAnalyzer分词器代替Lucene内置分词器,与Lucene共同构建起一个中文环境下高效、准确的全文搜索引擎系统。
1 关键技术
1.1 Lucene
Lucene是apache软件基金会jakarta项目组下的一个子项目,是一个开放源代码的全文检索引擎工具包[1]。作为一个开放源代码项目,Lucene发布后,引发了开放源代码社区的热烈反应,开发者不仅使用它构建具体的全文检索应用,而且将Lucene整合到各种系统软件以及各种Web应用中,甚至也有商业软件也采用Lucene作为其全文检索子系统的核心。
采用Lucene构建全文搜索引擎不仅在于其开源、免费,而且在于高性能、纯JAVA跨平台应用,方便移植可重用;Lucene作为一个全文检索引擎,其突出的技术应用优势是不仅在传统全文检索引擎的倒排索引的基础上,实现了分块索引,而且设计了独立于语言和文件格式的文本分析接口;还实现了一套强大的查询引擎,用户无需自己编写代码即可使系统可获得强大的查询能力。
1.2 PaodingAnalyzer中文分词器
当前基于Lucene的中文分词器主要有PaodingAnalyzer、imdict、mmseg4j、ik等四种。从是否支持用户自定义词库、运行速度、算法与代码复杂度、开发者与开发社区活跃度等方面综合分析权衡,本系统最终采用PaodingAnalyzer分词器来实现中文分词功能。
PaodingAnalyzer中文分词器,又称庖丁解牛中文切词器2[2]。PaodingAnalyzer基于Java的开源中文分词组件,提供lucene和solr接口,具有极高效率和高扩展性。它采用基于不限制个数的词典文件对文章进行有效切分,支持最大/最小切词。字典灵活且文件个数不限、名称不限、只要符合以dic作为扩展名的文件均视为字典。可以根据需要加减字典目录以及目录下的字典。
2 系统设计与实现
在本搜索引擎系统中,采用基于Lucene全文检索引擎开源项目为系统开发核心,并整合PaodingAnalyzer中文分词器以解决Lucene中不支持中文分词问题,系统由三大模块组成:文件索引模块、搜索查询模块与搜索结果排序与显示模块。
系统的工作流程是,首先对通过爬虫等方法收集起来的所有文档建立索引;其次是设计开发查询分析器对用户查询请求进行分词与匹配查找;最后把查找结果通过排序算法与关键字高亮显示等方式反馈到查询客户端。各模块工作原理与相互协作流程系统整体框架图如图1所示:
2.1 文件索引
系统中待索引文件可用网络爬虫,手工等方式收集,文件格式可以为html、doc、ppt、xls、pdf、txt等文档。在建立文件索引前首先必须通过文件格式转换器对特定的文件格式采用相对应的解释类对文档进行格式转换与清洗,如PDF格式文件通过 PDFBox类解释,Word 和 Excel 通过POI类解析,并最终将文档内容转换成字节流。建立索引之前必须进行中文分词,PaodingAnalyzer中文分词器对通过格式转换器生成的字节流进行中文分词处理。最后通过索引创建器中Lucene索引类中IndexWriter方法对所有文档建立索引并对索引进行存储,在索引结束时使用 Lucene 的 wirter.optimize( ) 方法优化索引。索引创建过程如图1中的系统工作流程图所示。
2.2搜索查询
在客户端输入查询关键字后,首先使用中文分词器接收传递过来的查询数据,进行合理的中文分词处理,再使用分割的关键字查询搜索索引,查找到对应的关键字以及关联的文件,最后将结果反馈回客户端。
Lucene中IndexSeacher类是搜索操作的入口,所有搜索操作都是通过IndexSeacher实例使用一个重载的search方法来实现。具体的Query子类为每一种特定类型的查询进行逻辑上的封装。Query实例被传递到IndexSearcher的search方法中。QueryParser 将用户输入的查询表达式处理为一个具体的Query对象。
2.3搜索结果处理
通过关键字搜索,获取文档的URL,并利用文件系统解析到结果界面。Lucene的默认搜索结果排序是按照文档的得分进行排序的。当检索结果集中有两个文档具有相同的得分时,默认按照文档的ID对结果进行排序。还可以使用Sort排序工具实现个性化排序,方法如下:Lucene在查询的时候,可以通过以一个Sort作为参数构造一个检索器IndexSearcher,在构造Sort的时候,指定排序规则。
Lucene搜索结果分页,与读取数据库表的分页类似,每次仅取出前10条记录,这样避免了内存溢出的可能,但是每次搜索都要进行一次IO操作,如果大并发访问的情况下,对服务器硬盘的转速与处理器的频率性能要求较高。
在搜索结果页面中,还使用关键字加粗高亮显示。在org.apache.Lucene.search.highlight包中提供了关于高亮显示检索关键字的工具。
3 系统测试
选择html、doc、pdf、txt四种类型文档各10份,每份文档文本包含“计算机科学技术”相关内容,首先对文档进行中文分词,然后对其建立中文索引,最后使用关键字搜索。测试的结果如下:
PaodingAnalyzer中文分词器对“计算机科学技术”分词后的结果是:计算 计算机 计算科学 科学 技术 科学技术 计算科学 计算技术。中文分词器基本符合分词要求。在客户端输入以上相关的关键字搜索,都能成功搜索出有相关内容的测试文档机及内容。
4 结束语
基于Lucene的中文分词全文搜索引擎系统经过测试,性能较为稳健,准确率也较高,基本满足中文环境下的搜索需求,但文件的索引速度与构建实时索引方面还有较大的完善空间,其次,搜索查询速度较为缓慢,主要原因是每次运行,都会进行索引的加载,影响了性能,后期将对其进行缓存,可大幅度提升搜索的速度。
参考文献:
[1] 管建,甘剑峰. 基于Lucene全文检索引擎的应用研究与实现[J]. 计算机工程与设计,2007(2).
[2] 费洪晓,康松林,朱小娟,等.基于词频统计的中文分词的研究[J]. 计算机工程与应用,2005(7).