热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Lucene倒排索引

Lucene倒排索引倒排索引源于实际应用中需要根据属性的值来查找记录。这种索引表中的每一项都包括一个属性值和具有该属性值的各个记录的地址。由于不是由记录来确定属性值,

Lucene倒排索引

倒排索引源于实际应用中需要根据属性的值来查找记录。这种索引表中的每一项都包括一个属性值和具有该属性值的各个记录的地址。由于不是由记录来确定属性值,而是由属性值来确定记录的位置,因而成为倒排索引(inverted index)。带有倒排索引的文件我们成为倒排索引文件,简称倒排文件(inverted file)。

倒排索引中的索引对象是文档或者文档集合中的单词等,用来存储这些单词在一个文档或者一组文档中的存储位置,是对文档或者文档集合的一种最常用的索引机制。

搜索引擎的关键步骤就是建立倒排索引,倒排索引一般表示为一个关键词,然后是它的频度(出现的次数)、位置(出现在哪一篇文章或网页中,及有关的日期,作者等信息),好比一本书的目录、标签一般。读者想看哪一个主题相关的章节,直接根据目录即可找到相关的页面。不必再从书的第一页到最后一页,一页一页地查找。

假设有两篇文章1和文章2:

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

1. 取得关键词

由于Lucene是基于关键词索引和查询的,首先要取得这两篇文章的关键词,通常需要如下处理措施:

  • 我们现在有的是文章内容,即一个字符串,我们先要找出字符串中的所有单词,即分词。英文单词由于用空格分隔,比较好处理。中文单词间由于是连在一起的,所以需要特殊的分词处理。
  • 文章中的"in" “once” “too” 等词没有什么实际意义,中文中的"的" “是” 等字通常也无具体含义,这些不代表概念的词是可以过滤掉的。
  • 用户通常希望查 “He” 时能把含 “he” 和 “HE” 的文章也找出来,所以所有单词需要同一大小写。
  • 用户通常希望查 “live” 时能把含 “lives” 和 “lived” 的文章也找出来,所以需要把 “lives” ,“lived” 还原成 “live”。
  • 文章中的标点符号通常不表示某种概念,也可以过滤掉。

在Lucene中以上措施由Analyzer类完成。经过上面处理后,得到如下结果:

文章1的所有关键词为:[tom] [live] [guangzhou] [i] [live] [guangzhou]

文章2的所有关键词为:[he] [live] [shanghai]

2. 建立倒排索引:

有了关键词后,就可以建立倒排索引。上面的对应关系是:“文章号” 对 “文章中所有关键词” 。

倒排索引把这个关系倒过来,变成:“关键词” 对 “拥有关键词的所有文章号”。

倒排索引关键词文章号对应关系示例:

关键词文章号
guangzhou1
he2
i1
live1,2
shanghai2
tom1

通常仅知道关键词在哪些文章中出现还不够,还需要知道关键词在文章中出现的次数和位置,通常有两种位置:

  • 字符位置:记录该词是文章中第几个字符(优点是显示并定位关键词快)
  • 关键词位置:记录该词是文章中第几个关键词(优点是节约索引空间、词组查询快),Lucene中记录的就是这种位置

加上『出现频率』和『出现位置』信息后,索引结构如下:

关键词文章号[出现频率]出现位置
guangzhou1[2]3,6
he2[1]1
i1[1]4
live1[2]
2[1]
2,5
2
shanghai2[1]3
tom1[1]1

以live这行为例:live在文章1中出现了2次,文章2中出现了1次,它出现的位置为"2, 5, 2" 。

关键字是按字符顺序排列的(Lucene没有使用B树结构),因此Lucene可以用二元搜索算法快速定位关键词。

3. 实现

实现时,Lucene将上面三列分别作为词典文件(Term Dictionary)、频率文件(frequencies)、位置文件(positions)保存。

词典文件保存了每个关键词,还保留了指向频率文件和位置文件的指针,通过指针可以找到该关键词的频率信息和位置信息。

Lucene中使用了field的概念,用于表达信息所在的位置(如标题中、文章中,URL中),在建索引中,该field信息也记录在词典文件中,每个关键词都有一个field信息,因为每个关键字一定术语一个或多个field。

4. 压缩算法
为了减小索引文件的大小,Lucene对索引还使用了压缩技术。

首先&#xff0c;对词典文件中的关键词进行了压缩&#xff0c;关键词压缩为 <前缀长度&#xff0c;后缀>&#xff0c;例如&#xff1a;当前词为"阿里伯语"&#xff0c;上一个词为"阿拉伯"&#xff0c;那么"阿拉伯语"压缩为<3, 语>

其次大量用到的是对数字的压缩&#xff0c;数字只保存与上一个值的差值&#xff08;这样可以减少数字的长度&#xff0c;进而减少保存该数字需要的字节数&#xff09;。例如&#xff1a;当前文章号是16389&#xff08;不压缩需要用3个字节保存&#xff09;&#xff0c;上一文章号是16382&#xff0c;压缩后保存7&#xff08;只用一个字节&#xff09;。

5. 应用场景

假设要查询单词"live"&#xff0c;Lucene先对词典二元查找、找到该词&#xff0c;通过指向频率文件的指针读出所有文章号&#xff0c;然后返回结果。词典通常非常小&#xff0c;因而&#xff0c;整个过程的时间是毫秒级的。

而用普通的顺序匹配算法&#xff0c;不建索引&#xff0c;而是对所有文章的内容进行字符串匹配&#xff0c;这个过程会相当缓慢&#xff0c;当文章数目很大时&#xff0c;时间往往是无法忍受的。


推荐阅读
  • 本文由编程笔记#小编为大家整理,主要介绍了Nutch相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 提升Python编程效率的十点建议
    本文介绍了提升Python编程效率的十点建议,包括不使用分号、选择合适的代码编辑器、遵循Python代码规范等。这些建议可以帮助开发者节省时间,提高编程效率。同时,还提供了相关参考链接供读者深入学习。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • Ubuntu安装常用软件详细步骤
    目录1.GoogleChrome浏览器2.搜狗拼音输入法3.Pycharm4.Clion5.其他软件1.GoogleChrome浏览器通过直接下载安装GoogleChro ... [详细]
  • 统一知识图谱学习和建议:更好地理解用户偏好
    本文介绍了一种将知识图谱纳入推荐系统的方法,以提高推荐的准确性和可解释性。与现有方法不同的是,本方法考虑了知识图谱的不完整性,并在知识图谱中传输关系信息,以更好地理解用户的偏好。通过大量实验,验证了本方法在推荐任务和知识图谱完成任务上的优势。 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • 部署solr建立nutch索引
    2019独角兽企业重金招聘Python工程师标准接着上篇nutch1.4的部署应用,我们来部署一下solr,solr是对lucene进行了封装的企 ... [详细]
  • ES基本原理名词解释In-memorybuffer:ES内存缓冲区,新建的document写入的地方document:索引和搜索的 ... [详细]
  • mysql+全文检索设计,基于sphinx+mysql全文检索架构设计.doc
    基于sphinxmysql全文检索架构设计.doc还剩2页未读,继续阅读下载文档到电脑,马上远离加班熬夜!亲,喜欢就下载吧& ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
author-avatar
想要铭记的总是轻易忘却-
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有