Lucene (v4.5) 深入学习(一) —— 原理

来源:互联网 发布:阴茎粗大的感受 知乎 编辑:程序博客网 时间:2024/06/03 20:31


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截图

建索引,搜索流程与Lucene各模块的对应关系

lucene模块和搜索过程B
lucene模块和搜索过程A
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表示属于。
vint

索引使用的数据压缩方法

主要有四种方法,这些方法在搜索引擎中都属于常见技术。这里的名称参考《Lucene原理与代码分析》。

前缀+后缀

主要用于term字符串的压缩。
前缀后缀

差值

用于压缩文档号之类的东西。
差值

或然跟随规则

图是从《Lucene原理与代码分析》来的,不过作者的解释把问题复杂化了,还是官方文档的说明清楚明了。
跟随
官方文档直接举了个例子,例子是这样的:
一个term在文档7中出现一次,在文档11中出现3次,如何记录这些信息?如果单纯利用差值规则记录文档,应为7,4。为了节约空间,如果term只出现一次就直接依附于前面的文档编号记录,方法是使文档编号左移一位(7×2=14),并在末位置1(14+1=15)。如果出现不止一次,那么就使用另一种方法:对于文档11,同样使文档编号左移一位(4×2=8),后面的一个记录单元记录次数3。于是最后形成的文件中的记录为15, 8, 3。所以如果代表文档的数字是偶数,那么意味着后面跟着的记录单元里存放的是次数。

跳跃表

常见数据结构。
跳跃表

More from site: http://www.abyssss.com/?p=232

1 0
原创粉丝点击