1 / 35

关于 Lucene 的一点总结

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

idalia
Download Presentation

关于 Lucene 的一点总结

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 最关心的一些问题: Lucene是一个怎样的系统 Lucene可以干嘛 Lucene的原理 关于Lucene的一点总结 谭望达

  2. Lucene之根本

  3. Lucene之文件格式 Lucene具有类似于XML的文件格式 <Title> 蜗居 </Title> <Abstract> 反映了房价居高不下, 官商勾结, 与年轻人买房难的一些故事 </Abstract > <Content> ... </Content>

  4. Lucene之解析器(Analyzer) Lucene解析器的优势: • 扩展性好, 可以随意定制, 可以解析任意格式文档 • Lucene自带的包中已经有很多现成的解析器了 TokenFilter Analyzer Tokenizer Jode IS a dog jode \ dog Jode \ IS \ a \ dog 我们需要做的就是把原类继承, 实现其方法即可

  5. Lucene之基本规则(1) Lucene的基本类型 • Byte: 是最基本的类型,长8位(bit)。 • UInt32:由4个Byte组成。 • UInt64:由8个Byte组成。 • VInt: 变长的整形 • Chars: 是UTF-8编码的一系列Byte。 • Strings: 一个字符串首先是一个VInt来表示此字符串包含的字符的个数,接着便是UTF-8编码的字符序列Chars

  6. Lucene之基本规则(2) • 前缀-后缀规则(Prefix+Suffix)

  7. Lucene之基本规则(3) • 差值规则

  8. Lucene之基本规则(4) • 或然跟随规则(A, B?)

  9. Lucene之基本规则(5) • 跳跃表规则

  10. Lucene之索引结构(1) • 一个词典(比如四库全书)如果太大, 怎么办呢? • 一部电视剧(比如西游记)如果太长怎么办呢? • 一部游戏(魔兽世界)如果太好玩怎么办呢? • 那么一个索引如果太复杂怎么办呢? 对了, 这就是段索引,所有的段索引组成了一个完整的索引!

  11. Lucene之索引结构(2) Fields .Fnm文件 .Fdx文件 .Fdt文件 指针 指针 .tis文件 .tii文件 字典 Lucene索引文件结构 Postings 频率 .frq文件 .prx文件 位置 规则化 .f(n)文件 Segments .segments文件

  12. Lucene之索引合并(1) • Lucene的索引合并是Lucene的一个非常经典的内容 • 常见的合并索引的方式: • 1. 每加入一篇文章就重新生成索引 (代价好高!) • 2. 或者增量索引, 也就是每加入一篇文章就对索引进行修改, (代价也不小!) • 可以说, 评价一个搜索引擎的好坏, 可以看看他对增加删除文档的支持程度如何

  13. Lucene之索引合并(2) • Lucene的索引宏观合并过程如下 一篇文档 一篇文档 一篇文档 ……… 在内存中 到达了一个阈值, Lucene默认为10 内存中生成索引 并写入磁盘(段索引) 重复这个过程… 一段索引 一段索引 一段索引 ……… 在磁盘中

  14. Lucene之索引合并(3) • Lucene的索引宏观合并过程如下(续) 一段索引 一段索引 一段索引 ……… 在磁盘中 到达了一个阈值, Lucene默认为10 启动合并过程

  15. Lucene之索引合并(4) • Lucene的索引微观合并过程如下 启动合并过程 合并前的准备 合并Field 合并Posting fdx fnm tis … 再Hash, 重新完成 归并排序, 重构跳跃表

  16. Lucene的索引合并(5) • Lucene的索引合并创新之处 Lucene使用内存与磁盘作为缓存, 进行批量和增量的索引操作, 把小的索引合并到大的索引中 在不影响检索效率的前提下, 提高了索引的效率 大部分的搜索引擎(数据库)都是使用B树来维护索引结构. 索引的更新会导致大量的IO操作 Others Lucene

  17. Lucene之查询模型与评分方式(1) • 查询模型 • 向量模型 • Lucene在评估查询语句与Document之间的符合程度时用了向量模型. • 布尔模型 • Lucene在词汇的逻辑设置中使用了布尔模型. 评分方式

  18. Lucene之查询模型与评分方式(2) 协调函数, 当某个Document中包含的query数量多, 就返回较高的权重数值 是query的规范化函数, 这个函数不影响document的评价, 因为所有的document都会乘上这个规格化因子的数值, 这个函数只是对query起作用.

  19. Lucene之查询模型与评分方式(3) 是查询的时候增加的权重, 完全凭个人喜好添加 是文档的标准化因子, 参见后面的内容

  20. Lucene之查询准备 获得索引文件名前缀 获得Field名称及特性 读取字典文件到内存中 得到频率和位置信息

  21. 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

  22. Lucene之查询过程 布尔 词条 Query 对文档的 相似度计算(见下页) 模糊 Scorer 对应的打分器 打分, 获取Top K的文档指针 取得搜索结果

  23. Lucene相似度计算(1) • 假设有这样的一个查询: • 魔兽 dota英雄 • 有下面几篇文档: • (doc 1) dota里面的英雄都是来自魔兽 • (doc 2)黄继光是一个英雄 • (doc 3)我最爱的魔兽英雄是恶魔猎手 • 整理出一个倒排表(仅保留查询关键字):

  24. Lucene相似度计算(2) • 计算: • DocFreq(单词在所有文档中的出现次数), 全局 • TF(单词在某篇文档中的出现次数), 局部(需要重新计算) • IDF, 单词的稀有程度, 局部 • 把表格补充完整:

  25. Lucene相似度计算(3) • 第一种方法: • 遍历每一篇文档,然后把得分加起来, 保留Top K • 时间复杂度 --- O(文档总数) • 空间复杂度 --- O(1), 文档不读入内存, 在磁盘中读取

  26. Lucene相似度计算(4) • 第二种方法: • 遍历查询单词, 然后遍历倒排表中该单词对应的全部文档,完成这个步骤后再对文档排序 • 时间复杂度 --- O(文档总数(最坏情况)) • 空间复杂度 --- O(文档总数(最坏情况))

  27. Lucene相似度计算(5) • 并发合并

  28. Lucene相似度计算(5) • 块处理

  29. Lucene之查询部分 • 标准化因子部分(1): • 不同的文档重要性不同。有的文档重要些,有的文档相对不重要,比如对于做软件的,在索引书籍的时候,我想让计算机方面的书更容易搜到,而文学方面的书籍搜索时排名靠后。 • 不同的域重要性不同。有的域重要一些,如关键字,如标题,有的域不重要一些,如附件等。同样一个词(Term),出现在关键字中应该比出现在附件中打分要高。 • 根据词(Term)在文档中出现的绝对次数来决定此词对文档的重要性,有不合理的地方。比如长的文档词在文档中出现的次数相对较多,这样短的文档比较吃亏。比如一个词在一本砖头书中出现了10次,在另外一篇不足100字的文章中出现了9次,就说明砖头书应该排在前面码?不应该,显然此词在不足100字的文章中能出现9次,可见其对此文章的重要性。

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

  31. Lucene之查询部分 • 标准化因子部分(3):

  32. Lucene之构造分布式引擎 • Hadoop + Lucene构建分布式引擎 参考资料: http://lucene.apache.org/hadoop/

  33. Lucene之抓取器 • Nutch– 基于Lucene的开源搜索引擎 参考资料: lucene.apache.org/nutch/

  34. 从Lucene中学到更多 • Lucene是一个面向对象程序设计的典范, 所有问题都是通过一个额外的抽象层来方便以后的扩展和重用(Strategy模式) • 简单的应用入口来调用一系列底层代码(example代码非常简单) • 除了灵活的接口设计, 还提供了一系列可以直接使用的Analyzer, 方便使用

  35. 参考资料: • 车东的Lucene站点 http://www.chedong.com/tech/lucene.html • Lucene学习总结http://forfuture1978.javaeye.com/blog/546824 • <Lucene分析与应用> 机械工业出版社, 吴众欣 等

More Related