全文检索定义
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、什么是全文检索与全文检索系统?
全文检索是指计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。
这个过程类似于通过字典中的检索字表查字的过程。
全文检索的方法主要分为按字检索和按词检索两种。
按字检索是指对于文章中的每一个字都建立索引,检索时将词分解为字的组合。
对于各种不同的语言而言,字有不同的含义,比如英文中字与词实际上是合一的,而中文中字与词有很大分别。
按词检索指对文章中的词,即语义单位建立索引,检索时按词检索,并且可以处理同义项等。
英文等西方文字由于按照空白切分词,因此实现上与按字处理类似,添加同义处理也很容易。
中文等东方文字则需要切分字词,以达到按词索引的目的,关于这方面的问题,是当前全文检索技术尤其是中文全文检索技术中的难点,在此不做详述。
全文检索系统是按照全文检索理论建立起来的用于提供全文检索服务的软件系统。
一般来说,全文检索需要具备建立索引和提供查询的基本功能,此外现代的全文检索系统还需要具有方便的用户接口、面向WWW[1]的开发接口、二次应用开发接口等等。
功能上,全文检索系统核心具有建立索引、处理查询返回结果集、增加索引、优化索引结构等等功能,外围则由各种不同应用具有的功能组成。
结构上,全文检索系统核心具有索引引擎、查询引擎、文本分析引擎、对外接口等等,加上各种外围应用系统等等共同构成了全文检索系统。
图1.1展示了上述全文检索系统的结构与功能。
在上图中,我们看到:全文检索系统中最为关键的部分是全文检索引擎,各种应用程序都需要建立在这个引擎之上。
一个全文检索应用的优异程度,根本上由全文检索引擎来决定。
因此提升全文检索引擎的效率即是我们提升全文检索应用的根本。
另一个方面,一个优异的全文检索引擎,在做到效率优化的同时,还需要具有开放的体系结构,以方便程序员对整个系统进行优化改造,或者是添加原有系统没有的功能。
比如在当今多语言处理的环境下,有时需要给全文检索系统添加处理某种语言或者文本格式的功能,比如在英文系统中添加中文处理功能,在纯文本系统中添加XML[2]或者HTML[3]格式的文本处理功能,系统的开放性和扩充性就十分的重要。
二、什么是Lucene?
Lucene是apache软件基金会[4] jakarta项目组的一个子项目,是一个开放源代码[5]的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。
Lucene 的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。
Lucene的原作者是Doug Cutting,他是一位资深全文索引/检索专家,曾经是V-Twin搜索引擎[6]的主要开发者,后在Excite[7]担任高级系统架构设计师,目前从事于一些Internet 底层架构的研究。
早先发布在作者自己的/,后来发布在SourceForge[8],2001年年底成为apache软件基金会jakarta的一个子项目:/lucene/。
三、Lucene的应用、特点及优势
作为一个开放源代码项目,Lucene从问世之后,引发了开放源代码社群的巨大反响,程序员们不仅使用它构建具体的全文检索应用,而且将之集成到各种系统软件中去,以及构建Web应用,甚至某些商业软件也采用了Lucene作为其内部全文检索子系统的核心。
apache软件基金会的网站使用了Lucene作为全文检索的引擎,IBM的开源软件eclipse[9]的2.1版本中也采用了Lucene作为帮助子系统的全文索引引擎,相应的IBM的商业软件Web Sphere[10]中也采用了Lucene。
Lucene以其开放源代码的特性、优异的索引结构、良好的系统架构获得了越来越多的应用。
Lucene作为一个全文检索引擎,其具有如下突出的优点:
(1)索引文件格式独立于应用平台。
Lucene定义了一套以8位字节为基础的索引文件格式,使得兼容系统或者不同平台的应用能够共享建立的索引文件。
(2)在传统全文检索引擎的倒排索引的基础上,实现了分块索引,能够针对新的文件建立小文件索引,提升索引速度。
然后通过与原有索引的合并,达到优化的目的。
(3)优秀的面向对象的系统架构,使得对于Lucene扩展的学习难度降低,方便扩充新功能。
(4)设计了独立于语言和文件格式的文本分析接口,索引器通过接受Token流完成索引文件的创立,用户扩展新的语言和文件格式,只需要实现文本分析的接口。
(5)已经默认实现了一套强大的查询引擎,用户无需自己编写代码即使系统可获得强大的查询能力,Lucene的查询实现中默认实现了布尔操作、模糊查询(Fuzzy
Search[11])、分组查询等等。
面对已经存在的商业全文检索引擎,Lucene也具有相当的优势。
首先,它的开发源代码发行方式(遵守Apache Software License[12]),在此基础上程序员不仅仅可以充分的利用Lucene 所提供的强大功能,而且可以深入细致的学习到全文检索引擎制作技术和面相对象编程的实践,进而在此基础上根据应用的实际情况编写出更好的更适合当前应用的全文检索引擎。
在这一点上,商业软件的灵活性远远不及Lucene。
其次,Lucene秉承了开放源代码一贯的架构优良的优势,设计了一个合理而极具扩充能力的面向对象架构,程序员可以在Lucene 的基础上扩充各种功能,比如扩充中文处理能力,从文本扩充到HTML、PDF[13]等等文本格式的处理,编写这些扩展的功能不仅仅不复杂,而且由于Lucene恰当合理的对系统设备做了程序上的抽象,扩展的功能也能轻易的达到跨平台的能力。
最后,转移到apache软件基金会后,借助于apache软件基金会的网络平台,程序员可以方便的和开发者、其它程序员交流,促成资源的共享,甚至直接获得已经编写完备的扩充功能。
最后,虽然Lucene使用Java语言写成,但是开放源代码社区的程序员正在不懈的将之使用各种传统语言实现(例如.net framework[14]),在遵守Lucene索引文件格式的基础上,使得Lucene能够运行在各种各样的平台上,系统管理员可以根据当前的平台适合的语言来合理的选择。
四、本文的重点问题与cLucene项目
作为中国人民大学信息学院99级本科生的一个毕业设计项目,我们对Lucene进行了深入的研究,包括系统的结构,索引文件结构,各个部分的实现等等。
并且我们启动了cLucene项目,做为一个Lucene的C++语言的重新实现,以期望带来更快的速度和更加广泛的应用范围。
我们先分析了系统结构,文件结构,然后在研究各个部分的具体实现的同时
开始进行的cLucene实现。
限于时间的限制,到本文完成为止,cLucene项目并没有完成,对于Lucene的具体实现部分也仅仅完成到了索引引擎部分。
接下来的部分,本文将对Lucene的系统结构、文件结构、索引引擎部分做一个彻底的分析。
以期望提供对Lucene全文检索引擎的系统架构和部分程序实现的清晰的了解。
cLucene项目则作为一个开放源代码的项目,继续进行的开发。
有关cLucene项目的一些信息:
⏹开发语言:ISO C++[15],STLport 4.5.3[16],OpenTop 1.1[17]
⏹目标平台:Win32,POSIX
⏹授权协议:GNU General Public License (GPL)[18]
Apache Lucene与其兄弟是经过了大规模测试的产品,他们已经为一些著名站点如Wikipedia、CNET及提供了搜索功能。
因此,没人会怀疑其功能与未来的发展。
Lucene并不是一个爬行搜索引擎,也不会自动地索引内容。
我们得先将要索引的文档中的文本抽取出来,然后再将其加到Lucene索引中。
标准的步骤是先初始化一个Analyzer、打开一个IndexWriter、然后再将文档一个接一个地加进去。
一旦完成这些步骤,索引就可以在关闭前得到优化,同时所做的改变也会生效。
这个过程可能比开发者习惯的方式更加手工化一些,但却在数据的索引上给予你更多的灵活性。
我们可以借助于一个对象模型来完成搜索,通过查询来建立条件。
其次,Lucene可以解析并执行(可能由最终用户输入的)普通文本搜索字符串。
使用.NET 3.5或后续版本的.NET开发者还有第三种选择:LINQ to Lucene。
其项目主页上有一张图清晰地描述了Lucene的搜索语法与相应的LINQ to Lucene语法的区别。
导言
说起Apache Lucene,可以说无人不知,无人不晓,但是说道Apache Solr,恐怕知道的不多。
看看Apache Solr的说明:
Solr是一个基于Lucene java库的企业级搜索服务器,包含XML/HTTP,JSON API, 高亮查询结果,faceted search(不知道该如何翻译,片段式搜索),缓存,复制还有一个WEB管理界面。
Solr运行在Servlet容器中。
所以Solr和Lucene的本质区别有以下三点:搜索服务器,企业级和管理。
Lucene本质上是搜索库,不是独立的应用程序,而Solr是。
Lucene专注于搜索底层的建设,而Solr专注于企业应用。
Lucene不负责支撑搜索服务所必须的管理,而Solr负责。
所以说,一句话概括Solr: Solr是Lucene面向企业搜索应用的扩展。
在本篇文章中,我们先看看Solr向我们承诺了什么,或者说Solr宣称的特性们。
无废话Solr
Solr是一个拥有象WebService一样接口的独立运行的搜索服务器。
你将能够通过HTTP协议以XML格式将文档放入搜索服务器(这个过程叫做索引),你能够通过HTTP协议的GET来查询搜索服务器并且得到XML格式的结果。
Solr的特性包括:
∙高级的全文搜索功能
∙专为高通量的网络流量进行的优化
∙基于开放接口(XML和HTTP)的标准
∙综合的HTML管理界面
∙可伸缩性-能够有效地复制到另外一个Solr搜索服务器
∙使用XML配置达到灵活性和适配性
∙可扩展的插件体系
Solr使用Lucene并且扩展了它!
∙一个真正的拥有动态域(Dynamic Field)和唯一键(Unique Key)的数据模式(Data Schema)
∙对Lucene查询语言的强大扩展!
∙支持对结果进行动态的分组和过滤
∙高级的,可配置的文本分析
∙高度可配置和可扩展的缓存机制
∙性能优化
∙支持通过XML进行外部配置
∙拥有一个管理界面
∙可监控的日志
∙支持高速增量式更新(Fast incremental Updates)和快照发布(Snapshot Distribution)
Schema(模式)
∙定义域类型和文档的域
∙能够驱动智能处理
∙声明式的Lucene分析器规范
∙动态域能够随时增加域
∙拷贝域功能允许对一个域进行多种方式的索引,或者将多个域联合成一个可搜索的域
∙显式类型能够减少对域类型的猜测
∙能够使用外部的基于文件的终止词列表,同义词列表和保护词列表的配置
查询
∙拥有可配置响应格式(XML/XSLT,JSON,Python,Ruby)的HTTP接口
∙高亮的上下文搜索结果
∙基于域值和显式查询的片段式搜索(Faceted Search)
∙对查询语言增加了排序规范
∙常量的打分范围(Constant scoring range)和前缀式查询-没有idf,coord,或者lengthNorm因子,对查询匹配的词没有数量限制∙函数查询(Function Query)-通过关于一个域的数值或顺序的函数对打分进行影响
∙性能优化
核心
∙可插拔的查询句柄(Query Handler)和可扩展的XML数据格式
∙使用唯一键的域能够增强文档唯一性
∙能够高效地进行批量更新和删除
∙用户可配置的文档索引变化触发器(命令)
∙并发控制的搜索器
∙能够正确处理数字类型,从而能够进行排序和范围搜索
∙能够控制缺失排序域的文档
∙支持搜索结果的动态分组
缓存
∙可配置的查询结果,过滤器,和文档缓存实例
∙可插拔的缓存实现
∙后台缓存热启:当一个新的搜索器被打开时,可配置的搜索将它热启,避免第一个结果慢下来,当热启时,当前搜索器处理目前的请求(???)。
∙后台自动热启:当前搜索器缓存中最常访问的项目在新的搜索器中再次生成,能够在索引器和搜索器变化的时候高速缓存常查询的结果∙快速和小的过滤器实现
∙支持自动热启的用户级别的缓存
复制
∙能够将使用rsync传输时改变的索引部分有效的发布
∙使用拉策略(Pull Strategy)来简化增加搜索器
∙可配置的发布间隔能够允许对时间线和缓存使用进行权衡选择
管理接口
∙能够对缓存使用,更新和查询进行综合统计
∙文本分析调试器,能够显示每个分析器每个阶段的结果
∙基于WEB的查询和调试输出:解析查询输出,Lucene的explain方法细节,能够解释为何某个文档打分低,被排除在结果中等等
索引和搜索
索引是现代搜索引擎的核心,建立索引的过程就是把源数据处理成非常方便查询的索引文件的过程。
为什么索引这么重要呢,试想你现在要在大量的文档中搜索含有某个关键词的文档,那么如果不建立索引的话你就需要把这些文档顺序的读入内存,然后检查这个文章中是不是含有要查找的关键词,这样的话就会耗费非常多的时间,想想搜索引擎可是在毫秒级的时间内查找出要搜索的结果的。
这就是由于建立了索引的原因,你可以把索引想象成这样一种数据结构,他能够使你快速的随机访问存储在索引中的关键词,进而找到该关键词所关联的文档。
Lucene 采用的是一种称为反向索引(inverted index)的机制。
反向索引就是说我们维护了一个词 / 短语表,对于这个表中的每个词 / 短语,都有一个链表描述了有哪些文档包含了这个词 / 短语。
这样在用户输入查询条件的时候,就能非常快的得到搜索结果。
我们将在本系列文章的第二部分详细介绍 Lucene 的索引机制,由于 Lucene 提供了简单易用的 API,所以即使读者刚开始对全文本进行索引的机制并不太了解,也可以非常容易的使用 Lucene 对你的文档实现索引。
对文档建立好索引后,就可以在这些索引上面进行搜索了。
搜索引擎首先会对搜索的关键词进行解析,然后再在建立好的索引上面进行查找,最终返回和用户输入的关键词相关联的文档。
图1. 搜索应用程序和Lucene 之间的关系。