热门标签 | 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;时间往往是无法忍受的。


推荐阅读
  • 时序数据是指按时间顺序排列的数据集。通过时间轴上的数据点连接,可以构建多维度报表,揭示数据的趋势、规律及异常情况。 ... [详细]
  • 本文档提供了详细的MySQL安装步骤,包括解压安装文件、选择安装类型、配置MySQL服务以及设置管理员密码等关键环节,帮助用户顺利完成MySQL的安装。 ... [详细]
  • 多用户密码验证与加密登录系统
    本文介绍了一种基于多用户密码文件的加密登录方法,通过读取用户密码文件并使用简单的加密算法实现安全登录。文中详细描述了程序的设计思路及其实现过程。 ... [详细]
  • 本文旨在介绍一系列提升工作效率的浏览器插件和实用小工具,帮助用户在日常工作中更加便捷高效。内容由原作者授权发布。 ... [详细]
  • 解决远程桌面连接时的身份验证错误问题
    本文介绍了如何解决在尝试远程访问服务器时遇到的身份验证错误,特别是当系统提示‘要求的函数不受支持’时的具体解决步骤。通过调整Windows注册表设置,您可以轻松解决这一常见问题。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 部署solr建立nutch索引
    2019独角兽企业重金招聘Python工程师标准接着上篇nutch1.4的部署应用,我们来部署一下solr,solr是对lucene进行了封装的企 ... [详细]
  • Cadence SPB 16.5 安装指南与注意事项
    本文提供了详细的 Cadence SPB 16.5 安装步骤,包括环境配置、安装过程中的关键步骤以及常见问题的解决方案。适合初次安装或遇到问题的技术人员参考。 ... [详细]
  • C基本语法C程序可以定义为对象的集合,这些对象通过调用彼此的方法进行交互。现在让我们简要地看一下什么是类、对象,方法、即时变量。对象-对象具有状态和行为 ... [详细]
  • [编程题] LeetCode上的Dynamic Programming(动态规划)类型的题目
    继上次把backTracking的题目做了一下之后:backTracking,我把LeetCode的动态规划的题目又做了一下,还有几道比较难的Medium的题和Hard的题没做出来,后面会继续 ... [详细]
  • 构建高性能Feed流系统的设计指南
    随着移动互联网的发展,Feed流系统成为了众多社交应用的核心组成部分。本文将深入探讨如何设计一个高效、稳定的Feed流系统,涵盖从基础架构到高级特性的各个方面。 ... [详细]
  • 近期在研究Java IO流技术时,遇到了一个关于如何正确读取Doc文档而不出现乱码的问题。本文将详细介绍使用Apache POI库处理Doc和Docx文件的具体方法,包括必要的库引入和示例代码。 ... [详细]
  • 本文详细介绍了Java API中文文档的位置、用途及其查看方法,帮助开发者更高效地利用这一资源。 ... [详细]
  • IntelliJ IDEA配置微服务启动显示
    通过编辑IntelliJ IDEA的workspace.xml文件,可以实现微服务启动对象的显示。具体步骤包括定位并修改workspace.xml中的RunDashboard部分。 ... [详细]
  • 本文总结了在多人协作开发环境中使用 Git 时常见的问题及其解决方案,包括错误合并分支的处理、使用 SourceTree 查找问题提交、Git 自动生成的提交信息解释、删除远程仓库文件夹而不删除本地文件的方法、合并冲突时的注意事项以及如何将多个提交合并为一个。 ... [详细]
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社区 版权所有