1.3 Lucene简介
Lucene是一个免费、开源、高性能、纯Java编写的全文检索引擎。
在业务开发场景中,Lucene几乎适用任何需要全文检索的场景。因此,应普遍的搜索开发需求,各种编程语言的Lucene版本不断涌现。目前,Lucene先后发展出了C++、C#、Perl和Python等语言的版本,Lucene逐渐成为开源代码中最好的全文检索引擎工具包。
2005年,Lucene升级成为Apache顶级项目。
Lucene包含大量相关项目,核心项目有Lucene Core、Solr和PyLucene。
需要指出的是,Lucene仅仅是一个工具包,它并非一个完整的全文检索引擎,这和Lucene的初衷相关。Lucene主要为软件开发人员提供一个简单易用的工具包,主要提供倒排索引的查询结构,以方便软件开发人员在其业务系统中实现全文检索的功能。这也是我们常说全文检索引擎主要是Solr和Elasticsearch的原因,虽然二者均是以Lucene为基础建立的。
Lucene作为一个全文检索引擎工具包,具有如下突出优点。
索引文件格式独立于应用平台
Lucene定义了一套以8位字节为基础的索引文件格式,使得兼容系统或者不同平台的应用能够共享建立的索引文件。
索引速度快
在传统全文检索引擎的倒排索引的基础上,实现了分块索引,能够针对新的文件建立小文件索引,提升索引速度。然后通过与原有索引的合并,达到优化的目的。
简单易学
优秀的面向对象的系统架构,降低了Lucene扩展的学习难度,方便扩充新功能。
跨语言
设计了独立于语言和文件格式的文本分析接口,索引器通过接收Token流完成索引文件的创立,用户扩展新的语言和文件格式,只需实现文本分析的接口即可。
强大的查询引擎
Lucene默认实现了一套强大的查询引擎,用户无须自己编写代码即可通过系统获得强大的查询能力。Lucene默认实现了布尔操作、模糊查询、分组查询等。
Lucene的主要模块有Analysis模块、Index模块、Store模块、QueryParser模块、Search模块和Similarity模块,各模块的功能分别汇总如下。
① Analysis模块:主要负责词法分析及语言处理,也就是我们常说的分词,通过该模块可最终形成存储或者搜索的最小单元Term。
② Index模块:主要负责索引的创建工作。
③ Store模块:主要负责索引的读和写,主要是对文件的一些操作,其主要目的是抽象出和平台文件系统无关的存储。
④ QueryParser模块:主要负责语法分析,把查询语句生成Lucene底层可以识别的条件。
⑤ Search模块:主要负责对索引的搜索工作。
⑥ Similarity模块:主要负责相关性打分和排序的实现。
在Lucene中,还有一些核心术语,主要涉及Term、词典(Term Dictionary,也叫作字典)、倒排表(Posting List)、正向信息和段(Segment),这些术语的含义汇总如下。
① Term:索引中最小的存储和查询单元。对于英文语境而言,一般是指一个单词;对于中文语境而言,一般是指一个分词后的词。
② 词典:是Term的集合。词典的数据结构有很多种,各有优缺点。如可以通过排序数组(通过二分查找来检索数据)、HashMap(哈希表,检索速度更快,属于空间换时间的模式)、FST(Finite-State Transducer,有很好的压缩率)等来实现。
③ 倒排表:一篇文章通常由多个词组成,倒排表记录的是某个词在哪些文章中出现过。
④ 正向信息:原始的文档信息,可以用来做排序、聚合、展示等。
⑤ 段:索引中最小的独立存储单元。一个索引文件由一个或者多个段组成。在Lucene中,段有不变性,段一旦生成,在段上只能读取、不可写入。