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

设有两篇文章1和2:
文章1的内容为:Tom lives in Guangzhou, I live in Guangzhou too.
文章2的内容为:He once lived in Shanghai.

由于lucene是基于关键词索引和查询的,首先我们要取得这两篇文章的关键词,处理措施如下:
a. 分词处理。英文单词由于用空格分隔,比较好处理。中文单词间是连在一起的需要特殊的分词处理。
b. 文章中的“in”,“once”,“too”等词没有什么实际意义,中文中的“的”,“是”等字通常也无具体含义,这些不代表概念的词可以过滤掉。
c. 所有单词不区分大小写。
d. 用户通常希望查“live”时能把含“lives”,“lived”的文章也找出来,故把“lives”,“lived”还原成“live”。
e. 文章中的标点符号通常不表示某种概念,也可以过滤掉。
在lucene中以上措施由Analyzer类完成。
经过上面处理后
文章1的所有关键词为:[tom] [live] [guangzhou] [i] [live] [guangzhou]
文章2的所有关键词为:[he] [live] [shanghai]

有了关键词后,我们就可以建立倒排索引了。上面的对应关系是:“文章号”对应“文章中所有关键词”。倒排索引把这个关系倒过来,变成:“关键词”对应“拥有该关键词的所有文章号”。

文章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”,这表示什么呢?我们需要结合文章号和出现频率来分析。

实现时lucene将上面三列分别作为词典文件(Term Dictionary)、频率文件(Frequencies)、位置文件(Positions)保存。其中词典文件不仅保存有每个关键词,还保留了指向频率文件和位置文件的指针,通过指针可以找到该关键字的频率信息和位置信息。
Lucene中使用了field的概念,用于表达信息所在位置(如标题中,文章中,URL中),在建索引时,该field信息也记录在词典文件中,每个关键词都有一个field信息(因为每个关键字一定属于一个或多个field)。
为了减小索引文件的大小,Lucene对索引还使用了压缩技术。首先,对词典文件中的关键词进行了压缩,关键词压缩为<前缀长度,后缀>,例如:当前词为“阿拉伯语”,前缀为“阿拉伯”,那么“阿拉伯语”压缩为<3,语>。其次大量用到的是对数字的压缩,数字只保存与上一个值的差值(这样可以减小数字的长度,进而减少保存该数字需要的字节数)。例如当前文章号是16389(不压缩要用3个字节保存),上一文章号是16382,压缩后保存7(只用一个字节)

下面我们可以通过对该索引的查询来解释一下为什么要建立索引。
假设要查询单词 “live”,lucene先对词典二元查找、找到该词,通过指向频率文件的指针读出所有文章号,然后返回结果。词典通常非常小,因而,整个过程的时间是毫秒级的。
而用普通的顺序匹配算法,不建索引,而是对所有文章的内容进行字符串匹配,这个过程将会相当缓慢,当文章数目很大时,时间往往是无法忍受的。

Lucene Inverted index(倒排索引)原来快速入门相关推荐

  1. 易优cms 去除URL中的index.php Eyoucms快速入门

    针对不同服务器.虚拟空间,运行PHP的环境也有所不同,目前主要分为:Nginx.apache.IIS以及其他服务器.下面分享如何去掉URL上的index.php字符,记得在管理后台清除缓存,对于一些E ...

  2. 易优cms iis怎么去掉index.php Eyoucms快速入门

    iis去掉'index.php的方法:首先打开"URL重写",并点击右侧栏"导入规则":然后填入重写规则,并点击右侧"应用"提交:最后关闭窗 ...

  3. ElasticSearch快速入门实战

    一.ElasticSearch简介 1.简介 创始人是Shay Banon(谢巴农),它是java开发,是凯源的企业级搜索引擎,能够实现实时搜索,特点是稳定.可靠.快速,并且安装使用方便.(内置JDK ...

  4. ElasticSearch 学习笔记(一):倒排索引(Inverted index)

    分析一个术语,要先从名称入手 倒排索引,英文原名Inverted index,大概因为 Invert 有颠倒的意思,就被翻译成了倒排.但是倒排这个名称很容易让人理解为从A-Z颠倒成Z-A.个人觉得翻译 ...

  5. Lucene第一篇【介绍Lucene、快速入门】

    tags: Lucene 什么是Lucene?? Lucene是apache软件基金会发布的一个开放源代码的全文检索引擎工具包,由资深全文检索专家Doug Cutting所撰写,它是一个全文检索引擎的 ...

  6. lucene快速入门_为Lucene选择快速唯一标识符(UUID)

    lucene快速入门 大多数使用Apache Lucene的搜索应用程序都会为每个索引文档分配一个唯一的ID(即主键). 尽管Lucene本身不需要这样做(它可能不太在乎!),但应用程序通常需要它以后 ...

  7. 倒排索引 inverted index

    2019独角兽企业重金招聘Python工程师标准>>> 1.什么是倒排索引. e>>>(⊙o⊙)- 这是我见过最垃圾的翻译了,完全让人误解他的意思. 这个名称很容易 ...

  8. MapReduce功能实现十---倒排索引(Inverted Index)

    MapReduce功能实现系列:       MapReduce功能实现一-Hbase和Hdfs之间数据相互转换       MapReduce功能实现二-排序       MapReduce功能实现 ...

  9. ElasticSearch快速入门

    官网地址(https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html)而且是中文的 Elastic的快速入门 1.基础 ...

最新文章

  1. 7 个漂亮的 JavaScript 的时间轴组件 [转]
  2. C#中String对象转换为Font对象的方法
  3. 再见 Maven,我用它!!!
  4. sap abap 对字符串的操作
  5. 关于Android Force Close 出现的原因 以及解决方法
  6. Java Ajax jsonp 跨域请求
  7. How to Avoid Producing Legacy Code at the Speed of Typing
  8. java中对象多态时成员变量,普通成员函数及静态成员函数的调用情况
  9. 爬虫-scrapy框架-起点中文网的爬取
  10. python第三方zip_python第三方包的几种安装方式
  11. 终端启动service和activity
  12. 苹果iPhone 13 Pro机型有望采用LTPO技术屏幕 支持120Hz刷新率
  13. oracle利用正则表达式判断字符串只包含数字
  14. k8s架构以及相关概念普及
  15. 编程新手导论(转载)
  16. Unity3D人体18节点骨骼动态简单点线模型的建立
  17. SpringMVC+vue实现前后端分离的旅游管理系统
  18. 聚类算法K-Means
  19. 关于智能运维(AIOps)的学与思
  20. Python批量获取手机号码归属地(图文展示)

热门文章

  1. oracle 数据库查询多条数据的一列值
  2. jQuery笔记总结
  3. window.history 和 DWZ 框架
  4. 反射小应用之DataTable和ListT互操作
  5. Client does not support authentication protocol requested by server;
  6. PHP从零开始--字段修饰符数据操作SQL语言
  7. ES6 的新特性总结
  8. iPhone6和iPhone6 plus的iOS8设计尺寸参考指南
  9. Activity Intent相关FLAG介绍
  10. docker --- mysql的部署