全文检索引擎Lucene系统模型与应用

点赞:4928 浏览:15044 近期更新时间:2024-04-09 作者:网友分享原创网站原创

摘 要:大数据时代下信息爆炸式增长,全文检索技术是提高信息检索效率的有效方法.Lucene是一个采用Ja编写的全文搜索引擎框架,它运用了面向对象的设计思想,提供了丰富的API.对Lucene的系统结构、索引流程、索引机制进行了详细分析,对应用Lucene引擎搭建全文搜索系统的关键问题进行了研究.


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

DOIDOI:10.11907/rjdk.151168

中图分类号:TP319

文献标识码:A文章编号

文章编号:16727800(2015)006012703

作者简介作者简介:张吴波(1977-),男,湖南邵阳人,湖北汽车工业学院电气与信息工程学院讲师,研究方向为软件开发.

0引言

大数据时代,可利用的数据和信息量呈爆炸式增长,人们在获取更多信息的同时,也不可避免地增加了筛选信息的难度[1].面对海量数据,如何使用户更好、更准确地抓取所需信息,已成为信息化技术中一个非常重要的课题.全文检索技术是为用户提供快速、准确获取有效信息的重要方法.

1全文检索技术

全文检索是以各种计算机数据,诸如文字、声音、图像等为处理对象,提供按照数据资料的内容,而不是外在特征来实现的信息检索手段[2].相对于一般的DBMS,可以将Word文档、邮件、网页等非结构化、半结构化数据作为检索对象.

全文检索最初是以字符串匹配程序实现的,即在待查找的文件中,打开每个文件后,对文件内容从头到尾检索,如果其中包含需要查询的字符串,则将它作为结果文件.这种顺序检索效率较低,因此,全文检索都是通过“索引”技术实现的.其过程是由计算机索引程序扫描文件中的每一个词,然后对每个词建立一个索引,并指明该词在文章中出现的次数和位置.当用户查询时,由检索程序对已建立的索引进行查找,得到所需要的文件[3].

2全文搜索引擎Lucene

Lucene是一个非常优秀、成熟、开源、免费、采用Ja语言编写的全文检索引擎工具.它提供了丰富的API,可以与存储在索引中的信息方便地交互,并能方便地嵌入到各种应用系统中,实现针对应用的全文索引/检索功能.

Lucene运用了大量的面向对象设计思想.首先定义了一个与平台无关的索引文件格式,其次通过抽象系统的核心组成部分设计为抽象类,具体的平台实现部分设计为抽象类的实现,此外与具体平台相关的部分比如文件存储也封装为类,经过层层的面向对象式处理,最终达成一个低耦合、高效率、容易二次开发的检索引擎系统[4].

目前,Lucene得到了广泛应用,许多Ja项目都使用了Lucene作为其后台的全文搜索引擎,比较著名的有:Jive(Web论坛系统)、Eyebrows(邮件列表HTML归档/浏览/查询系统)、Cocoon(基于XML的Web发布框架)等.

3Lucene系统模型

3.1Lucene系统结构

Lucene搜索引擎由基础结构封装、索引核心、对外接口、查询分析器4大部分组成,如图1所示.

索引核心是Lucene的重点,主要包括索引管理和数据存储管理.其中.apache.lucene.index包实现对索引的建立、删除等操作[5],通过为每个分出的词建立索引,查询时只需遍历索引,从而极大地提高检索效率;.apache.lucene.store包实现对索引文件的存储管理.基础结构封装是Lucene的基础,包括文档管理和公用类.其中.apache.lucene.document实现对文档信息和域信息的管理;.apache.lucene.util作为公共类,实现一些优化的数据结构和算法.对外接口包括检索和语言分析器apache.lucene.analysis是语言分析器,主要用于切分词,把输入的文本分成一个个可供索引模块处理的“词语”..apache.lucene.search是检索管理器,提供用户检索接口,可以实现根据用户输入的查询条件进行查询..apache.lucene.QueryParser是查询分析器,其作用是解析用户输入的查询语句,对查询语句进行分析,然后返回一个查询对象(query),它还可以自定义查询规则,以实现像Google一样能支持查询条件的与、或、非等复合查询方式.

3.2Lucene检索流程

基于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.3Lucene索引机制

索引是Lucene进行全文搜索的基础,关系到检索的效率.在Lucene中,分析器只能对文本数据进行解析,并产生索引,对于其它类型的数据,需要将其转换成文本数据后,提交给分析器进行处理.Lucene在管理索引时,是通过索引文件管理的,在索引文件中既保存正向信息,也保存反向信息.

3.3.1正向信息

在Lucene中,索引结构是一种层次结构.索引(index)由段(segment)组成,段由记录(document)组成,记录由域(field)组成,域由词(term)组成.每个层次都保存了本层次的信息以及下一层次的元信息,也即属性信息[6],其结构如图3所示.

3.3.2反向信息

反向信息是索引文件的核心,记录的是倒排索引表.倒排索引源于实际应用中根据属性的值来查找记录的方式.索引表中的每一项都包括一个属性值和该属性值记录的地址.在Lucene中,索引表中的项是文档单词,其属性是包含单词的文档号、在文档中的出现频次及位置,如图4所示.反向信息主要包括倒排索引表中的词典(TermDictionary)和倒排表(PostingList).

4Lucene应用

Lucen提供了全文检索框架,具备完整的查询引擎和索引引擎,为数据访问和管理提供了简单的函数调用接口.在应用Lucene搭建全文检索系统时,由于应用领域不同,需要进行二次开发,以扩展系统功能.

4.1构建数据采集器

能被Lucene索引的数据是文本数据.实际应用中,待检索数据有许多种格式和来源,例如:PDF文件、Word文件、XML文件,以及互联网的网页文件.在具体实施时,需要按照应用需求,对这些不同格式的文件分别进行处理,从中提取出纯文本格式信息,并建立对应的Lucene文档,再提交给索引管理器进行索引.

在处理PDF文件、Word文件等二进制文件时,可以借助第三方的接口和应用程序,对文件进行数据提取.例如在处理PDF文件时,可以使用PDFBox接口进行文件分析并提取数据;在处理Word文件时,可以使用JACOB、POI等从中提取数据等;在处理互联网上的网页时,可以通过网络爬虫等方式对网页数据抓取,并使用网页分析技术,先去掉其中的HTML标记,再提取网页内容.

4.2扩展分词器

Lucene在.apache.lucene.analysis中定义了接口,提供了可供应用系统使用的语言处理能力.Lucene默认已经实现了英文等语言的简单词法分析逻辑(按照空格分词,并去除常用的语法词,如英语中的is、am、are等).但是,在具体应用时,由于每个语种的习惯和处理词的方法差异较大,例如在汉语中词语的分割与英语就有很大的不同.因此,使用Lucene提供的ChineseAnalyzer和CJKAnalyzer对中文分词效果并不明显,不能满足系统对中文的分词要求,此时可以采用analysis接口实现的方式,自定义分词算法,以实现对中文的个性化分词.

5结语

Lucene本质上是一个信息检索的类库(Library),它具有高效、简洁、易用的特点,在信息检索中有着非常广泛的应用.Lucene采用了倒排索引技术,实现了高效的索引管理和检索.Lucene只以文本格式的数据作为索引对象,在实际应用中,可以开发针对各种不同类型数据的采集器,以扩展系统数据处理的广度;可以在Lucene提供的分词器基础上,针对语言系统特点,开发新的分词器,以扩展系统数据处理的深度.