APP下载

基于Lucene全文检索技术的优化探讨

2017-11-18胡杰郭乔进陈彬

计算机时代 2017年11期
关键词:全文检索

胡杰+郭乔进+陈彬

摘 要: 当今社会已经进入信息量爆发式增长的大数据时代,如何从海量数据中快速查找信息成为当前研究的热点,Lucene软件作为优秀的开源全文检索工具已被广泛应用于各种搜索引擎。文章通过对全文检索原理与Lucene工具架构的研究,从优化内存索引、索引压缩处理、优化磁盘索引等方面探讨Lucene检索效率的优化。实验结果证明,通过优化内存索引、索引压缩处理等方法可以有效地提高全文检索的效率。

关键词: 全文检索; Lucene; 倒排索引; 检索优化

中图分类号:TP393.08 文献标志码:A 文章编号:1006-828(2017)11-16-04

Research on the optimizing of full-text retrieval with Lucene

Hu Jie, Guo Qiaojin, Chen Bin

(The 28th Institute of China Electronics Technology Group Corporation, Nanjing, Jiangsu 210007, China)

Abstract: Today's society has entered the big data era with the explosive growth of information, how to find information quickly from massive data has become the current research hotspot, as an excellent open source full-text retrieval tool, Lucene has been widely used in all kinds of search engines. This paper studies the principle of full-text retrieval and the architecture of Lucene tool, and discusses the Lucene retrieval efficiency optimization from aspects of optimizing memory index, index compression processing and optimizing disk index. The experimental result proved that the efficiency of full-text retrieval can be improved effectively by optimizing memory index and index compression processing.

Key words: full-text retrieval; Lucene; inverted index; retrieval optimization

0 引言

当今社會已经进入信息量爆发式增长的大数据时代。面对快速增长的海量数据,基于SQL查询的传统数据库已经难以满足数据检索的需要,而且随着多媒体技术的发展,文本、音频、图像等非结构化数据也成为用户主要的检索对象。传统数据库查询普遍存在检索内容覆盖有限、检索时间长等缺点,最重要的是不能通过查询数据中某个词语获得用户实际需要的内容,因此全文检索技术作为现代信息检索的核心技术,已经成为现有各种搜索引擎必不可少的功能。

Lucene是当前应用最广泛的开源全文检索项目,它提供了丰富的函数接口用于嵌入到其他应用程序中,实现强大的全文索引和搜索功能。实际应用中,Lucene可以从检索效率、中文分词、检索精度等多方面开展检索优化,本文主要探讨硬盘索引、内存索引、索引压缩处理等方面的检索优化。

1 全文检索原理

全文检索主要面向文本文档,它通过一定的算法对文档进行语言和词法分析,将文档中每一个独立的单词进行分离并对这些单词建立索引,记录这些单词在文档中出现的次数和位置[1]。当用户以这些单词为关键字进行查询时,检索程序按照一定的算法直接在索引文件进行查找,而不必在检索时遍历整个文档。

全文检索作为信息检索的核心技术已广泛应用于Google、百度等主流的搜索引擎,用来实现网页、文档等非结构化数据的检索[2]。全文检索与传统的数据库检索相比,数据库检索只能检索基于库、表、字段等固定格式的结构化数据,而全文检索却能够任意检索各种无固定格式的非结构化数据。

全文检索包括文件预处理、索引构建、检索实现等三个步骤[3]。

⑴ 文件预处理:由于被检索文件往往不是单纯的文本数据,全文检索首先要对被检索文件进行一定的预处理,将各种类型文件进行文本内容的提取,同时过滤掉文本文件中的标点符号和控制符等无关内容,完成文本提取和符号过滤后,使用纯文本文件替代原始文件准备下一步的处理。

⑵ 索引构建:扫描已处理的纯文本文件,完成分词处理后,将每个单词出现的位置和频率记录下来,为了提高后续的检索效率,一般采用倒排索引的方式进行索引库的构建。当扫描文档时,如果某个单词第一次出现,那么为该单词建立一张新的索引表,用于记录该单词出现的位置与频率;当这个单词再次出现时,则在该单词的索引表中记录下文档中出现的位置,同时将单词频率计数值加1。

⑶ 检索实现:检索实现的过程是在已经创建的索引表中查找匹配关键词,这个过程包括两步:首先通过词法分析实现词语的拆分,比如词语“软件设计”就会被拆分为“软件”和“设计”两个词语,此时词法分析与建立索引时词法分析采用的是同一个规则;然后将检索词语与索引表进行比对与匹配,如果“软件”出现在第M篇文档的第N个字节,同时“设计”出现在该篇文档的第N+4个字节处,则“软件设计”词语被命中匹配。endprint

2 Lucene工具

2.1 Lucene概述

Lucene是一个由Apache软件基金管理的全文检索项目[4],它提供了完整的查询引擎与索引引擎以及部分文本分析引擎。

为了能够适应不同的操作系统和软件平台,Lucene工具库定义了以8位字节为单位的索引文件格式[5],并采用了分层的数据结构:词(Term)是索引的最小单位,它表示一个处理后的关键字以及该关键字在文件中的位置与频率;多个相关的词形成域(Field),域是一个包括域名和域值的二元数组,通常一篇文章的题目、作者、发表日期都可以保存在不同的域中;多个相关的域形成文档(Document),通常把文档看作索引的基本单位,每个文档都有一个惟一的标识号;多个文档可以形成段(Segment),段(又称子索引)是索引层次结构的最高层,索引就是由若干个段组成,不同的段文件之间可以合并,并且能够单独地进行搜索与维护[6]。

如图1所示,Lucene的层次索引架构能够有效地提高全文检索的效率,它按照段、文档、域、词的分级模式搜索相关数据,避免遍历索引中的每一条词(Term)数据,尤其是在海量数据检索时效率提升更加明显[7]。Lucene索引文件同时保存了正向信息和反向信息,其中正向信息是从索引到段、一直到词(索引->段->文档->域->词)的正向索引关系,而反向信息是从词到文档(词->域->文档)的反向索引关系,即倒排索引。倒排索引是一种基于键值对(key/value)的索引方法,其中键(key)表示文档中出现的所有关键词,而值(value)表示包含该关键词的文档集合信息,键值对记录了文档中关键词与关键词在文档中存储位置的映射关系[8]。

2.2 Lucene结构组成

Lucene的总体结构与索引过程如图2所示,它包括索引管理和搜索索引两部分:索引管理负责从外部的数据库、文件系统、网站或人工输入方式搜集数据,为这些数据构建索引文件并进行管理,其中数据抓取功能由外部的应用程序实现;当外部的应用程序提出检索请求时,搜索索引负责解析用户输入的检索语句,将外部输入的检索语句翻译成Lucene能够识别的搜索语句,搜索引擎根据搜索语句在索引文件中进行比对匹配,最后将匹配的检索结果返回给用户[9]。

Lucene主要由analysis、index、store、search、queryParser、util等模块组成,其中analysis作为语言分析器,主要负责对文档进行词法分析和语言处理,最终形成词(Term),index负责实现索引创建、索引删除等索引管理功能,store负责实现索引数据的底层I/O存取操作,search负责实现检索管理功能,即根据指定的查询条件检索得到结果,queryParser负责对用户的查询语句进行语法分析,包括多个关键词的与、或、非等各种运算,util提供了文档编码、字节结构等公用的辅助功能类[10]。

3 检索效率优化探讨

3.1 优化内存索引

通过对索引建立过程的研究和分析,可以发现整个索引建立的过程,同时也是一个磁盘读写的过程。磁盘读写的效率严重影响着建立索引的效率,这也是索引建立的性能瓶颈。为了减少磁盘读写效率的影响,提高建立索引的效率,可以通过改变索引建立过程中的合并阈值,从而增加索引缓冲区和索引文件中的文档数,减少由内存往硬盘写索引的频率,达到提高创建索引效率的目的。为了实现这个优化过程,需要设置IndexWriter对象的mergeFactor、maxMergeDocs、minMergeDocs参数。

首先,Lucene工具将文档对象读入内存,形成单一段索引,当内存中的单一段索引达到minMergeDocs时,就合并成一个段索引并写入磁盘。然后,当磁盘上的段索引数目达到 mergeFactor时,就将段索引合并成为一个较大的段索引,但是,由于每个段索引都存在一个包含文档数目的上限maxMergeDocs,所以这个合并过程也不是无限制的。通过分析可知,合理地调整这3个参数值,可以有效地提高索引性能。

3.2 索引压缩处理

检索优化的一个关键目标就是通过一些算法来减少I/O開销和存储开销,索引文件的大小决定其所占用的存储开销。此外,由于大索引文件需要更大的I/O带宽来读取,因此其大小也直接影响了检索的处理时间,这里以哈夫曼编码为例介绍无损压缩的编码方式。哈夫曼编码是一种可变字长编码,它通过使用较短的码字标识出现频率较高的信源符号,而出现频率较低的信源符号用较长的码字来编码,从而实现平均码长最短,达到数据压缩的目的[11]。

利用哈夫曼编码进行文件压缩的原理如下:首先将文件看作一个单符号信源,而每个文件都是由多个8位字节组成,每个字节的内容最多有256(28)种可能,所以可将文件视作由不超过256种字符形成的组合。然后扫描待压缩的索引文件,统计文件中出现的每一个字符及出现的概率,将字符按由高到低的概率进行排序。最后以字符出现的频率作为权值,通过构造哈夫曼树,生成码长最短的二进制前缀编码。

3.3 优化磁盘索引

通过对建立索引过程的研究和分析可知,Lucene建立索引的过程是先分别在磁盘上生成若干个较小的段索引,当它达到mergeFactor后,就合并这些索引。但是这样建立索引后,仍然可能会剩下很多索引文件,可以将磁盘中的若干个索引文件再次合并一个索引文件,减少由硬盘往内存读写索引的频率,达到提高检索效率的目的。

当然,针对磁盘的索引优化也需要选择合理的时机,实践验证表明,如果在索引生成过程中使用上述方法,那么索引创建的时间将比平常索引创建时间多出几十倍,因此最优的方法是选择索引建立完成后且短期内不再发生索引变更的时机进行合并操作,这样才不会出现合并操作与索引建立两者之间的冲突。endprint

4 实验及结果

实验采用64位红帽 Linux 6.1企业版操作系统,集成开发环境为Eclipse 4.5版本,硬件平台采用Intel core i7处理器、8G内存和1T硬盘。实验选择15万篇网络下载的文档,实验结果如表1所示。

实验证明,在内存足够大的情况下,通过增加MergeFactor参数确实可以提高索引建立的吞吐量,即提高索引创建的速度,但是如果设置过高,可能存在突破操作系统文件描述符上限的风险,因此需要根据实际应用场景设置合理的参数值。

在索引压缩处理实验中,将MergeFactor值统一设置为10,实验结果表明当索引文件相对较小且不超过机器内存时,索引压缩处理对于效率提升也是相对有限的,只有在索引文件较大且远大于机器内存时,能明显提升索引处理效率,试验结果如表2所示。

对于优化磁盘索引实验,由于将磁盘中的若干个索引文件合并为一个索引文件,由于每次合并操作时这些小的索引文件数量和大小具有一定的不确定性,因此在效率优化的实际实验结果中存在较大的偏差,有些情况下效果较好,而有些情况效率提升不明显,这里不再一一列举。

5 结束语

本文通过研究优化硬盘索引、优化内存索引、索引压缩处理等方法,探讨基于Lucene全文检索效率的优化。实验结果表明,通过优化内存索引、索引压缩处理等方法可以有效地提高全文检索的效率,而优化磁盘索引则对效率提升有限,存在较大的不确定性。总体而言,索引效率优化需要针对具体的业务环境,需要综合考虑机器配置、索引文件数量与大小等多种因素,只有选择合适的优化方法才能有效地提高全文检索的效率。当然,Lucene检索效率优化还可以从多线程、并行處理等软件开发角度去进一步尝试,这些方法还有待于进一步的深入研究。

参考文献(References):

[1] 黄承慧,印鉴,陆寄远.一种改进的Lucene语义相似度检索算

法[J].中山大学学报:自然科学版,2011.50(2).

[2] 赵珂,逯鹏,李永强.基于Lucene的搜索引擎的设计与实现[J].

计算机工程,2011.37(16):39-41

[3] 义天鹏,陈启安.基于Lucene的中文分析器分词性能比较研

究[J].计算机工程,2012.38(22):279-282

[4] 胡长春,刘功申.面向搜索引擎Lucene的中文分析器[J].计算

机工程与应用,2009.45(12):157-159

[5] 吴广君,王树鹏,陈明等.海量结构化数据存储检索系统[J].计

算机研究与发展,49(S1):1-5

[6] 黄江平,黄理灿,徐玲.基于Lucene的PDF文档的全文检索的

实现[J].工业控制计算机,2012.25(5):10

[7] 吴代文,杨方琦.Lucene在数据库全文检索中的性能研究[J].

微计算机应用,2011.32(6):53-58

[8] 李永春,丁华福.Lucene的全文检索的研究与应用[J].计算机

技术与发展,2010.20(2):12-15.

[9] 王欢,孙瑞志.基于领域本体和 Lucene 的语义检索系统研究[J].

计算机应用,2010.30(6):1655-1657

[10] 姜鑫,余平.基于Lucene的音视频资源检索系统的研究与

实现[J].计算机应用与软件,2011.28(11):245-248

[11] 张凤林,刘思峰.Huffman~*:一个改进的Huffman数据压缩

算法[J].计算机工程与应用,2007.43(2):73-74endprint

猜你喜欢

全文检索
基于Lucene的全文检索的研究及实现
实名制校园安保服务平台的设计与实现
基于MySQL的中文全文搜索研究
Oracle数据库全文检索性能研究
基于Lucene的多种排序方式的实现
全文检索引擎Lucene系统模型与应用研究
全文检索引擎技术在电子病历中的应用
基于云计算的知识管理系统
基于双层PDF和Lucene技术的全文检索研究与实现
基于KySou的全文检索系统的分析与优化