Lucene(v4.5) 深入学习(一)
原理
花了两三天把《Lucene原理与代码分析》的主要内容看了遍,之后开始看官网上的文档。《Lucene原理与代码分析》的作者分析的对象是Lucene2.9,我分析的对象是Lucene4.5,而Lucene当前的最新版本为4.7。4.x版本和2.x版区别非常大(4.5和4.7的区别也不小,汗),最终能借鉴《Lucene原理与代码分析》的东西十分有限,但《原理》对我来说确实起到了很好的指导作用。
本系列的细节内容依据官网文档和源码,小部分说明图截自《原理》。另外,如有需要会说明4.5和4.7的区别。
Lucene简介
定义
Apache Lucene是一个高性能(high-performance)的全能的全文检索(full-featured text search engine)的搜索引擎框架库,完全(entirely)使用Java开发。它是一种技术(technology),适合于(suitable for)几乎(nearly)任何一种需要全文检索(full-text search)的应用,特别是跨平台(cross-platform)的应用。
建索引,搜索流程与Lucene各模块的对应关系
1.Lucene的analysis 模块主要负责词法分析及语言处理而形成Term。
2.Lucene的index模块主要负责索引的创建,里面有IndexWriter。
3.Lucene的store模块主要负责索引的读写。
4.Lucene的QueryParser主要负责语法分析。
5.Lucene的search模块主要负责对索引的搜索。
6.Lucene的similarity模块主要负责对相关性打分的实现。
Lucene的文件格式
基本数据类型
1.Byte:是最基本的类型,长8位(bit)。
2.UInt32:由4 个Byte 组成。
3.UInt64:由8 个Byte 组成。
4.VInt:变长的整数类型
5.Chars:是UTF-8 编码的一系列Byte。
6.String:一个字符串首先是一个VInt 来表示此字符串包含的字符的个数,接着便是UTF-8编码的字符序列Chars。
下图是VInt类型的例子,每个Byte中的第一位用于标记后面紧跟的Byte是不是属于同一个数字。其中1表示属于。
索引使用的数据压缩方法
主要有四种方法,这些方法在搜索引擎中都属于常见技术。这里的名称参考《Lucene原理与代码分析》。
前缀+后缀
差值
或然跟随规则
图是从《Lucene原理与代码分析》来的,不过作者的解释把问题复杂化了,还是官方文档的说明清楚明了。
官方文档直接举了个例子,例子是这样的:
一个term在文档7中出现一次,在文档11中出现3次,如何记录这些信息?如果单纯利用差值规则记录文档,应为7,4。为了节约空间,如果term只出现一次就直接依附于前面的文档编号记录,方法是使文档编号左移一位(7×2=14),并在末位置1(14+1=15)。如果出现不止一次,那么就使用另一种方法:对于文档11,同样使文档编号左移一位(4×2=8),后面的一个记录单元记录次数3。于是最后形成的文件中的记录为15, 8, 3。所以如果代表文档的数字是偶数,那么意味着后面跟着的记录单元里存放的是次数。