摘要:大数据时代下信息爆炸式增长,全文检索技术是提高信息检索效率的有效方法。Lucene是一个采用Java编写的全文搜索引擎框架,它运用了面向对象的设计思想,提供了丰富的API。对Lucene的系统结构、索引流程、索引机制进行了详细分析,对应用Lucene引擎搭建全文搜索系统的关键问题进行了研究。
关键词:全文检索;Lucene;倒排索引;分词
DOIDOI:10.11907/rjdk.151168
中图分类号:TP319
文献标识码:A 文章编号
作者简介作者简介:张吴波(1977-),男,湖南邵阳人,湖北汽车工业学院电气与信息工程学院讲师,研究方向为软件开发。
0 引言
大数据时代,可利用的数据和信息量呈爆炸式增长,人们在获取更多信息的同时,也不可避免地增加了筛选信息的难度[1]。面对海量数据,如何使用户更好、更准确地抓取所需信息,已成为信息化技术中一个非常重要的课题。全文检索技术是为用户提供快速、准确获取有效信息的重要方法。
1 全文检索技术
全文检索是以各种计算机数据,诸如文字、声音、图像等为处理对象,提供按照数据资料的内容,而不是外在特征来实现的信息检索手段[2]。相对于一般的DBMS,可以将Word文档、邮件、网页等非结构化、半结构化数据作为检索对象。
全文检索最初是以字符串匹配程序实现的,即在待查找的文件中,打开每个文件后,对文件内容从头到尾检索,如果其中包含需要查询的字符串,则将它作为结果文件。这种顺序检索效率较低,因此,全文检索都是通过“索引”技术实现的。其过程是由计算机索引程序扫描文件中的每一个词,然后对每个词建立一个索引,并指明该词在文章中出现的次数和位置。当用户查询时,由检索程序对已建立的索引进行查找,得到所需要的文件[3]。
2 全文搜索引擎Lucene
Lucene是一个非常优秀、成熟、开源、免费、采用Java语言编写的全文检索引擎工具。它提供了丰富的API,可以与存储在索引中的信息方便地交互,并能方便地嵌入到各种应用系统中,实现针对应用的全文索引/检索功能。
Lucene运用了大量的面向对象设计思想。首先定义了一个与平台无关的索引文件格式,其次通过抽象系统的核心组成部分设计为抽象类,具体的平台实现部分设计为抽象类的实现,此外与具体平台相关的部分比如文件存储也封装为类,经过层层的面向对象式处理,最终达成一个低耦合、高效率、容易二次开发的检索引擎系统[4]。
目前,Lucene得到了广泛应用,许多Java项目都使用了Lucene作为其后台的全文搜索引擎,比较著名的有:Jive(Web论坛系统)、Eyebrows(邮件列表HTML归档/浏览/查询系统)、Cocoon(基于XML的Web发布框架)等。
3 Lucene系统模型
3.1 Lucene系统结构
Lucene搜索引擎由基础结构封装、索引核心、对外接口、查询分析器4大部分组成,如图1所示。
索引核心是Lucene的重点,主要包括索引管理和数据存储管理。其中org.apache.lucene.index包实现对索引的建立、删除等操作[5],通过为每个分出的词建立索引,查询时只需遍历索引,从而极大地提高检索效率;org.apache.lucene.store包实现对索引文件的存储管理。基础结构封装是Lucene的基础,包括文档管理和公用类。其中org.apache.lucene.document实现对文档信息和域信息的管理;org.apache.lucene.util作为公共类,实现一些优化的数据结构和算法。对外接口包括检索和语言分析器,org.apache.lucene.analysis是语言分析器,主要用于切分词,把输入的文本分成一个个可供索引模块处理的“词语”。org.apache.lucene.search是检索管理器,提供用户检索接口,可以实现根据用户输入的查询条件进行查询。org.apache.lucene.QueryParser是查询分析器,其作用是解析用户输入的查询语句,对查询语句进行分析,然后返回一个查询对象(query),它还可以自定义查询规则,以实现像Google一样能支持查询条件的与、或、非等复合查询方式。
3.2 Lucene检索流程
基于Lucene的全文搜索,包含索引管理和搜索索引两个基本过程,其数据处理流程如图2所示。
3.2.1 索引管理
在创建索引时,先将被索引(待搜索的数据)的内容,作为文档(Document)信息,传给IndexWriter对象,在IndexWriter对象中,指定语言分析器Analyzer。语言分析器自动对文档进行分词处理,将文档分成一个个单独的单词,其中还要进行去除标点符号和停用词(像英语中的a、the、or等使用频率很多的冠词、介词、副词或连词)等处理,形成“词元(Token)”。词元传递给语言处理器进行相关处理,形成“词(Term)”,对于英语形式的词元进行语言处理时,一般做以下工作:将词元变为小写、将词元缩减为词根形式(例如“cars”转换成“car”)、将词元转变为词根形式(例如“drove”转换“drive”)等。最后索引组件依据语言处理产生的词形成词典,采用倒排索引法,形成一定数据结构的索引文件。
3.2.2 搜索索引
Lucene是针对索引进行查询的。先将用户输入的查询信息传递给QueryParser对象,该对象采用建立索引时类似的分词方法和语言处理方法,得到需要查询的单词和查询关键词;再根据查询语句的语法规则,进行语法分析,创建一棵语法树,形成Query对象;最后由IndexSearcher对象打开、读取索引目录中的索引文件,在反向索引表中,分别找出需要查询的单词文档链表,并根据语法树对文档链表进行交、差、并等操作,得到结果文档。 3.3 Lucene索引机制
索引是Lucene进行全文搜索的基础,关系到检索的效率。在Lucene中,分析器只能对文本数据进行解析,并产生索引,对于其它类型的数据,需要将其转换成文本数据后,提交给分析器进行处理。Lucene在管理索引时,是通过索引文件管理的,在索引文件中既保存正向信息,也保存反向信息。
3.3.1 正向信息
在Lucene中,索引结构是一种层次结构。索引(index)由段(segment)组成,段由记录(document)组成,记录由域(field)组成,域由词(term)组成。每个层次都保存了本层次的信息以及下一层次的元信息,也即属性信息[6],其结构如图3所示。
3.3.2 反向信息
反向信息是索引文件的核心,记录的是倒排索引表。倒排索引源于实际应用中根据属性的值来查找记录的方式。索引表中的每一项都包括一个属性值和该属性值记录的地址。在Lucene中,索引表中的项是文档单词,其属性是包含单词的文档号、在文档中的出现频次及位置,如图4所示。反向信息主要包括倒排索引表中的词典(Term Dictionary)和倒排表(Posting List)。
4 Lucene应用
Lucen提供了全文检索框架,具备完整的查询引擎和索引引擎,为数据访问和管理提供了简单的函数调用接口。在应用Lucene搭建全文检索系统时,由于应用领域不同,需要进行二次开发,以扩展系统功能。
4.1 构建数据采集器
能被Lucene索引的数据是文本数据。实际应用中,待检索数据有许多种格式和来源,例如:PDF文件、Word文件、XML文件,以及互联网的网页文件。在具体实施时,需要按照应用需求,对这些不同格式的文件分别进行处理,从中提取出纯文本格式信息,并建立对应的Lucene文档,再提交给索引管理器进行索引。
在处理PDF文件、Word文件等二进制文件时,可以借助第三方的接口和应用程序,对文件进行数据提取。例如在处理PDF文件时,可以使用PDFBox接口进行文件分析并提取数据;在处理Word文件时,可以使用JACOB、POI等从中提取数据等;在处理互联网上的网页时,可以通过网络爬虫等方式对网页数据抓取,并使用网页分析技术,先去掉其中的HTML标记,再提取网页内容。
4.2 扩展分词器
Lucene在org.apache.lucene.analysis中定义了接口,提供了可供应用系统使用的语言处理能力。Lucene默认已经实现了英文等语言的简单词法分析逻辑(按照空格分词,并去除常用的语法词,如英语中的is、am、are等)。但是,在具体应用时,由于每个语种的习惯和处理词的方法差异较大,例如在汉语中词语的分割与英语就有很大的不同。因此,使用Lucene提供的ChineseAnalyzer和CJKAnalyzer对中文分词效果并不明显,不能满足系统对中文的分词要求,此时可以采用analysis接口实现的方式,自定义分词算法,以实现对中文的个性化分词。
5 结语
Lucene本质上是一个信息检索的类库(Library),它具有高效、简洁、易用的特点,在信息检索中有着非常广泛的应用。Lucene采用了倒排索引技术,实现了高效的索引管理和检索。Lucene只以文本格式的数据作为索引对象,在实际应用中,可以开发针对各种不同类型数据的采集器,以扩展系统数据处理的广度;可以在Lucene提供的分词器基础上,针对语言系统特点,开发新的分词器,以扩展系统数据处理的深度。
参考文献:
[4]周平.Lucene全文检索引擎技术及应用[J].重庆工学院学报:自然科学版,2007,21(4):8688.
[5]何伟.基于Lucene的全文搜索引擎的设计与实现[J].情报杂志,2006(9):8890.
[6]黄少林.基于Lucene的索引系统设计与实现[J].现代情报,2009,29(7):169171.