Luc e ne全文检索的应用及检索效率测试研究3彭 哲 陈敬文【摘 要】使用Lucene设计一个全文检索系统,系统由三大功能模块组成:索引模块、检索模块和存储模块。
第二部分着重分析PDF数据转换,X M L文档设计,索引的分词、建立及效率等技术难点,并对中文分词分析器、索引文件膨胀率、索引影响因子及检索系统并对检索响应时间进行测试。
应关注X M L数据库的安全性。
【关键词】Lucence X M L 全文检索 效率Abstract:Using lucene de sign a full t ext retrieval syst em,including index mo dule,retrieval mo dule,a nd dat a ba se mo dule1Mainly a nalyze how to tra nsform PDF to X M L,de signing of X M L dat a ba se,Chine se word se gment ation,founding a nd efficiency of indexe s,then t e st s a nalyzer,exp a nsivity,f a ctors of indexe s a nd re sponding time of se arching1The security of X M L dat a ba se should be p aid att ention to1K ey w ords:Lucene X M L full t ext retrieval efficiency Lucene不是一个完整的全文检索应用程序,而是一个高性能的J a va全文检索工具包,它可以方便地嵌入到各种应用中实现针对应用的全文检索功能。
Lucene以其开放源代码的特性、优异的索引结构和良好的系统架构,得到了越来越广泛的应用。
本文使用Lucene设计并实现了一个全文检索系统,与关系数据库相比,采用X M L作为数据存储容器,实现了单个数据库操作,并在大信息量环境下极大地节省了存储空间,提高了检索的速度。
1 系统分析与设计本文实现的全文跨库检索系统由三大功能模块组成:索引模块、检索模块和存储模块[1]。
111 索引模块Lucene最核心的特征就在于它特殊的索引结构可以提高检索效率,这也是我们选择Lucene的重要原因。
Lucene使用的是倒排文件索引结构,它把每个关键词、关键词在文中出现频率、关键词在文中位置分别作为词典文件(Term Dictionary)、频率文件(Fre quencie s)、位置文件(Po sitions)保存。
其中词典文件不仅保存每个关键词,还保留了指向频率文件和位置文件的指针,通过指针可以找到该关键词的频率信息和位置信息。
同时,关键词在索引文件中的排放顺序是按照字符顺序排列的,所以Lucene可以用二元搜索算法快速定位关键词。
另外,Lucene中使用了Field的概念,用于表达信息所在位置(如标题中、文章中、url中),在建立索引时,该Field信息也记录在词典文件中。
由于每个关键词一定属于一个或多个Field,所以每个关键词都有一个Field信息。
为了减少索引文件的大小,Lucene对索引还使用了压缩技术,首先,对词典文件中的关键词进行了压缩,关键词压缩为<前缀长度,后缀>;其次,大量用到了对数字的压缩,数字只保存与上一个值的差值。
在维护索引文件时,Lucene与其他B树结构的索引有所不同,它是在扩展索引的时候不断创建新的索引文件,然后定期把这些新的小索引文件合并到原先的大索引中,这样避免了大量的IO操作,在不影响检索效率的前3本文系国家社科基金重大项目“建设创新型国家的信息服务体制与信息保障体系研究”(项目编号:06&ZD031)课题成果之一。
提下,提高了索引的效率。
112 检索模块以J SP页面作为用户检索的界面,对全文各字段进行检索,支持高级查询,对检索结构提供方便的查看方式。
检索的实现流程如图1[2]所示:图1 检索流程示意图检索系统根据建库时定义的可检索项提供多条检索途径,除了可检索如论文题目、作者、关键词等结构化数据外,还可检索全文、摘要、作者单位、期刊名、年份、期号等信息。
各检索项和字段之间提供逻辑“与”、“或”、“非”关系的组配,整个查询信息的表达采用布尔表达、字段表达、自然语言表达相结合的方式。
用户端的查询信息首先要进行分析处理,提取出查询项索引、逻辑表达式或其他查询特征描述。
113 存储模块为了实现跨库检索,我们建立了基于X M L的数据存储,主要目的在于将多个关系数据库的数据合并到一个X M L数据库中,这样有利于减小存储空间、方便数据库操作和维护。
X M L数据库被认为是一种半关系型的数据库,实际上它是一个X M L文档的集合,这些文档是持久的并且是可以操作的。
目前绝大多数的平台和一些协议都支持X M L,在网络环境下X M L的这一优势极为明显。
X M L数据可以被保存为一个文档,被分割为更小的部分并被保存成片段,或者被分解为单独的元素。
即使数据不被保存为X M L,它也可以作为X M L被输出,提供给用户或其他应用程序。
X M L文档的数据也可以通过解析保存到关系数据库中去。
同时,建立和维护一个X M L数据库比建立和维护一个关系数据库要简单方便得多,其脚本基本上全部在客户端执行,可以减轻服务器的负担。
对X M L文件进行操作的API有多种,我们选择的是J DOM。
简单地说,J DOM基于树型结构,它利用J a va技术对X M L文档实现解析、生成、序列化以及多种操作,如果只是做一些简单的应用,J DOM比较容易上手。
2 系统实现根据上述分析设计的功能模块,系统的实现可分为三个步骤:设计X M L文献数据库、建立索引文件、实现检索。
211 设计X M L文献数据库X M L是一种通用的、标准化的语言规范,将它作为容器存储数据使其具有严谨的规范格式和良好的一致性。
在SQL Sever2000中,我们可以通过在编写的SQL检索语句中增加FORX M L子句来检索数据,并生成X M L文档。
此外,通过指定3种模式(RAW、AUTO和EXPLICIT),可以使检索生成的X M L具有不同的样式进行显示, EXPLICIT模式是最复杂的一种,它可以指明要显示定义预期效果X M L树的形式,从而可对生成的X M L文档的元素布局进行完全的控制[3]。
另外,对于PDF全文,可以先将PDF文档转换为中间X M L文档,再基于XSLT抽取规则对中间X M L文档进行信息抽取的方法完成PDF文档转换成X M L文档的工作[4]。
因此,我们综合利用两种方法将各数据库的PDF全文转换成X M L数据,然后存储为X M L数据库。
对于一篇全文(若为英文,则去掉中文信息)来说,我们设计的可检索的主要字段包括来源期刊信息(包括期刊中英文名、期刊号、出版年份、期号),作者信息(中英文名、所在单位),文献信息(中英文名、摘要、关键词、分类号、全文、参考文献)等。
用E-R图表示如图2[5]。
在后台管理中,我们通过设计数据录入界面来将数据录入到X M L数据库中,当管理员在表单中输入要添加的文献信息数据并提交后,J a va代码就会把这些数据保存到X M L数据库中,同样的,删除和编辑数据也可以通过类似的操作来完成。
212 索引文件建立及效率分析Lucene使用不同的解析器对不同类型的文档进行解析,如HTM L、PDF、WORD、TEXT等等。
首先解析器会做一些预处理的工作,比如过滤文档中的HTM L标签等,解析器输出的是文本内容,接着分词器(Analyzer)从文本内容中提取出索引项以及相关信息,如索引项的出现频率,然后分词器把这些信息写入索引文件中。
Lucene使用的是倒排索引,对一篇文献来说,我们首先要分词,英文单词由于用空格分割,比较好处理,中文单词则需要特殊的分词处理。
文献中的“是”、“的”、“in”、“once”、“too”等不代表概念的词及标点符号通常没有什么实际意义,可以过滤掉;另外,用户通常希望检索“English”时能把含“english”、“ENG LISH”的文献也找出来,所以所有单词需要统一大小写;检索“go”能把含“goe s”,“went”、“gone”的文献也找出来,所以需要把“goe s”、“went”、“gone”还原成“go”。
例如,某篇文章的内容为“Alice went there,I went there too。
”经过分词处理后,该文章的所有关键词为:[alice][go][there][i][go][there]。
接下来,我们就可以建立倒排索引了,上面的对应关系是:“文章号”对应“文章中所有关键词”,倒排索引则把这个关系倒过来,即“关键词”对应“拥有该关键词的所有文章号”,然后还要加上关键词的“出现频率”和“出现位置”等信息[6][7]。
对中文文献分词来说,Lucene提供了二元分词法,比如“中华人民共和国”,切分之后就是“中华”、“华人”、“人民”、“民共”、“共和”、“和国”,如果使用单个字符切分,那么“中华”被分为“中”、“华”,检索时很可能将“华中”等冗余信息一起显示出来,而采用三元或者多元,精细度又不如二元[8]。
另外,通过对比索引文件,我们发现,采用二元分词每1M产生2121M的索引文件,膨胀率2121,每1M用时大约7秒。
要建立索引,首先要建立一个Document文档对象,然后对Document文档建立索引。
Document文档不仅存储了正文字段,还包括其他描述文献的字段,如标题、作者、摘要等。
其中正文字段由于体积大、占字段多、被检率低的缘故,只存储其url地址,而IndexWriter负责接收新加入的Document文档,并写入索引库中。
索引创建过程如图3所示。
图3 索引创建示意图在需要索引大量文件的前提下,提高索引效率的方法可以是更新硬件资源的配置,也可以通过优化索引设置加快索引文件写入磁盘的过程。
Lucene在内存中持有一块缓冲区,IndexWriter提供了三个参数用来调整缓冲区的大小以及往磁盘上写索引文件的频率:(1)合并因子(mergeFa ctor),这个参数决定了在Lucene的一个索引块中可以存放多少文档以及把磁盘上的索引块合并成一个大的索引块的频率;(2)最小合并文档数,这个参数决定了内存中的文档数至少达到多少时才能将它们写回磁盘,设大此参数值可以显著提高索引性能;(3)最大合并文档数,这个参数决定了一个索引块中的最大文档数,它的默认值是Inte ger1MAX_VALUE,将此参数值设大可以提高索引效率和检索速度。