391 likes | 857 Views
最关心的一些问题: Lucene 是一个怎样的系统 Lucene 可以干嘛 Lucene 的原理. 关于 Lucene 的一点总结. 谭望达. Lucene 之根本. Lucene 之文件格式. Lucene 具 有类似于 XML 的文件格式. <Title> 蜗居 </Title> <Abstract> 反 映了房价居高不下 , 官商勾结 , 与年轻人买房难的一些故事 </Abstract > <Content> ... </Content>. Lucene 之解析器 (Analyzer). Lucene 解析器的优势 :
E N D
最关心的一些问题: Lucene是一个怎样的系统 Lucene可以干嘛 Lucene的原理 关于Lucene的一点总结 谭望达
Lucene之文件格式 Lucene具有类似于XML的文件格式 <Title> 蜗居 </Title> <Abstract> 反映了房价居高不下, 官商勾结, 与年轻人买房难的一些故事 </Abstract > <Content> ... </Content>
Lucene之解析器(Analyzer) Lucene解析器的优势: • 扩展性好, 可以随意定制, 可以解析任意格式文档 • Lucene自带的包中已经有很多现成的解析器了 TokenFilter Analyzer Tokenizer Jode IS a dog jode \ dog Jode \ IS \ a \ dog 我们需要做的就是把原类继承, 实现其方法即可
Lucene之基本规则(1) Lucene的基本类型 • Byte: 是最基本的类型,长8位(bit)。 • UInt32:由4个Byte组成。 • UInt64:由8个Byte组成。 • VInt: 变长的整形 • Chars: 是UTF-8编码的一系列Byte。 • Strings: 一个字符串首先是一个VInt来表示此字符串包含的字符的个数,接着便是UTF-8编码的字符序列Chars
Lucene之基本规则(2) • 前缀-后缀规则(Prefix+Suffix)
Lucene之基本规则(3) • 差值规则
Lucene之基本规则(4) • 或然跟随规则(A, B?)
Lucene之基本规则(5) • 跳跃表规则
Lucene之索引结构(1) • 一个词典(比如四库全书)如果太大, 怎么办呢? • 一部电视剧(比如西游记)如果太长怎么办呢? • 一部游戏(魔兽世界)如果太好玩怎么办呢? • 那么一个索引如果太复杂怎么办呢? 对了, 这就是段索引,所有的段索引组成了一个完整的索引!
Lucene之索引结构(2) Fields .Fnm文件 .Fdx文件 .Fdt文件 指针 指针 .tis文件 .tii文件 字典 Lucene索引文件结构 Postings 频率 .frq文件 .prx文件 位置 规则化 .f(n)文件 Segments .segments文件
Lucene之索引合并(1) • Lucene的索引合并是Lucene的一个非常经典的内容 • 常见的合并索引的方式: • 1. 每加入一篇文章就重新生成索引 (代价好高!) • 2. 或者增量索引, 也就是每加入一篇文章就对索引进行修改, (代价也不小!) • 可以说, 评价一个搜索引擎的好坏, 可以看看他对增加删除文档的支持程度如何
Lucene之索引合并(2) • Lucene的索引宏观合并过程如下 一篇文档 一篇文档 一篇文档 ……… 在内存中 到达了一个阈值, Lucene默认为10 内存中生成索引 并写入磁盘(段索引) 重复这个过程… 一段索引 一段索引 一段索引 ……… 在磁盘中
Lucene之索引合并(3) • Lucene的索引宏观合并过程如下(续) 一段索引 一段索引 一段索引 ……… 在磁盘中 到达了一个阈值, Lucene默认为10 启动合并过程
Lucene之索引合并(4) • Lucene的索引微观合并过程如下 启动合并过程 合并前的准备 合并Field 合并Posting fdx fnm tis … 再Hash, 重新完成 归并排序, 重构跳跃表
Lucene的索引合并(5) • Lucene的索引合并创新之处 Lucene使用内存与磁盘作为缓存, 进行批量和增量的索引操作, 把小的索引合并到大的索引中 在不影响检索效率的前提下, 提高了索引的效率 大部分的搜索引擎(数据库)都是使用B树来维护索引结构. 索引的更新会导致大量的IO操作 Others Lucene
Lucene之查询模型与评分方式(1) • 查询模型 • 向量模型 • Lucene在评估查询语句与Document之间的符合程度时用了向量模型. • 布尔模型 • Lucene在词汇的逻辑设置中使用了布尔模型. 评分方式
Lucene之查询模型与评分方式(2) 协调函数, 当某个Document中包含的query数量多, 就返回较高的权重数值 是query的规范化函数, 这个函数不影响document的评价, 因为所有的document都会乘上这个规格化因子的数值, 这个函数只是对query起作用.
Lucene之查询模型与评分方式(3) 是查询的时候增加的权重, 完全凭个人喜好添加 是文档的标准化因子, 参见后面的内容
Lucene之查询准备 获得索引文件名前缀 获得Field名称及特性 读取字典文件到内存中 得到频率和位置信息
Lucene之查询语法 • Lucene的查询分析器为我们提供了丰富的查询语法, 整合了JavaCC的词法分析器 • 项查询: let it be “hello world” • 域查询: title:”The A” And Text:go • 词条查询: te?tte*t • 模糊查询: roam~ roam~0.8 • 间距查询: “jakarta apache” ~10 • 范围查询: title : {Aida TO Carmen} • 权重查询: jakarta^4 apache • 布尔查询: jakarta OR apache
Lucene之查询过程 布尔 词条 Query 对文档的 相似度计算(见下页) 模糊 Scorer 对应的打分器 打分, 获取Top K的文档指针 取得搜索结果
Lucene相似度计算(1) • 假设有这样的一个查询: • 魔兽 dota英雄 • 有下面几篇文档: • (doc 1) dota里面的英雄都是来自魔兽 • (doc 2)黄继光是一个英雄 • (doc 3)我最爱的魔兽英雄是恶魔猎手 • 整理出一个倒排表(仅保留查询关键字):
Lucene相似度计算(2) • 计算: • DocFreq(单词在所有文档中的出现次数), 全局 • TF(单词在某篇文档中的出现次数), 局部(需要重新计算) • IDF, 单词的稀有程度, 局部 • 把表格补充完整:
Lucene相似度计算(3) • 第一种方法: • 遍历每一篇文档,然后把得分加起来, 保留Top K • 时间复杂度 --- O(文档总数) • 空间复杂度 --- O(1), 文档不读入内存, 在磁盘中读取
Lucene相似度计算(4) • 第二种方法: • 遍历查询单词, 然后遍历倒排表中该单词对应的全部文档,完成这个步骤后再对文档排序 • 时间复杂度 --- O(文档总数(最坏情况)) • 空间复杂度 --- O(文档总数(最坏情况))
Lucene相似度计算(5) • 并发合并
Lucene相似度计算(5) • 块处理
Lucene之查询部分 • 标准化因子部分(1): • 不同的文档重要性不同。有的文档重要些,有的文档相对不重要,比如对于做软件的,在索引书籍的时候,我想让计算机方面的书更容易搜到,而文学方面的书籍搜索时排名靠后。 • 不同的域重要性不同。有的域重要一些,如关键字,如标题,有的域不重要一些,如附件等。同样一个词(Term),出现在关键字中应该比出现在附件中打分要高。 • 根据词(Term)在文档中出现的绝对次数来决定此词对文档的重要性,有不合理的地方。比如长的文档词在文档中出现的次数相对较多,这样短的文档比较吃亏。比如一个词在一本砖头书中出现了10次,在另外一篇不足100字的文章中出现了9次,就说明砖头书应该排在前面码?不应该,显然此词在不足100字的文章中能出现9次,可见其对此文章的重要性。
Lucene之查询部分 • 标准化因子部分(2): 由于以上原因,Lucene在计算Term Weight时,都会乘上一个标准化因子(Normalization Factor),来减少上面三个问题的影响。 标准化因子(Normalization Factor)是会影响随后打分(score)的计算的,Lucene的打分计算一部分发生在索引过程中,一般是与查询语句无关的参数如标准化因子.
Lucene之查询部分 • 标准化因子部分(3):
Lucene之构造分布式引擎 • Hadoop + Lucene构建分布式引擎 参考资料: http://lucene.apache.org/hadoop/
Lucene之抓取器 • Nutch– 基于Lucene的开源搜索引擎 参考资料: lucene.apache.org/nutch/
从Lucene中学到更多 • Lucene是一个面向对象程序设计的典范, 所有问题都是通过一个额外的抽象层来方便以后的扩展和重用(Strategy模式) • 简单的应用入口来调用一系列底层代码(example代码非常简单) • 除了灵活的接口设计, 还提供了一系列可以直接使用的Analyzer, 方便使用
参考资料: • 车东的Lucene站点 http://www.chedong.com/tech/lucene.html • Lucene学习总结http://forfuture1978.javaeye.com/blog/546824 • <Lucene分析与应用> 机械工业出版社, 吴众欣 等