原文链接 http://www.cnblogs.com/dewin/archive/2009/11/24/1609905.html

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] [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先对词典二元查找、找到该词,通过指向频率文件的指针读出所有文章号,然后返回结果。

词典通常非常小,因而,整个过程的时间是毫秒级的。
  而用普通的顺序匹配算法,不建索引,而是对所有文章的内容进行字符串匹配,

这个过程将会相当缓慢,当文章数目很大时,时间往往是无法忍受的。

正向索引与倒排索引的关系与区别
 
正向索引是经过搜索引擎对页面文本分词、消噪、去重、提取关键词后,得到的能够反映页面主体内容的一个关键词组成的集合。
同时记录每一个关键词在页面上的出现频率、出现次数、格式、位置。这样,每个页面都可以被记录为一个关键词的元组,
其中包含每个关键词的词频、格式、位置等权重信息。
正向索引不能直接用于排名。如果只存在正向索引,排名程序需要扫描所有索引库中的文件,找出包含关键词的文件,
再进行相关性计算,这样的计算量无法满足实时返回排名结果的要求。
所以搜索引擎会将正向索引数据仓库重新构造为倒排索引,把文件对应到关键词的映射转换为关键词到文件的映射。
在倒排索引中关键词是主键,每个关键词都对应着一系列文件,这些文件中都出现了这个关键词。
这样当用户搜索某个关键词时,排序程序在倒排索引中定位到这个关键词就可以马上找出所有包含这个关键词的文件。

转载于:https://www.cnblogs.com/ihongyan/p/4804890.html

【转】Lucene 工作原理相关推荐

  1. Elasticsearch 查询数据的工作原理是什么?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:8rr.co/GsAa 面试题 ES 写入数据的工作原理是什 ...

  2. ES 查询数据的工作原理是什么?

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | http://8rr.co/GsAa 面试题 ...

  3. es 删除数据_es 写入数据的工作原理是什么啊?es 查询数据的工作原理是什么啊?...

    面试题 es 写入数据的工作原理是什么啊?es 查询数据的工作原理是什么啊?底层的 lucene 介绍一下呗?倒排索引了解吗? 面试官心理分析 问这个,其实面试官就是要看看你了解不了解 es 的一些基 ...

  4. elasticsearch 工作原理_【154期】面试官:你能说说 Elasticsearch 查询数据的工作原理是什么吗?...

    点击上方"Java面试题精选",关注公众号 面试刷图,查缺补漏 >>号外:往期面试题,10篇为一个单位归置到本公众号菜单栏->面试题,有需要的欢迎翻阅 阶段汇总集 ...

  5. 轻松了解面试官心理!ElasticSearch写入数据的工作原理是什么? | 技术头条

    戳蓝字"CSDN云计算"关注我们哦! 作者:手留余香 转自: Java架构沉思录 面试题 es 写入数据的工作原理是什么啊?es 查询数据的工作原理是什么啊?底层的 lucene ...

  6. ElasticSearch面试 - es 写入数据的工作原理是什么啊?

    ElasticSearch面试 - es 写入数据的工作原理是什么啊? 面试题 es 写入数据的工作原理是什么啊?es 查询数据的工作原理是什么啊?底层的 lucene 介绍一下呗?倒排索引了解吗? ...

  7. Lucene底层原理和优化经验分享(1)-Lucene简介和索引原理

    基于Lucene检索引擎我们开发了自己的全文检索系统,承担起后台PB级.万亿条数据记录的检索工作,这里向大家分享下Lucene底层原理研究和一些优化经验. 从两个方面介绍: 1. Lucene简介和索 ...

  8. ElasticSearch工作原理解读及一些思考

    一.概述 在此之前,一直想写关于 ES 相关的文章,但是工作实在太忙,没能抽空完成,今天刚好有时间,那我们就先来总结一下 ES 相关的知识点,学习一个新东西一定要先从整体去看全局,然后再到局部去了解细 ...

  9. Elasticsearch工作原理

    一.关于搜索引擎 各位知道,搜索程序一般由索引链及搜索组件组成. 索引链功能的实现需要按照几个独立的步骤依次完成:检索原始内容.根据原始内容来创建对应的文档.对创建的文档进行索引. 搜索组件用于接收用 ...

最新文章

  1. R语言使用psych包的fa函数对指定数据集进行因子分析(输入数据为相关性矩阵)、使用rotate参数指定进行斜交旋转提取因子、使用fa.diagram函数可视化斜交旋转因子分析、并解读可视化图形
  2. gcc选项-g与-rdynamic的异同
  3. 20年总结,21年展望
  4. Java课程设计——坦克大战
  5. opencv随机数的产生
  6. Shell中创建序列和数组(list、array)的方法
  7. mysql sequence 关键字_mysql增加sequence功能
  8. 【Git】撤销已经git add的文件
  9. python函数应用(1)
  10. 编程语言之问:何时该借用,何时该创造?
  11. mongo源码学习(四)服务入口点ServiceEntryPoint
  12. 现代软件工程_项目回顾模板
  13. wo-27s管理员账户和密码_获取电信天翼网关超级密码,修改路由模式为桥接模式...
  14. 根据经纬度定位用户所在城市
  15. 计算机网络子网斜杠后面的含义,ip地址后面的斜杠24是什么意思
  16. matlab怎么取小数点后十五位,matlab 如何取出小数点后第几位数
  17. 全国大学生数学建模竞赛国家一等奖论文数学模型超全资料分享小白必备资料
  18. i技术会 | 如何用AI挖掘和生成视频广告点位
  19. 天池比赛二手车预测Task5-模型融合
  20. 如何搭建web服务器

热门文章

  1. SpringMVC第五次课 SSM整合
  2. python集合的运算、不使用有的运算符_无序的集合:Python中的数学集合运算
  3. sublime搭建python开发环境_使用sublime搭建python开发环境
  4. matlab怎么删除上一条命令_怎么恢复电脑上删除的图片?四大步搞定
  5. 干货|对某杀猪盘的渗透测试
  6. Python基于python实现的http+json协议接口自动化测试框架源码(实用改进版)
  7. Json Schema快速入门
  8. 【Nutch2.2.1基础教程之2.2】集成Nutch/Hbase/Solr构建搜索引擎之二:内容分析
  9. Apache Iceberg 快速入门
  10. PU learning学习笔记