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

2023-11-10

分析一个术语,要先从名称入手

倒排索引,英文原名Inverted index,大概因为 Invert 有颠倒的意思,就被翻译成了倒排。但是倒排这个名称很容易让人理解为从A-Z颠倒成Z-A。个人觉得翻译成反向索引更好。。。

倒排索引是区别于正排索引(forward index)来说的。

理论基础:首先文档是有许多的单词组成的,其中每个单词也可以在同一个文档中重复出现很多次,当然,同一个单词也可以出现在不同的文档中。

正排索引(forward index):

正排索引是从文档角度来找其中的单词,表示每个文档(用文档ID标识)都含有哪些单词,以及每个单词出现了多少次(词频)及其出现位置(相对于文档首部的偏移量)。所以每次搜索都是遍历所有文章。

倒排索引(inverted index):

倒排索引是从单词角度找文档,标识每个单词分别在那些文档中出现(文档ID),以及在各自的文档中每个单词分别出现了多少次(词频)及其出现位置(相对于该文档首部的偏移量)。

简单记为:
  • 正排索引:文档 ---> 单词
  • 倒排索引:单词 ---> 文档

倒排索引有着广泛的应用场景,比如搜索引擎、大规模数据库索引、文档检索、多媒体检索/信息检索领域等等。总之,倒排索引在检索领域是很重要的一种索引机制。

倒排索引由两个部分组成

  • 单词词典
  • 倒排文件。


倒排文件

所有单词的倒排列表顺序的存储在磁盘的某个文件里,这个文件即被称为倒排文件,倒排文件是存储倒排索引的物理文件。

单词词典

单词词典是由文档集合中出现过的所有单词构成的字符串集合,单词词典内每条索引项记载单词本身的一些信息以及指向“倒排列表”的指针。
单词词典是倒排索引中非常重要的组成部分,它是用来维护文档集合中所有单词的相关信息,同时用来记载某个单词对应的倒排列表在倒排文件中的位置信息。在支持搜索时,根据用户的查询词,去单词词典里查询,就能够获得相应的倒排列表。
对于一个规模很大的文档集合来说,可能包含了几十万甚至上百万的不同单词,
快速定位某个单词直接决定搜索的响应速度,所以我们需要很高效的数据结构对单词词典进行构建和查找。

常用的数据结构包含哈希加链表和树形词典结构。

------------------

搜索的过程:

当用户输入任意的词条时,

  1. 首先对用户输入的数据进行分词,得到用户要搜索的所有词条。
  2. 然后拿着这些词条去倒排索引列表中进行匹配。找到这些词条就能找到包含这些词条的所有文档的编号。
  3. 最后根据这些编号去文档列表中找到文档

创建倒排索引,分为以下几步:

  1. 创建文档列表:lucene首先对原始文档数据进行编号(DocID),形成列表,就是一个文档列表
  2. 创建倒排索引列表:然后对文档中数据进行分词,得到词条。对词条进行编号,以词条创建索引。然后记录下包含该词条的所有文档编号(及其它信息)。
下面举个例子

Elasticsearch 使用一种称为 倒排索引 的结构,它适用于快速的全文搜索。一个倒排索引由文档中所有不重复词的列表构成,对于其中每个词,有一个包含它的文档列表。

例如,假设我们有两个文档,每个文档的 content 域包含如下内容:
  • Doc_1:我爱北京天安门
  • Doc_2:我爱代码,代码爱我。

为了创建倒排索引,我们首先将每个文档的 content 域拆分成单独的 词(我们称它为 词条 或 tokens),创建一个包含所有不重复词条的排序列表,然后列出每个词条出现在哪个文档。结果如下所示:

1:分词

Doc_1:[我][爱][北京][天安门]

分词 北京 天安门
下标 1 2 3 4

Doc_2:[我][爱][代码],[代码][爱][我]。

分词 代码 代码
下标 1 2 3 4 5 6

2:创建文档列表

文档编号 文档内容
1 我爱北京天安门
2 我爱代码,代码爱我

3:创建倒排索引列表

关键词 文档号
1,2
1,2
北京 1
天安门  1

代码

2

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

  1. 字符位置,即记录该词是文章中第几个字符(优点是关键词亮显时定位快);
  2. 关键词位置,先把文章进行分词,然后记录该词是文章中第几个关键词(优点是节约索引空间、词组(phase)查询快),lucene中记录的就是这种方法。

lucene的实现

(ElasticSearch底层使用的lucenne)

实现时,lucene将上面三列分别作为词典文件(Term Dictionary)、频率文件(frequencies)、位置文件 (positions)保存。其中词典文件不仅保存有每个关键词,还保留了指向频率文件和位置文件的指针,通过指针可以找到该关键字的频率信息和位置信息。   
Lucene中使用了field的概念,用于表达信息所在位置(如标题中,文章中,url中),在建索引中,该field信息也记录在词典文件中,每个关键词都有一个field信息(因为每个关键字一定属于一个或多个field)。

加上“出现频率”和“出现位置”信息后,我们的索引结构变为:

现在,如果我们想搜索 “代码“,我们只需要查找包含每个词条的文档:

关键词 文章号 出现频率 出现位置
1,2 1,2 1,[1,6]
1,2 1,2 2,[2,5]
北京 1 1 3
天安门 1 1 4
代码 2 2 [3,4]

以“爱”这个词为例:“爱”在文章一中出现了1次,文章二中出现了2次,它的出现位置为 1和[1,6] 

这表示什么呢?

在文章一中出现了1次,那么 下标2 就表示“爱”在文章1中出现的位置。

在文章二中出现了2次,那么排除文章一中出现的一次,剩下的两个位置[2,5]就表示“爱”是在文章二下标为[2,5]处。   

以上就是lucene索引结构中最核心的部分。我们注意到关键字是按字符顺序排列的(lucene没有使用B树结构),因此lucene可以用二分搜索算法快速定位关键词。

为什么要建立索引?

下面我们可以通过对该索引的查询来解释一下为什么要建立索引。   

假设要查询单词 “爱”,普通的顺序匹配算法,不建索引,对所有文章的内容进行字符串匹配,这个过程将会相当缓慢,当文章数目很大时,时间往往是无法忍受的。

lucene先对词典二元查找、找到该词,通过指向频率文件的指针读出所有文章号,然后返回结果。词典通常非常小,因而,整个过程的时间是毫秒级的。   

参考:

https://www.zhihu.com/question/23202010

https://www.elastic.co/guide/cn/elasticsearch/guide/current/inverted-index.html

https://blog.csdn.net/u011239443/article/details/60604017

http://www.cnblogs.com/zlslch/p/6440114.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ElasticSearch 学习笔记(一):倒排索引(Inverted index) 的相关文章

随机推荐

  • Effective C++学习笔记

    Effective C 1 让自己习惯C 2 构造 析构 赋值运算 命名习惯 lhs left hand side rhs right hand side 指向一个T型对象 的指针命名pt 意思是 pointer to T 尽量以const
  • 一、数据挖掘概述

    数据挖掘介绍 1 数据挖掘的定义 数据挖掘 指从大量的数据中通过算法搜索隐藏于其中信息的过程 数据挖掘在面向用户的互联网产品中发挥着及其重要的作用 2 数据挖掘的对象 常见的数据挖掘对象有以下7大类 关系型数据库 MySQL 非关系系数据库
  • Visual Studio Community 2022(VS2022)安装方法

    直接上步骤 1 首先可以下载安装一个Visual Studio安装器 叫做Visual Studio installer 这个安装文件很小 很快就安装完成了 2 打开Visual Studio installer 小软件 3 按照开发需求选
  • RocketMQ消息幂等(去重)通用解决方案

    消息中间件是分布式系统常用的组件 无论是异步化 解耦 削峰等都有广泛的应用价值 我们通常会认为 消息中间件是一个可靠的组件 这里所谓的可靠是指 只要我把消息成功投递到了消息中间件 消息就不会丢失 即消息肯定会至少保证消息能被消费者成功消费一
  • 实验报告-python文库_python大作业实验报告

    python大作业实验报告 大学计算机基础 理工 大作业 暨南大学南校区生活指南系统 G108 甘颖欣 熊梦娜 翁婉晖 梁绮婷 李嘉顺 2015 1 32 目录 目录 2 暨南大学南校区生活指南系统 选题说明书 3 1 成员分组和任务分工
  • CSS —— 手摸手实现一个文字霓虹灯闪烁特效

    CSS 手摸手实现一个文字霓虹灯闪烁特效 一 了解 text shadow 属性 text shadow 属性应用于阴影文本 属于 CSS3 的属性 默认值为 none text shadow 属性连接一个或更多的阴影文本 属性是阴影 指定
  • 贪婪的非分层灰狼优化算法(G-NHGWO)(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 Matlab代码实现 4 参考文献 1 概述 狼优化 GWO 算法是基于灰狼社会等级及其
  • 织梦网站后台基本设置

    栏目概述 最主要还是说熟悉下网站后台基本设置 然后及我安装文件的常规操作 登陆网站后台 点击系统 基本参数 输入站点根网址 删除文档HTML默认保存路径a 填写下网站版权信息点击确定 小皮面板点击网站管理点开网站根目录删除install文件
  • java 输入_详解Java输入输出数据流模型和Web应用程序开发

    前言 Web应用开发架构技术不断的演化 从基于通用网关接口CGI开发的能够在操作系统上运行的独立组件 到专门的隔离运行的Servlet 一直到到现在我们对复杂应用开发使用Java EE技术或者Spring框架系列 其实其底层的核心逻辑基本上
  • Hystrix使用说明,配置参数说明

    四 配置信息 default或HystrixCommandKey 最常用的几项 超时时间 默认1000ms 单位 ms 1 hystrix command default execution isolation thread timeout
  • 1141:删除单词后缀(C C++)

    题目描述 给定一个单词 如果该单词以er ly或者ing后缀结尾 则删除该后缀 题目保证删除后缀后的单词长度不为0 否则不进行任何操作 输入 输入一行 包含一个单词 单词中间没有空格 每个单词最大长度为32 输出 输出按照题目要求处理后的单
  • BigQuery 如何帮助大规模交付业务型企业提供物联网解决方案

    介绍 Leverege是一家软件公司 它使全球市场领导者能够快速且经济高效地构建企业物联网应用程序 以提供以数据为中心的决策能力 优化运营 改善客户体验 交付客户价值并增加收入 Leverege 的主要 SaaS 产品 Leverege I
  • 不用虚拟机也能在Windows下使用Linux

    不用虚拟机也能在Windows下使用Linux 想学习热门的Linux系统 可是一开始就需要安装虚拟机软件 这样很容易消耗Linux初学者的热情 比如常用的VMWare虚拟机 虽然步骤并不复杂 但是一开始的搭建和配置过程 容易劝退一部分新手
  • 开源CA搭建-基于openssl实现数字证书的生成与分发

    目录 一 前言 二 openssl介绍 三 openssl的常用用法 一 单向加密 二 生成随机数 三 生成公钥 私钥 1 生成私钥 2 提取公钥 四 搭建CA 一 创建根CA私钥 二 生成自签名证书 三 创建数据库以及新颁发证书数字 四
  • Gitee Go代码格式审查、程序编译和冒烟测试

    本文分享自中移OneOS微信公众号 CI CD搭建流程 Gitee篇 作者 Kisann Gitee CI CD能力 Gitee 即码云 是OSCHINA NET推出的代码托管平台 已有超过600 万的开发者选择Gitee Gitee Go
  • ESP8266实现网页交互

    前言 物联网LOT intermet of things 时代 万物互联 wifi芯片是非常重要的 乐鑫的高性价比的ESP8266芯片凭借低功耗低成本高集成度等优势在市场上占有较高的份额 为什么选用这款芯片可以参考之前的调研报告 在之前的资
  • RBF神经网络参数的参数优化(进化算法)+Matlab源码

    RBF神经网络参数的参数优化 进化算法 1 RBF神经网络引入 1985年 Powell提出了多变量插值的径向基函数 RBF 方法 径向基函数是一个取值仅仅依赖于离原点距离的实值函数 也就是 x x 或者还可以是到任意一点c的距离 c点称为
  • aix系统常用的命令

    1 系统性能 1 看 CPU个数 lsdev C grep proc 几条记录就是几个CPU 注意考虑 AIX 5 3的 SMP 2 看每个CPU的大小 lsattr El proc0 3 看 内存条数 lsdev C grep mem 4
  • 借助LVS+Keepalived实现负载均衡

    借助LVS Keepalived实现负载均衡 一 负载均衡 必不可少的基础手段 1 1 找更多的牛来拉车吧 当前大多数的互联网系统都使用了服务器集群技术 集群即将相同服务部署在多台服务器上构成一个集群整体对外提供服务 这些集群可以是Web应
  • ElasticSearch 学习笔记(一):倒排索引(Inverted index)

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