1、毕业论文 第 IV 页 基于LUCENE的站内搜索引擎的设计与实现摘 要LUCENE1是apache软件基金会jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,LUCENE的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。作为一个开放源代码项目,LUCENE从问世之后,引发了开放源代码社群的巨大反响,程序员们不仅使用它构建具体的全文检索应用,而且将之集成到各种系统软件中去,以及构建Web应用,甚至某些商
2、业软件也采用了LUCENE作为其内部全文检索子系统的核心。apache软件基金会的网站使用了LUCENE作为全文检索的引擎,IBM的开源软件eclipse的2.1版本中也采用了LUCENE作为帮助子系统的全文索引引擎,相应的IBM的商业软件Web Sphere中也采用了LUCENE。LUCENE以其开放源代码的特性、优异的索引结构、良好的系统架构获得了越来越多的应用。这个系统的实际需求来源于本人在企业里实习时开发的2007世界特殊奥林匹克运动会官方网站,这个官方网站也使用了站内搜索引擎的功能,这个搜索引擎是我用LUCENE在.NET平台上实现的,现在网站运行稳定,站内搜索使整个网站的功能更加强
3、大,为用户提供了更为便利的搜索功能。本文对搜索引擎的原理、组成、数据结构、工作流程等方面做了深入而细致地研究与分析。并且通过LUCENE来设计和实现一个全文检索站内搜索引擎系统,最后通过增量索引和优化索引两个方面来说明如何提高LUCENE的高效性。关键词: 全文检索,搜索引擎,LUCENE ,jakarta Design and Realization of Search Engine in Site Base On LUCENEAbstract LUCENE is a sub-project of jakarta project team in apache software foundat
4、ion, and is a tool kit of full-text search engine of open source, that is not a complete full-text search engine, but is a framework of full-text search engine to provide integral inquire engine and index engine. LUCENE is designed to provide a simple, easy-to-use tool kit for software developers,an
5、d its convenient to realize the full-text retrieval function in the target system , or as a basis to establish the integral full-text search engine. As an open source project, LUCENE brings tremendous response in the open source community after its appearance. The programmers not only use it to buil
6、d concrete full-text retrieval applications, but also make it integrate into various of systems software, and build web applications, even some commercial software are using LUCENE as its core of full-text retrieval subsystems. Apache Software Foundation website uses LUCENE as a full-text search eng
7、ine, LUCENE is used to help full-text index engine of subsystem in the 2.1 version of IBMs software revenue eclipse. As the IBMs corresponding commercial software Web Sphere also uses LUCENE. LUCENE gets more and more applications with open source characteristics, excellent index structure, good sys
8、tem architecture.The actual requirements of this system origins from my development on “2007 Special Olympics World official website” when I practiced in the enterprise. The official website also uses the function of station search engine, I use the LUCENE to realize the search engine in .NET platfo
9、rm. Now for stable operation, station search make the function of the whole site become more powerful, and to provide users with a more convenient search function.I have carefully studied and analysis search engines principle, composition, data structure, and work flow, and have designed and realize
10、d a full-text retrieval stations search engine by means of LUCENE. Finally, both to I illustrate how to improve the efficiency of LUCENE through two aspects, the increment index and the optimization index.Key Words: Full Text Retrieval,Search Engine,jakarta目 录1.绪论11.1课题背景11.2课题目前研究情况及存在问题21.3论文组织结构2
11、2.全文检索与LUCENE32.1全文检索与全文检索简介32.2全文检索系统与数据库比较42.3 LUCENE简介82.4 LUCENE的应用、特点及优势92.5互联网搜索引擎的研究102.6中文分词的简单介绍113.LUCENE系统结构123.1 LUCENE系统结构组织123.2数据流分析123.3 LUCENE索引文件格式分析143.3.1 LUCENE源码实现分析的说明143.3.2 LUCENE索引文件格式143.4 LUCENE的倒排序原理173.5 LUCENE搜索结果排序204.系统设计与实现214.1系统需求214.2开发环境与工具224.3系统组织结构244.4流程实现25
12、4.4.1根据网站中不同模块建立生成动态索引254.4.2搜索界面264.4.3 搜索结果界面275.关键技术285.1 LUCENE增量索引285.2优化索引285.3 LUCENE文件格式的通用性295.4对于私密文件的处理31总 结32致 谢33参考文献34附录A 主要源程序35 毕业论文 第 37 页 1.绪论1.1课题背景随着现在网络信息化的迅速普及与发展,获取网络上面的有用信息成为人们使用的网络的主需要之一,所以搜索技术成为达到获取有用信息的主要技术,由此互联网搜索引擎应运而生,像Google,Baidu等公司在基于互联网络的搜索中在给人们提供方便的同时公司本身也取得了巨大的成功。
13、但是目前的站内搜索引擎做得还不是很好,普遍存在搜索精度差,搜索时间长,扩展性不够强等缺点,能够可以供给网站免费使用和学习的站内搜索引擎就更少了,这样就造成了有些网站没有站内搜索引擎或者搜索引擎不好用的局面,这对网站本身的用户体验显然是不能令人满意的,所以站内搜索引擎成为一个网站必不可少的功能之一。本系统的需求来源于2007世界特殊奥林匹克运动会官方网站,这是本人在公司实习的时候做的一个项目,其中站内搜索功能是官方网站中一个必不可少的功能之一,这个网站系统非常需要这样一个站内搜索的功能,能够搜索指定的官方站内的动、静态中(英)文内容,站内搜索成为官方网站中最主要的功能之一,所以为官方网站建立一个
14、站内搜索功能成为了一个现实存在的需求,于是设计和开发出一个通用的站内搜索引擎是一个非常具有现实意义的研究。1.2课题目前研究情况及存在问题目前有一些成熟的搜索引擎可以使用,但是都是用于商业,一般不公开源代码,学习起来比较困难,所以一些开源的项目成为设计时的首选,经过对搜索技术的研究,在Apache上发现了一个JAVA实现的用于搜索的开源项目LUCENE,LUCENE目前是公认的最好的搜索方面的开源项目之一,现在LUCENE已经成功的被移植到C,Perl、Python、C+、.NET及Ruby版本,所以其扩展性比较好,可以适用于大多数的平台,所以是开发站内搜索引擎的最理想的技术,但是目前存在若干
15、问题:1、因为实际项目需要Microsoft Visual Studio.NET平台,所以要将LUCENE移植到.NET平台上使用。2、LUCENE默认是不支持中文搜索的,所以要通过扩展其API使其支持中文搜索以及实现基本的中文分词。3、由于公司项目的具体需求,以后将会遇到多条件的搜索,以及搜索SQLSERVER数据库和联合多个目录进行的搜索问题。4、出于网站的某些信息的保密性,要限制某些信息被搜索到,要考虑如何保护文件的私密性。1.3论文组织结构绪论部分介绍本系统的课题来源以及目前的研究情况和存在的问题。第2章 介绍全文检索系统与LUCENE第3章 介绍LUCENE系统结构第4章 介绍本系统
16、的设计与实现。第5章 介绍系统开发过程应用到的几点关键技术。总结部分介绍整个开发过程中的体会与认识,并指出目前系统中的不足和改进方向。在附录部分附上了系统的部分实现代码,以供参考。2.全文检索与LUCENE2.1全文检索与全文检索简介全文检索2是指计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。这个过程类似于通过字典中的检索字表查字的过程。全文检索的方法主要分为按字检索和按词检索两种。按字检索是指对于文章中的每一个字都建立索引,检索时将词分解为字的组合。对于
17、各种不同的语言而言,字有不同的含义,比如英文中字与词实际上是合一的,而中文中字与词有很大分别。按词检索指对文章中的词,即语义单位建立索引,检索时按词检索,并且可以处理同义项等。英文等西方文字由于按照空白切分词,因此实现上与按字处理类似,添加同义处理也很容易。中文等东方文字则需要切分字词,以达到按词索引的目的,关于这方面的问题,是当前全文检索技术尤其是中文全文检索技术中的难点,在此不做详述。全文检索系统是按照全文检索理论建立起来的用于提供全文检索服务的软件系统。一般来说,全文检索需要具备建立索引和提供查询的基本功能,此外现代的全文检索系统还需要具有方便的用户接口、面向WWW的开发接口、二次应用开
18、发接口等等。功能上,全文检索系统核心具有建立索引、处理查询返回结果集、增加索引、优化索引结构等等功能,外围则由各种不同应用具有的功能组成。结构上,全文检索系统核心具有索引引擎、查询引擎、文本分析引擎、对外接口等等,加上各种外围应用系统等等共同构成了全文检索系统。图1.1展示了上述全文检索系统的结构与功能。图1.1 全文检索系统结构在1.1图中,我们看到:全文检索系统中最为关键的部分是全文检索引擎,各种应用程序都需要建立在这个引擎之上。一个全文检索应用的优异程度,根本上由全文检索引擎来决定。因此提升全文检索引擎的效率即是我们提升全文检索应用的根本。另一个方面,一个优异的全文检索引擎,在做到效率优
19、化的同时,还需要具有开放的体系结构,以方便程序员对整个系统进行优化改造,或者是添加原有系统没有的功能。比如在当今多语言处理的环境下,有时需要给全文检索系统添加处理某种语言或者文本格式的功能,比如在英文系统中添加中文处理功能,在纯文本系统中添加XML或者HTML格式的文本处理功能,系统的开放性和扩充性就十分的重要。2.2全文检索系统与数据库比较全文检索的实现机制:LUCENE的API接口设计的比较通用,输入输出结构都很像数据库的表=记录=字段,所以很多传统的应用的文件、数据库等都可以比较方便的映射到LUCENE的存储结构/接口中。总体上看:可以先把LUCENE当成一个支持全文索引的数据库系统。比
20、较一下LUCENE和数据库:表2.1 LUCENE和数据库结构的比较LUCENE数据库索引数据源:doc(field1,field2.) doc(field1,field2.) indexer / - | LUCENE Index| - / searcher 结果输出:Hits(doc(field1,field2)doc(field1.) 索引数据源:record(field1,field2.) record(field1.,field2) SQL: insert/ - | DB Index | - / SQL: select 结果输出:results(record(field1,field2
21、)record(field1.)Document:一个需要进行索引的“单元”一个Document由多个字段组成Record:记录,包含多个字段Field:字段Field:字段Hits:查询结果集,由匹配的Document组成RecordSet:查询结果集,由多个Record组成全文检索 like %keyword%通常比较厚的书籍后面常常附关键词索引表(如:北京:12, 34页,上海:3,77页),它能够帮助读者比较快地找到相关内容的页码。而数据库索引能够大大提高查询的速度原理也是一样,想像一下通过书后面的索引查找的速度要比一页一页地翻内容高多少倍而索引之所以效率高,另外一个原因是它是排好序
22、的。对于检索系统来说核心是一个排序问题。由于数据库索引不是为全文索引设计的,因此,使用like %keyword%时,数据库索引是不起作用的,在使用like查询时,搜索过程又变成类似于一页页翻书的遍历过程了,所以对于含有模糊查询的数据库服务来说,LIKE对性能的危害是极大的。如果是需要对多个关键词进行模糊匹配:like%keyword1% and like %keyword2% .其效率也就可想而知了。所以建立一个高效检索系统的关键是建立一个类似于科技索引一样的反向索引机制,将数据源(比如多篇文章)排序顺序存储的同时,有另外一个排好序的关键词列表,用于存储关键词=文章映射关系,利用这样的映射关
23、系索引:关键词=出现关键词的文章编号,出现次数(甚至包括位置:起始偏移量,结束偏移量),出现频率,检索过程就是把模糊查询变成多个可以利用索引的精确查询的逻辑组合的过程。从而大大提高了多关键词查询的效率,所以,全文检索问题归结到最后是一个排序问题。由此可以看出模糊查询相对数据库的精确查询是一个非常不确定的问题,这也是大部分数据库对全文检索支持有限的原因。LUCENE最核心的特征是通过特殊的索引结构实现了传统数据库不擅长的全文索引机制,并提供了扩展接口,以方便针对不同应用的定制。可以通过一下表格对比一下数据库的模糊查询8:表2.2 LUCENE和数据库功能的比较LUCENE全文索引引擎数据库匹配效
24、果通过词元(term)进行匹配,通过语言分析接口的实现,可以实现对中文等非英语的支持使用:like %net% 会把netherlands也匹配出来,多个关键词的模糊匹配:使用like %com%net%:就不能匹配词序颠倒的匹配度有匹配度算法,将匹配程度(相似度)比较高的结果排在前面。没有匹配程度的控制:比如有记录中net出现5次和出现1次的,结果是一样的结果输出通过特别的算法,将最匹配度最高的头100条结果输出,结果集是缓冲式的小批量读取的。返回所有的结果集,在匹配条目非常多的时候(比如上万条)需要大量的内存存放这些临时结果集可定制性通过不同的语言分析接口实现,可以方便的定制出符合应用需要
25、的索引规则(包括对中文的支持)没有接口或接口复杂,无法定制结论高负载的模糊查询应用,需要负责的模糊查询的规则,索引的资料量比较大使用率低,模糊匹配规则简单或者需要模糊查询的资料量少表2.3 LUCENE和其它全文检索系统区别LUCENE其他开源全文检索系统增量索引和批量索引可以进行增量的索引(Append),可以对于大量数据进行批量索引,并且接口设计用于优化批量索引和小批量的增量索引很多系统只支持批量的索引,有时数据源有一点增加也需要重建索引。数据源LUCENE没有定义具体的数据源,而是一个文档的结构,因此可以非常灵活的适应各种应用(只要前端有合适的转换器把数据源转换成相应结构),很多系统只针
26、对网页,缺乏其他格式文档的灵活性。索引内容抓取LUCENE的文档是由多个字段组成的,甚至可以控制那些字段需要进行索引,那些字段不需要索引,近一步索引的字段也分为需要分词和不需要分词的类型需要进行分词的索引,比如:标题,文章内容字段,不需要进行分词的索引,比如:作者/日期字段缺乏通用性,往往将文档整个索引了语言分析通过语言分析器的不同扩展实现:可以过滤掉不需要的词:an the of 等,西文语法分析:将jumps jumped jumper都归结成jump进行索引/检索非英文支持:对亚洲语言,阿拉伯语言的索引支持缺乏通用接口实现查询分析通过查询分析接口的实现,可以定制自己的查询语法规则:比如:
27、 多个关键词之间的 + - and or关系等并发访问能够支持多用户的使用全文检索和数据库应用最大的不同在于:让最相关的头100条结果满足98%以上用户的需求LUCENE的创新之处:大部分的搜索(数据库)引擎都是用B树结构来维护索引,索引的更新会导致大量的IO操作,LUCENE在实现中,对此稍微有所改进:不是维护一个索引文件,而是在扩展索引的时候不断创建新的索引文件,然后定期的把这些新的小索引文件合并到原先的大索引中(针对不同的更新策略,批次的大小可以调整),这样在不影响检索的效率的前提下,提高了索引的效率。2.3 LUCENE简介LUCENE不是一个完整的全文索引应用,而是是一个用Java写
28、的全文索引引擎工具包,它可以方便的嵌入到各种应用中实现针对应用的全文索引/检索功能。LUCENE的作者:LUCENE的贡献者Doug Cutting是一位资深全文索引/检索专家,曾经是V-Twin搜索引擎(Apple的Copland操作系统的成就之一)的主要开发者,后在Excite担任高级系统架构设计师,目前从事于一些INTERNET底层架构的研究。他贡献出的LUCENE的目标是为各种中小型应用程序加入全文检索功能。LUCENE的发展历程:早先发布在作者自己的www.LUCENE.com,后来发布在SourceForge,2001年年底成为APACHE基金会jakarta的一个子项目:http
29、/jakarta.apache.org/LUCENE/已经有很多Java项目都使用了LUCENE作为其后台的全文索引引擎,比较著名的有:Jive:WEB论坛系统; Eyebrows:邮件列表HTML归档/浏览/查询系统,本文的主要参考文档“TheLUCENE search engine: Powerful, flexible, and free”作者就是EyeBrows系统的主要开发者之一,而EyeBrows已经成为目前APACHE项目的主要邮件列表归档系统。 Cocoon:基于XML的web发布框架,全文检索部分使用了LUCENE 。Eclipse:基于Java的开放开发平台,帮助部分的全
30、文索引使用了LUCENE对于中文用户来说,最关心的问题是其是否支持中文的全文检索。但通过后面对于LUCENE的结构的介绍,你会了解到由于LUCENE良好架构设计,对中文的支持只需对其语言词法分析接口进行扩展就能实现对中文检索的支持。2.4 LUCENE的应用、特点及优势作为一个开放源代码项目,LUCENE从问世之后,引发了开放源代码社群的巨大反响,程序员们不仅使用它构建具体的全文检索应用,而且将之集成到各种系统软件中去,以及构建Web应用,甚至某些商业软件也采用了LUCENE作为其内部全文检索子系统的核心。apache软件基金会的网站使用了LUCENE作为全文检索的引擎,IBM的开源软件ecl
31、ipse的2.1版本中也采用了LUCENE作为帮助子系统的全文索引引擎,相应的IBM的商业软件Web Sphere中也采用了LUCENE。LUCENE以其开放源代码的特性、优异的索引结构、良好的系统架构获得了越来越多的应用。LUCENE作为一个全文检索引擎,其具有如下突出的优点:1、索引文件格式独立于应用平台。LUCENE定义了一套以8位字节为基础的索引文件格式,使得兼容系统或者不同平台的应用能够共享建立的索引文件。2、在传统全文检索引擎的倒排索引的基础上,实现了分块索引,能够针对新的文件建立小文件索引,提升索引速度。然后通过与原有索引的合并,达到优化的目的。3、优秀的面向对象的系统架构,使得
32、对于LUCENE扩展的学习难度降低,方便扩充新功能。4、设计了独立于语言和文件格式的文本分析接口,索引器通过接受Token流完成索引文件的创立,用户扩展新的语言和文件格式,只需要实现文本分析的接口。5、已经默认实现了一套强大的查询引擎,用户无需自己编写代码即使系统可获得强大的查询能力,LUCENE的查询实现中默认实现了布尔操作、模糊查询(Fuzzy Search)、分组查询等等。6 、LUCENE数据格式兼容性。即用Java LUCENE 生成的索引,能被C# 读出来,反之亦然面对已经存在的商业全文检索引擎,LUCENE也具有相当的优势。首先,它的开发源代码发行方式(遵守Apache Soft
33、ware License),在此基础上程序员不仅仅可以充分的利用LUCENE所提供的强大功能,而且可以深入细致的学习到全文检索引擎制作技术和面相对象编程的实践,进而在此基础上根据应用的实际情况编写出更好的更适合当前应用的全文检索引擎。在这一点上,商业软件的灵活性远远不及LUCENE。其次,LUCENE秉承了开放源代码一贯的架构优良的优势,设计了一个合理而极具扩充能力的面向对象架构,程序员可以在LUCENE的基础上扩充各种功能,比如扩充中文处理能力,从文本扩充到HTML、PDF等等文本格式的处理,编写这些扩展的功能不仅仅不复杂,而且由于LUCENE恰当合理的对系统设备做了程序上的抽象,扩展的功能
34、也能轻易的达到跨平台的能力。最后,转移到apache软件基金会后,借助于apache软件基金会的网络平台,程序员可以方便的和开发者、其它程序员交流,促成资源的共享,甚至直接获得已经编写完备的扩充功能。最后,虽然LUCENE使用Java语言写成,但是开放源代码社区的程序员正在不懈的将之使用各种传统语言实现(例如.net framework),在遵守LUCENE索引文件格式的基础上,使得LUCENE能够运行在各种各样的平台上,系统管理员可以根据当前的平台适合的语言来合理的选择。2.5互联网搜索引擎的研究当今的搜索引擎大多采用集中式的搜索方式。所谓集中式就是通过很多服务器把网络资源全部下载到本地,然
35、后做一些处理,为搜索做准备。搜索引擎结构大致分为:搜索器、索引器和检索器等几部分组成。搜索器就是人们所说的网络蜘蛛(Web Spider)或者叫网络机器人。通过这种Spider程序,可以从一个网页出发,通过提取其中的URL,在遵从Robot Exclusion协议的前提下,不断地提取得到的URL,并且下载本URL的资源;而索引器的主要工作则是利用下载的网络资源,提取索引项,用于生成文档库的索引表;检索器主要是通过理解用户的查询需求,在文档库中检索出文档并且进行快速匹配,然后进行相关性排序,通过链接网页提供给用户检索结果。至此,完成搜索。这样就可以知道:只要LUCENE+”蜘蛛爬虫”+”网页相关
36、度排名”,就可以成为一个真正意义上的搜索引擎,事实上LUCENE的创始人Doug Cutting已经开发了一个叫做”Nutch”的搜索引擎系统了,这个系统加上了“蜘蛛程序”可以对整个Internet的网页进行搜索,Nutch具体的逻辑关系图如下:图2.1 Nutch逻辑关系图真正的搜索引擎在搜索的时候就是和LUCENE采用一样的原理:在Index中遍历所有的Segments目录。而且一般中文分词也都是采用LUCENE的中文分词方法。2.6中文分词的简单介绍切词5对于搜索结果来说是十分重要的环节,对于英文,只用关注空格即可实现切词,而对于中文,由于中文词汇非常丰富,词语的组成十分不固定,所以中文
37、切词就变得比较困难。现在比较普遍的是中文单字切词、双字切词、字典切词,对于单字切词由于其一开始的不准确性就被很多人放弃,最准确的切词方法应该是字典切词,匹配方法大致有前向匹配、后向匹配和基于统计的匹配。举例来说,对于“中华人民”这句话,单字切词就是把这四个字一个作为一个词索引,搜索的时候逐字匹配,而双字索引是把这句话依次按两个字加以区分,分为“中华”,“华人”,“人民”这样切词。字典切词则是相对于词库来寻找哪个应该作为词,而哪个不是,由此也可以知道,字典切词是比较准确的,但是由于汉语词语的不断变化和扩充性,所以现在还要结合双字切词才可以更好地提高准确度。由于字典切词和双字切词的配合使用,搜索的
38、匹配精度在很大程度上是可以得到保证的,LUCENE的切词方法,通过程序集LUCENE.Net.Analysis来实现。3.LUCENE系统结构3.1 LUCENE系统结构组织LUCENE作为一个优秀的全文检索引擎3,其系统结构具有强烈的面向对象特征。首先是定义了一个与平台无关的索引文件格式,其次通过抽象将系统的核心组成部分设计为抽象类,具体的平台实现部分设计为抽象类的实现,此外与具体平台相关的部分比如文件存储也封装为类,经过层层的面向对象式的处理,最终达成了一个低耦合高效率,容易二次开发的检索引擎系统。以下将讨论LUCENE系统的结构组织,并给出系统结构与源码组织图:图3.1 系统结构与源码组
39、织结构图3.2数据流分析理解LUCENE系统结构的另一个方式是去探讨其中数据流的走向,并以此摸清楚LUCENE系统内部的调用时序。在此基础上,我们能够更加深入的理解LUCENE的系统结构组织,以方便以后在LUCENE系统上的开发工作。这部分的分析,是深入LUCENE系统的钥匙,也是进行重写的基础。LUCENE系统中的主要的数据流以及它们之间的关系图:图3.2 数据流图图3.2很好的表明了LUCENE在内部的数据流组织情况,并且沿着数据流的方向我们也可以对与LUCENE内部的执行时序有一个清楚的了解。现在将图中的涉及到的流的类型与各个逻辑对应系统的相关部分的关系说明一下。图中共存在4种数据流,分
40、别是文本流、token流、字节流与查询语句对象流。文本流表示了对于索引目标和交互控制的抽象,即用文本流表示了将要索引的文件,用文本流向用户输出信息;在实际的实现中,LUCENE中的文本流采用了UCS-2作为编码,以达到适应多种语言文字的处理的目的。Token流是LUCENE内部所使用的概念,是对传统文字中的词的概念的抽象,也是LUCENE在建立索引时直接处理的最小单位;简单的讲Token就是一个词和所在域值的组合,后面在叙述文件格式时也将继续涉及到token,这里不详细展开。字节流则是对文件抽象的直接操作的体现,通过固定长度的字节(LUCENE定义为8比特位长,后面文件格式将详细叙述)流的处理
41、将文件操作解脱出来,也做到了与平台文件系统的无关性。查询语句对象流则是仅仅在查询语句解析时用到的概念,它对查询语句抽象,通过类的继承结构反映查询语句的结构,将之传送到查找逻辑来进行查找的操作。图中的涉及到了多种逻辑,基本上直接对应于系统某一模块,但是也有跨模块调用的问题发生,这是因为LUCENE的重用程度非常好,因此很多实现直接调用了以前的工作成果,这在某种程度上其实是加强了模块耦合性,但是也是为了避免系统的过于庞大和不必要的重复设计的一种折衷体现。词法分析逻辑对应于org.apache.LUCENE.analysis部分。查询语句语法分析逻辑对应于org.apache.LUCENE.que
42、ryParser部分,并且调用了org.apache.LUCENE.analysis的代码。查询结束之后向评分排序逻辑输出token流,继而由评分排序逻辑处理之后给出文本流的结果,这一部分的实现也包含在了org.apache.LUCENE.search中。索引构建逻辑对应于org.apache.LUCENE.index部分。索引查找逻辑则主要是org.apache.LUCENE.search,但是也大量的使用了org.apache.LUCENE.index部分的代码和接口定义。存储抽象对应于org.apache.LUCENE.store。没有提到的模块则是做为系统公共基础设施存在。3.3 LU
43、CENE索引文件格式分析3.3.1 LUCENE源码实现分析的说明通过以上对LUCENE系统结构的分析,我们已经大致的清楚了LUCENE系统的组成,以及在LUCENE系统之上的开发步骤。接下来,我们试图来分析LUCENE项目(采用LUCENE 1.2版本)的源码实现,考察其实现的细节。这不仅仅是我们尝试用C+语言重新实现LUCENE的必须工作,也是进一步做LUCENE开发工作的必要准备。因此,这一部分所涉及到的内容,对于LUCENE上的应用开发也是有价值的,尤其是本部分所做的文件格式分析。3.3.2 LUCENE索引文件格式在LUCENE的web站点上,有关于LUCENE的文件格式的规范,其规
44、定了LUCENE的文件格式采取的存储单位、组织结构、命名规范等等内容,但是它仅仅是一个规范说明,并没有从实现者角度来衡量这个规范的实现。因此,我们以下的内容,结合了我们自己的分析与文件格式的定义规范,以期望给出一个更加清晰的文件格式说明。首先在LUCENE的文件格式中,以字节为基础,定义了如下的数据类型:表 3.1 LUCENE文件格式中定义的数据类型数据类型所占字节长度(字节)说明Byte1基本数据类型,其他数据类型以此为基础定义UInt32432位无符号整数,高位优先UInt64864位无符号整数,高位优先VInt不定,最少1字节动态长度整数,每字节的最高位表明还剩多少字节,每字节的低七位
45、表明整数的值,高位优先。可以认为值可以为无限大。其示例如下值字节1字节2字节300000000010000000120000001012701111111128100000000000000112910000001000000011301000001000000001163831000000010000000000000011638410000001100000000000000116385100000101000000000000001Chars不定,最少1字节采用UTF-8编码的Unicode字符序列String不定,最少2字节由VInt和Chars组成的字符串类型,VInt表示Chars
46、的长度,Chars则表示了String的值以上的数据类型就是LUCENE索引文件格式中用到的全部数据类型,由于它们都以字节为基础定义而来,因此保证了是平台无关,这也是LUCENE索引文件格式平台无关的主要原因。接下来我们看看LUCENE索引文件的概念组成和结构组成。图3.3 LUCENE索引文件概念结构以上就是LUCENE的索引文件的概念结构。LUCENE索引index由若干段(segment)组成,每一段由若干的文档(document)组成,每一个文档由若干的域(field)组成,每一个域由若干的项(term)组成。项是最小的索引概念单位,它直接代表了一个字符串以及其在文件中的位置、出现次数等信息。域是一个关联的元组,由一个域名和一个域值组成,域名是一个字串,域值是一个项,比如将“标题”和实际标题的项组成的域。文档是提取了某个文件中的所有信息之后的结果,这些组成了段,或者称为一个子索引。子索引可以组合为索引,也可以合并为一个新的包含了所有合并项内部元素的子索引。我们可以清楚的看出,LUCENE的索引结构在概念上即为传统的倒排索引结构。从概念上映射到结构中,索引被处理为一个目录(文件夹),其中含有的所有文件即为其内容,这些文件按照所属的段不同分组存放,同组的文件拥有相同的文件名,不同