35
关关 Lucene 关 关关关 关关关关 关关关关 一: 1. Lucene 是 是是是是是是 一统 2. Lucene 是是是是 3. Lucene 是是是 是是是

关于 Lucene 的一点总结

  • Upload
    idalia

  • View
    207

  • Download
    0

Embed Size (px)

DESCRIPTION

最关心的一些问题: Lucene 是一个怎样的系统 Lucene 可以干嘛 Lucene 的原理. 关于 Lucene 的一点总结. 谭望达. Lucene 之根本. Lucene 之文件格式. Lucene 具 有类似于 XML 的文件格式. 蜗居 反 映了房价居高不下 , 官商勾结 , 与年轻人买房难的一些故事 ... . Lucene 之解析器 (Analyzer). Lucene 解析器的优势 : - PowerPoint PPT Presentation

Citation preview

Page 1: 关于 Lucene 的一点总结

关于 Lucene 的一点总结

最关心的一些问题:1. Lucene 是一个怎样的系统2. Lucene 可以干嘛3. Lucene 的原理

谭望达

Page 2: 关于 Lucene 的一点总结

Lucene 之根本

                        

Page 3: 关于 Lucene 的一点总结

Lucene 之文件格式

Document

Field1

Token Token

Field2

Token Token

Lucene 具有类似于 XML 的文件格式

<Title>蜗居</Title><Abstract>反映了房价居高不下 , 官商勾结 , 与年轻人买房难的一些故事</Abstract ><Content>...</Content>

Page 4: 关于 Lucene 的一点总结

Lucene 之解析器 (Analyzer)

Lucene 解析器的优势 :1. 扩展性好 , 可以随意定制 , 可以解析任意格式文档2. Lucene 自带的包中已经有很多现成的解析器了

Analyzer

Tokenizer

TokenFilter

我们需要做的就是把原类继承 , 实现其方法即可

Jode IS a dog

Jode \ IS \ a \ dog

jode \ dog

Page 5: 关于 Lucene 的一点总结

Lucene 之基本规则 (1)

Lucene 的基本类型 Byte : 是最基本的类型,长 8 位 (bit) 。 UInt32 :由 4 个 Byte 组成。 UInt64 :由 8 个 Byte 组成。 VInt : 变长的整形 Chars: 是 UTF-8 编码的一系列 Byte 。 Strings: 一个字符串首先是一个 VInt 来表示

此字符串包含的字符的个数,接着便是 UTF-8 编码的字符序列 Chars

Page 6: 关于 Lucene 的一点总结

Lucene 之基本规则 (2)

前缀 - 后缀规则 (Prefix+Suffix)

Page 8: 关于 Lucene 的一点总结

Lucene 之基本规则 (4)

或然跟随规则 (A, B?)

Page 10: 关于 Lucene 的一点总结

Lucene 之索引结构 (1)

一个词典 ( 比如四库全书 ) 如果太大 , 怎么办呢 ? 一部电视剧 ( 比如西游记 ) 如果太长怎么办呢 ? 一部游戏 ( 魔兽世界 ) 如果太好玩怎么办呢 ?

那么一个索引如果太复杂怎么办呢 ?

对了 , 这就是段索引 , 所有的段索引组成了一个完整的索引 !

Page 11: 关于 Lucene 的一点总结

Lucene 之索引结构 (2)

Lucene索引文件结构

Fields .Fnm 文件 .Fdx 文件 .Fdt 文件

指针

Postings

字典

频率

位置

.tis 文件 .tii 文件

.frq 文件

.prx 文件

指针

规则化 .f(n) 文件

Segments

.segments 文件

Page 12: 关于 Lucene 的一点总结

Lucene 的索引合并是 Lucene 的一个非常经典的内容

常见的合并索引的方式 : 1. 每加入一篇文章就重新生成索引 ( 代价好

高 !) 2. 或者增量索引 , 也就是每加入一篇文章就对

索引进行修改 , ( 代价也不小 !) 可以说 , 评价一个搜索引擎的好坏 , 可以

看看他对增加删除文档的支持程度如何

Lucene 之索引合并 (1)

Page 13: 关于 Lucene 的一点总结

Lucene 之索引合并 (2)

Lucene 的索引宏观合并过程如下

一篇文档 一篇文档 一篇文档 在内存中………

内存中生成索引并写入磁盘 ( 段索引 )

到达了一个阈值 , Lucene 默认为10

一段索引 一段索引 一段索引 在磁盘中………

重复这个过程…

Page 14: 关于 Lucene 的一点总结

Lucene 之索引合并 (3)

Lucene 的索引宏观合并过程如下 ( 续 )

一段索引 一段索引 一段索引 在磁盘中………

到达了一个阈值 , Lucene 默认为10

启动合并过程

Page 15: 关于 Lucene 的一点总结

Lucene 之索引合并 (4)

Lucene 的索引微观合并过程如下

启动合并过程

合并前的准备

fdx

fnm

tis

合并 Field合并

Posting

再 Hash, 重新完成 归并排序 , 重构跳跃表

Page 16: 关于 Lucene 的一点总结

Lucene 的索引合并 (5)

Lucene 的索引合并创新之处

大部分的搜索引擎( 数据库 ) 都是使用 B树来维护索引结构 . 索引的更新会导致大量的 IO 操作

Lucene 使用内存与磁盘作为缓存 , 进行批量和增量的索引操作 , 把小的索引合并到大的索引中 在不影响检索效率的前提下 , 提高了索引的效率

Others Lucene

Page 17: 关于 Lucene 的一点总结

Lucene 之查询模型与评分方式 (1)

查询模型 向量模型 Lucene 在评估查询语句与 Document 之间的符合程度时用

了向量模型 .

布尔模型 Lucene 在词汇的逻辑设置中使用了布尔模型 .

评分方式

Page 18: 关于 Lucene 的一点总结

Lucene 之查询模型与评分方式 (2)

协调函数 , 当某个 Document 中包含的 query 数量多 , 就返回较高的权重数值

是 query 的规范化函数 , 这个函数不影响 document 的评价 , 因为所有的 document 都会乘上这个规格化因子的数值 , 这个函数只是对 query起作用 .

Page 19: 关于 Lucene 的一点总结

Lucene 之查询模型与评分方式 (3)

是查询的时候增加的权重 , 完全凭个人喜好添加

是文档的标准化因子 , 参见后面的内容

Page 20: 关于 Lucene 的一点总结

Lucene 之查询准备

获得索引文件名前缀

获得 Field名称及特性

读取字典文件到内存中

得到频率和位置信息

Page 21: 关于 Lucene 的一点总结

Lucene 之查询语法

Lucene 的查询分析器为我们提供了丰富的查询语法 , 整合了 JavaCC 的词法分析器

项查询 : let it be “hello world”域查询 : title:”The A” And Text:go 词条查询 : te?t te*t 模糊查询 : roam~ roam~0.8 间距查询 : “jakarta apache” ~10范围查询 : title : {Aida TO Carmen}权重查询 : jakarta^4 apache布尔查询 : jakarta OR apache

Page 22: 关于 Lucene 的一点总结

Lucene 之查询过程

Query

布尔

词条

模糊对文档的相似度计算 ( 见下页 )

Scorer

对应的打分器打分 , 获取 Top K 的文档指针

取得搜索结果

Page 23: 关于 Lucene 的一点总结

Lucene 相似度计算 (1)

假设有这样的一个查询 : 魔兽 dota 英雄

有下面几篇文档 : (doc 1) dota里面的英雄都是来自魔兽 (doc 2)黄继光是一个英雄 (doc 3) 我最爱的魔兽 英雄是恶魔猎手

整理出一个倒排表 (仅保留查询关键字 ):Doc ID 魔兽 Dota 英雄1 1 1 1

2 NULL NULL 1

3 1 NULL 1

Page 24: 关于 Lucene 的一点总结

Lucene 相似度计算 (2)

计算 : DocFreq(单词在所有文档中的出现次数 ), 全局 TF(单词在某篇文档中的出现次数 ), 局部 ( 需要重新计算 ) IDF, 单词的稀有程度 , 局部

把表格补充完整 :Doc ID 魔兽 Dota 英雄1 1 1 1

2 NULL NULL 1

3 1 NULL 1

DocFreq 2 1 3

IDF 0.18 0.47 0

Page 25: 关于 Lucene 的一点总结

Lucene 相似度计算 (3)

第一种方法 : 遍历每一篇文档 , 然后把得分加起来 , 保留 Top K

时间复杂度 --- O( 文档总数 )空间复杂度 --- O(1), 文档不读入内存 , 在磁盘中读取

Page 26: 关于 Lucene 的一点总结

Lucene 相似度计算 (4)

第二种方法 : 遍历查询单词 , 然后遍历倒排表中该单词对应的全部

文档 ,完成这个步骤后再对文档排序 时间复杂度 --- O( 文档总数 ( 最坏情况 ))空间复杂度 --- O( 文档总数 ( 最坏情况 ))

Page 27: 关于 Lucene 的一点总结

Lucene 相似度计算 (5)

并发合并

Page 28: 关于 Lucene 的一点总结

Lucene 相似度计算 (5)

块处理

Page 29: 关于 Lucene 的一点总结

Lucene 之查询部分

标准化因子部分 (1): 不同的文档重要性不同。有的文档重要些,有的文档相对不重要,

比如对于做软件的,在索引书籍的时候,我想让计算机方面的书更容易搜到,而文学方面的书籍搜索时排名靠后。

不同的域重要性不同。有的域重要一些,如关键字,如标题,有的域不重要一些,如附件等。同样一个词 (Term) ,出现在关键字中应该比出现在附件中打分要高。

根据词 (Term) 在文档中出现的绝对次数来决定此词对文档的重要性,有不合理的地方。比如长的文档词在文档中出现的次数相对较多,这样短的文档比较吃亏。比如一个词在一本砖头书中出现了 10次,在另外一篇不足 100 字的文章中出现了 9次,就说明砖头书应该排在前面码?不应该,显然此词在不足 100 字的文章中能出现 9次,可见其对此文章的重要性。

Page 30: 关于 Lucene 的一点总结

Lucene 之查询部分

标准化因子部分 (2):由于以上原因, Lucene 在计算 Term Weight 时,都会乘上一个标准化因子 (Normalization Factor) ,来减少上面三个问题的影响。标准化因子 (Normalization Factor) 是会影响随后打分(score) 的计算的, Lucene 的打分计算一部分发生在索引过程中,一般是与查询语句无关的参数如标准化因子 .

Page 31: 关于 Lucene 的一点总结

Lucene 之查询部分

标准化因子部分 (3):

Page 32: 关于 Lucene 的一点总结

Lucene 之构造分布式引擎

Hadoop + Lucene 构建分布式引擎

参考资料 : http://lucene.apache.org/hadoop/

Page 33: 关于 Lucene 的一点总结

Lucene 之抓取器

Nutch – 基于 Lucene 的开源搜索引擎

参考资料 : lucene.apache.org/nutch/

Page 34: 关于 Lucene 的一点总结

从 Lucene 中学到更多

Lucene 是一个面向对象程序设计的典范 , 所有问题都是通过一个额外的抽象层来方便以后的扩展和重用 (Strategy 模式 )

简单的应用入口来调用一系列底层代码(example代码非常简单 )

除了灵活的接口设计 , 还提供了一系列可以直接使用的 Analyzer, 方便使用

Page 35: 关于 Lucene 的一点总结

参考资料 :

车东的 Lucene 站点 http://www.chedong.com/tech/lucene.html Lucene 学习总结

http://forfuture1978.javaeye.com/blog/546824

<Lucene 分析与应用 > 机械工业出版社 , 吴众欣 等