`
q474818917
  • 浏览: 39012 次
  • 性别: Icon_minigender_1
  • 来自: 扬州
社区版块
存档分类
最新评论

Lucene倒排索引原理

阅读更多

这篇文章是转的,写的相当不错

Lucene是一个高性能的java全文检索工具包,它使用的是倒排文件索引结构。该结构及相应的生成算法如下:
  
  0)设有两篇文章1和2
  文章1的内容为:Tom lives in Guangzhou,I live in Guangzhou too.
  文章2的内容为:He once lived in Shanghai.
  
  1)由于lucene是基于关键词索引和查询的,首先我们要取得这两篇文章的关键词,通常我们需要如下处理措施
  a.我们现在有的是文章内容,即一个字符串,我们先要找出字符串中的所有单词,即分词。英文单词由于用空格分隔,比较好处理。中文单词间是连在一起的需要特殊的分词处理。
  b.文章中的”in”, “once” “too”等词没有什么实际意义,中文中的“的”“是”等字通常也无具体含义,这些不代表概念的词可以过滤掉
  c.用户通常希望查“He”时能把含“he”,“HE”的文章也找出来,所以所有单词需要统一大小写。
  d.用户通常希望查“live”时能把含“lives”,“lived”的文章也找出来,所以需要把“lives”,“lived”还原成“live”
  e.文章中的标点符号通常不表示某种概念,也可以过滤掉
  在lucene中以上措施由Analyzer类完成
  
  经过上面处理后
   文章1的所有关键词为:[tom] [live] [guangzhou] [i] [live] [guangzhou]
   文章2的所有关键词为:[he] [live] [shanghai]
  
  2) 有了关键词后,我们就可以建立倒排索引了。上面的对应关系是:“文章号”对“文章中所有关键词”。倒排索引把这个关系倒过来,变成:“关键词”对“拥有该关键词的所有文章号”。文章1,2经过倒排后变成
  关键词 文章号
  guangzhou 1
  he 2
  i 1
  live 1,2
  shanghai 2
  tom 1
  
  通常仅知道关键词在哪些文章中出现还不够,我们还需要知道关键词在文章中出现次数和出现的位置,通常有两种位置:a)字符位置,即记录该词是 文章中第几个字符(优点是关键词亮显时定位快);b)关键词位置,即记录该词是文章中第几个关键词(优点是节约索引空间、词组(phase)查询 快),lucene 中记录的就是这种位置。
  
  加上“出现频率”和“出现位置”信息后,我们的索引结构变为:
  关键词 文章号[出现频率] 出现位置
  guangzhou 1[2] 3,6
  he 2[1] 1
  i 1[1] 4
  live 1[2],2[1] 2,5,2
  shanghai 2[1] 3
  tom 1[1] 1
  
  以live 这行为例我们说明一下该结构:live在文章1中出现了2次,文章2中出现了一次,它的出现位置为“2,5,2”这表示什么呢?我们需要结合文章号和出现 频率来分析,文章1中出现了2次,那么“2,5”就表示live在文章1中出现的两个位置,文章2中出现了一次,剩下的“2”就表示live是文章2中第 2个关键字。
  
  以上就是lucene索引结构中最核心的部分。我们注意到关键字是按字符顺序排列的(lucene没有使用B树结构),因此lucene可以用二元搜索算法快速定位关键词。
  
  实现时 lucene将上面三列分别作为词典文件(Term Dictionary)、频率文件(frequencies)、位置文件 (positions)保存。其中词典文件不仅保存有每个关键词,还保留了指向频率文件和位置文件的指针,通过指针可以找到该关键字的频率信息和位置信 息。
  
   Lucene中使用了field的概念,用于表达信息所在位置(如标题中,文章中,url中),在建索引中,该field信息也记录在词典文件中,每个关键词都有一个field信息(因为每个关键字一定属于一个或多个field)。
  
  为了减小索引文件的大小,Lucene对索引还使用了压缩技术。首先,对词典文件中的关键词进行了压缩,关键词压缩为<前缀长度,后 缀>,例如:当前词为“阿拉伯语”,上一个词为“阿拉伯”,那么“阿拉伯语”压缩为<3,语>。其次大量用到的是对数字的压缩,数字只 保存与上一个值的差值(这样可以减小数字的长度,进而减少保存该数字需要的字节数)。例如当前文章号是16389(不压缩要用3个字节保存),上一文章号 是16382,压缩后保存7(只用一个字节)。
  
   下面我们可以通过对该索引的查询来解释一下为什么要建立索引。
  假设要查询单词 “live”,lucene先对词典二元查找、找到该词,通过指向频率文件的指针读出所有文章号,然后返回结果。词典通常非常小,因而,整个过程的时间是毫秒级的。
  而用普通的顺序匹配算法,不建索引,而是对所有文章的内容进行字符串匹配,这个过程将会相当缓慢,当文章数目很大时,时间往往是无法忍受的。

分享到:
评论

相关推荐

    面试指南-Lucene-ES篇-课件

    - #### 倒排索引的原理以及它是用来解决哪些问题(谈谈你对倒排索引的理解) - #### 倒排索引底层数据结构(倒排索引的数据结构) - #### 倒排表的压缩算法(底层算法) - #### Trie字典树(Prefix Trees)原理...

    Lucene原理.pptx

    lucene最新版本底层技术讲解,全文检索(Full-text Search),倒排索引,FST,SkipList,或运算,与运算

    Lucene 原理 介绍

    Lucene是一个高性能的java全文检索工具包,它使用的是倒排文件索引结构。该结构及相应的生成算法如下:...

    Lucene 原理与代码分析完整版.pdf

    3. 合并相同的词(Term)成为文档倒排(Posting List)链表。 ......................................... 18 四、如何对索引进行搜索? ..............................................................................

    Elasticsearch+技术解析与实战-1

     1.2.2 Lucene倒排索引  1.3 基础知识  1.3.1 Elasticsearch术语及概念  1.3.2 JSON介绍  1.4 安装配置  1.4.1 安装Java  1.4.2 安装Elasticsearch  1.4.3 配置  1.4.4 运行  1.4.5 停止  ...

    搜索引擎---面试笔记3

    倒排索引了解吗? 面试官心理分析 问这个,其实面试官就是要看看你了解不了解 es 的一些基本原理,因为用 es 无非就是写入数据,搜索数据。你要是不明白你发起一个写入和搜索请求的时候,es 在干什么,那你真的是......

    搜索引擎----面试笔记2

    你知道倒排索引的原理吗?现在早已经 out 了,因为现在很多项目都是直接用基于 lucene 的分布式搜索引擎—— ElasticSearch,简称为 es。 而现在分布式搜索基本已经成为大部分互联网行业的 Java 系统的标配,其中尤...

    概念原理.md

    Lucene 索引又由很多分段组成,每个分段都是一个倒排索引。ES 每次 “refresh” 都会生成一个新的分段,其中包含若干文档的数据。在每个分段内部,文档的不同字段被单独建立索引。每个字段的值由若干词(Term)组成...

    海量数据引擎SF1R.zip

    Zambezi索引来自于 Zambezi 项目,索引的原理可以参考相关的论文,这是传统倒排索引结构里的最佳设计之一,因为它可以做到在 提供实时搜索的功能下不损失查询性能,因此非常适合作为Twitter或者微博搜索服务。在...

    Java高级架构面试知识点整理.pdf

    10.倒排索引了解吗? 11.es 在数据量很大的情况下(数十亿级别)如何提高查询效率啊? 12.es 生产集群的部署架构是什么?每个索引的数据量大概有多少?每个索引大概有多少个分片? 13.项目中缓存是如何使用的?

    Elasticsearch 技术解析与实战.zip

    前言 第1章 Elasticsearch入门 1 1.1 Elasticsearch是什么 1 1.1.1 Elasticsearch的历史 2 1.1.2 相关产品 3 1.2 全文搜索 3 1.2.1 Lucene介绍 4 1.2.2 Lucene倒排索引 4 1.3 基础知识 6 1.3.1 Elasticsearch术语及...

    Nutch入门.rar

    5.2.3 倒排索引(inverted index)....29 5.2.4其它...29 5.3 搜索...29 5.4 分析...30 5.5 nutch的其他一些特性..31 6. nutch分析方法和工具........33 6.1 Crawldb......33 6.2 Linkdb........35 6.3 ...

    nutch 初学文档教材

    5.2.3 倒排索引(inverted index)....29 5.2.4其它...29 5.3 搜索...29 5.4 分析...30 5.5 nutch的其他一些特性..31 6. nutch分析方法和工具........33 6.1 Crawldb......33 6.2 Linkdb........35 6.3 Segments....35...

    微信公众平台应用开发:方法、技巧与案例.(机械工业.柳峰)

     11.2.2 倒排索引结构 286  11.2.3 索引和检索原理 288  11.2.4 常用API介绍 288  11.2.5 Lucene的评分机制 290  11.2.6 案例:使用Lucene索引和检索 291  11.3 中文分词 296  11.3.1 中文分词方法 ...

Global site tag (gtag.js) - Google Analytics