Lucene Inverted index(倒排索引)原来快速入门

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先对词典二元查找、找到该词,通过指向频率文件的指针读出所有文章号,然后返回结果。词典通常非常小,因而,整个过程的时间是毫秒级的。
而用普通的顺序匹配算法,不建索引,而是对所有文章的内容进行字符串匹配,这个过程将会相当缓慢,当文章数目很大时,时间往往是无法忍受的。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/269357.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机二级word奇偶页眉页脚,Word怎样设置奇偶页眉和页码图解

给文档设置奇偶页码是计算机二级中必考的一项&#xff0c;并且你以后的工作中也会用到&#xff0c;许多人都觉得这个很难&#xff0c;接下来学习啦小编就教大家在Word中设置奇偶页不同的页眉和页码的操作方法。Word中设置奇偶页不同的页眉和页码的方法教大家设置在正文页上添加…

网络服务器有保存文件,将收到的图片保存到网络服务器上的文件夹

对于类似的功能(从装载Android的照片与Servlet)&#xff0c;这里的Android客户端的代码&#xff0c;我使用(在这里发帖而稍加编辑)&#xff1a;URI uri URI.create(// path to file);MultipartEntity entity new MultipartEntity(HttpMultipartMode.STRICT);// several key-v…

docker官方文档中的dns,link,expose,publish

link是过时的了&#xff0c;尽量不要用。 dns内部集成&#xff0c;也可以用外部。 expose只是用于记录&#xff0c;并不真的。 publish是否起作用&#xff0c;也要看情况&#xff0c;是否被占用端口。 -------------------------------------- Embedded DNS server Docker daem…

针对“零时差”*** 赛门铁克推免费杀毒软件

针对“零时差”*** 赛门铁克推免费杀毒软件 【eNet硅谷动力消息】据外电报道&#xff0c;从下个月开始&#xff0c;赛门铁克Norton用户将得到一款新的杀毒工具&#xff0c;该工具可以使他们避免遭受“零时差&#xff08;zero-day&#xff09;”***。 据悉&#xff0c;这款被称为…

删除git库中untracked files(未监控)的文件

在编译git库拉下来的代码时&#xff0c;往往会产生一些中间文件&#xff0c;这些文件我们根本不需要&#xff0c;尤其是在成产环节做预编译&#xff0c;检查代码提交是否能编译通过这种case时&#xff0c;我们往往需要编译完成后不管正确与否&#xff0c;还原现场&#xff0c;以…

mysql服务器没有及时响应,win10系统Mysql5.7服务启动报:1053错误:服务没有及时响应启动或控制请求...

SharePoint 2013 create workflow by SharePoint Designer 2013这篇文章主要基于上一篇http://www.cnblogs.com/qindy/p/6242714.html的基础上,create a sample workflow by SharePoint De ...thinkphp设置session有效时间thinkphp的框架文件 ThinkPHP/Common/functions.php fu…

为什么牛在天上飞,因为奇虎在地上吹

恶意软件采用各种Hook技术保护自己的文件&#xff0c;过滤或者拦截其他文件的操作&#xff0c;并在关机时自动进行注册以保证恢复。奇虎360安全卫士“破冰&#xff08;Kill Defence&#xff09;”技术能将恶意软件的这些操作全部撤销&#xff0c;让系统变得很干净&#xff0c;再…

ajax 小木虫,NIST数据库中Acc. 是什么 小木虫

满意答案ljjqrxrn2017.01.09采纳率&#xff1a;47% 等级&#xff1a;8已帮助&#xff1a;163人在线的好像查起来不方便还有有没有这本书&#xff1a;NIST-JANAF Thermochemical Tables, 4th EditionM. Chase Monograph No. 9: 1998, 1952 pages, 2 volumes, hardcover, ISBN…

【PHP】文件写入和读取详解

文章提纲&#xff1a;一&#xff0e;实现文件读取和写入的基本思路二&#xff0e;使用fopen方法打开文件三&#xff0e;文件读取和文件写入操作四&#xff0e;使用fclose方法关闭文件五&#xff0e;文件指针的移动六&#xff0e;Windows和UNIX下的回车和换行一&#xff0e;实现…

从此博客改变自己

第一篇文章&#xff0c;是写给自己的。大学四年&#xff0c;虽然学的是计算机&#xff0c;但由于自己荒废了最好的学习时光&#xff0c;到现在也只是一只菜鸟而已。走入社会后&#xff0c;激烈的竞争一层层的将自己淘汰下去。父母的日益老去&#xff0c;同时也伴随着不可预知的…

铂金9200系列 服务器,Intel 56核心至强铂金9200终于开卖:单机架1.5万个框框

去年4月初&#xff0c;Intel发布了代号Cascade Lake的第二代至强可扩展处理器&#xff0c;工艺和架构仍然是14nm Skylake-SP&#xff0c;但为了应对核心数量越来越多的AMD霄龙&#xff0c;打造了双芯封装的顶级铂金9200系列&#xff0c;最多56核心112线程。Intel现有架构单芯片…

poi实现Excel导入导出依赖

<!--文件上传组件--><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3.1</version></dependency><dependency><groupId>commons-io</groupI…

Java中List Set Map 是否有序等总结

1.Collection List Set Map 区别记忆 这些都代表了Java中的集合&#xff0c;这里主要从其元素是否有序&#xff0c;是否可重复来进行区别记忆&#xff0c;以便恰当地使用&#xff0c;当然还存在同步方面的差异&#xff0c;见上一篇相关文章。 有序否 允许元素重复否 Collecti…

Microsoft CRM 3.0 Mobile安装手记(二)——Server端安装

Microsoft CRM 3.0 Mobile分两部分安装&#xff1a;Server端和Mobile端。 Server端安装比较简单。第一步先将.NET Framework 2.0装上&#xff0c;然后去IIS里面检查一下&#xff0c;保证Microsoft CRM 3.0站点以及之下的MSCRMServices目录的ASP .NET版本还是保留1.1的版本。确认…

萌宠大作战服务器维护,萌宠大作战开服表

小时候最简单的快乐现在是否渐行渐远&#xff1f;如果能够在夏日蝉鸣的午后&#xff0c;回到那个快乐又简单的游戏童年&#xff0c;你愿意吗&#xff1f;还好&#xff0c;一款GBA高清像素重置类口袋游戏《萌宠大作战》就能治愈我们&#xff01;带你出走半生&#xff0c;归来仍是…

02ython基础知识(一)

Python基础知识&#xff08;一&#xff09; 变量 namemonkeyfx 变量定义的规则&#xff1a; 变量名只能是 字母、数字或下划线的任意组合变量名的第一个字符不能是数字以下关键字不能声明为变量名: [and, as, assert, break, class, continue, def, del, elif, else, except, e…

用DataTable.Merge()解决了一个排序问题

首先明确一点&#xff0c;DataTable不支持排序。在一个DataTable(dt)中已经存在无序数据&#xff0c;要实现排序&#xff0c;我想到了两个方法&#xff1a; 方法一&#xff1a;可以先构造一个列表(list),按排序顺序存储dt主键列的值; 然后主要是利用DataTable.Merge方法 1 Stro…