一文读懂倒排序索引涉及的核心概念

news2025/1/31 8:13:51

基础概念

相信对于第一次接触Elasticsearch的同学来说,最难理解的概念就是倒排序索引(也叫反向索引),因为这个概念跟我们之前在传统关系型数据库中的索引概念是完全不同的!在这里我就重点给大家介绍一下倒排序索引,这个概念搞明白之后,然后学习Elasticsearch就会清晰很多了。

正向索引和倒排序索引

在没有搜索引擎时,我们是直接输入一个网址,然后获取网站内容,这时我们的行为是:

document -> to -> words 通过文章,获取里面的单词,此谓正向索引,forward index.

有了搜索引擎后,我们的行为是:输入一个单词,找到含有这个单词或者和这个单词有关系的文章:word -> to -> documents 我们把这种索引叫做inverted index,直译过来叫做倒排序索引,也叫反向索引。

倒排序索引是实现“单词-文档矩阵”的一种具体存储形式,通过倒排序索引,可以根据单词快速获取包含这个单词的文档列表。倒排序索引主要由两个部分组成:“单词词典”和“倒排文件”

倒排序索引中重要的概念

文档(Document)

一般搜索引擎的处理对象是互联网网页,而文档这个概念要更宽泛些,代表以文本形式存在的存储对象,相比网页来说,涵盖更多种形式,比如Word,PDF,html,XML等不同格式的文件都可以称之为文档

字段(Field)

可以理解成数据库行中的字段,一个Document会由一个或多个Field组成

文档编号(Document ID)

在搜索引擎内部,会将文档集合内每个文档赋予一个唯一的内部编号,以此编号来作为这个文档的唯一标识,这样方便内部处理,每个文档的内部编号即称之为“文档编号”,后文有时会用DocID来便捷地代表文档编号。

举个例子,文档和词条之间的关系如下图:

上图中每一行就是一个Document

字段值被分析之后,存储在倒排索引中,倒排索引存储的是分词(Term)和文档(Doc),它们之间的关系,简化版的倒排索引如下图:

上图中counter代表统计分词的次数

单词词典(Lexicon)

搜索引擎的索引单位通常是单词,单词词典是由文档集合中出现过的所有单词构成的字符串集合,它用来维护文档集合中出现过的所有单词的相关信息,同时用来记载某个单词对应的倒排列表在倒排文件中的位置信息。

为了更好的理解单词词典这个抽象概念,我们通过Elasticsearch来进行举例,ES 为了能快速找到某个 Term,先将所有的 Term 排个序,然后根据二分法查找 Term,时间复杂度为 O(log n);,就像通过字典查找一样,这就是 Term Dictionary。如果 Term 太多,Term Dictionary 也会很大,放内存不现实,于是有了 Term Index。就像字典里的索引页一样,S开头的有哪些 Term,分别在哪页,可以理解 Term Index是一棵树,这棵树不会包含所有的 Term,它包含的是 Term 的一些前缀,通过 Term Index 可以快速地定位到 Term Dictionary 的某个 Offset,然后从这个位置再往后顺序查找。

在内存中用 FST 方式压缩 Term Index,FST 以字节的方式存储所有的 Term,这种压缩方式可以有效的缩减存储空间,使得 Term Index 足以放进内存,但这种方式也会导致查找时需要更多的 CPU 资源。对于存储在磁盘上的倒排表同样也采用了压缩技术减少存储所占用的空间。

分词(Analysis)

将文本切分为一系列单词的过程

例如文本:谷歌地图之父跳槽FaceBook

分词结果:谷歌\ 地图\之父\跳槽\FaceBook

倒排列表(PostingList)

倒排列表记录了出现过某个单词的所有文档的文档列表及单词在该文档中出现的位置信息,每条记录称为一个倒排项(Posting)。根据倒排列表,即可获知哪些文档包含某个单词。实际的倒排列表中并不只是存了文档ID这么简单,还有一些其它的信息,比如:词频(Term出现的次数)、偏移量(offset)等,如下图所示:

单词ID、单词和文档频率就不多说了,这里重点解释一下倒排列表:

DocID:单词出现的文档id

TF:单词在某个文档中出现的次数

POS:单词在文档中出现的位置

以单词“加盟”为例,其单词编号为6,文档频率为3,代表整个文档集合中有三个文档包含这个单词,对应的倒排列表为{(2;1;<4>),(3;1;<7>),(5;1;<5>)},含义是在文档2,3,5出现过这个单词,在每个文档的出现过1次,单词“加盟”在第一个文档的POS是4,即文档的第四个单词是“加盟”,其他的类似。

倒排文件(Inverted File)

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

词典、单词、倒排文件和倒排列表概念之间的关系

一张图就能很好的说明这些概念的关系

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

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

相关文章

DOTA双功能螯合剂127985-74-4,p-SCN-Bn-DOTA,实验室科研试剂

p-SCN-Bn-DOTA产品描述&#xff1a;p-SCN-Bn-DOTA用于标记多肽的双功能螯合剂&#xff0c;同时螯合放射性核素和连接单克隆抗体。DOTA 的全名是 1,4,7,10-Tetraazacyclododecane-1,4,7,10-tetraacetic acid&#xff0c;中文名称为 1,4,7,10-四氮杂环十二烷-四乙酸&#xff0c;其…

Linux中断操作

一、thread_irq在内核中&#xff0c; 除了可以通过request_irq() 、 devm_request_irq()申请中断以外&#xff0c; 还可以通过以下二个函数申请( 它们比request_irq和devm_request_irq多了一个参数thread_fn)。 用这两个API申请中断的时候&#xff0c; 内核会为相应的中断号分配…

steam海外道具搬运,2个月变现1.6万,真的假的?

这几年的环境&#xff0c;让我这个身负房贷的房奴&#xff0c;实在是喘不过来气&#xff01; 也是无意间在朋友圈看到&#xff0c;之前突然裸辞的同事&#xff0c;不知道干什么发了财&#xff0c;竟然自己开了公司&#xff01; 几经询问才知道&#xff0c;他就是利用steam海外…

微内核架构的理解

什么是微内核架构 相信大家都听说过微内核架构&#xff0c;也或多或少做过一些类似于微内核架构的设计&#xff0c;为了可以更好的设计出微内核的架构&#xff0c;我们了解下什么是微内核架构。 说到微内核架构&#xff0c;大家首先会想到的是Eclips、IDEA、OSGI、Spring Plugi…

CAD连续标注怎么操作?CAD连续标注尺寸命令使用技巧

CAD标注工具可以在图形中创建多种标注&#xff0c;并可对标注样式进行修改或编辑。但是有些新手设计师在绘图过程中&#xff0c;不知道CAD连续标注怎么操作&#xff0c;其实很简单&#xff0c;本节内容就给大家分享一下浩辰CAD软件中CAD连续标注尺寸命令的使用技巧吧&#xff0…

005+limou+HTML——(5)HTML图片和HTML超链接

1、图片标签<img> &#xff08;1&#xff09;图片标签属性 [src]&#xff1a;用于指定这个图片所在的路径&#xff0c;常使用相对路径&#xff0c;比较少使用绝对路劲。如果图片路径有错误的话&#xff0c;就会发生图片显示错误[alt]&#xff1a;用于指定图片的提示文字…

三天吃透mybatis面试八股文

本文已经收录到Github仓库&#xff0c;该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点&#xff0c;欢迎star~ Github地址&#xff1a;https://github.com/…

HDFS读数据流程

1&#xff09;客户端通过Distributed FileSystem向NameNode请求下载文件&#xff0c;NameNode通过查询元数据&#xff0c;找到文件块所在的DataNode地址。 2&#xff09;挑选一台DataNode&#xff08;就近原则&#xff0c;然后随机&#xff09;服务器&#xff0c;请求读取数据…

蚂蚁感冒(简单数论)

长 100 厘米的细长直杆子上有 n 只蚂蚁。它们的头有的朝左&#xff0c;有的朝右。每只蚂蚁都只能沿着杆子向前爬&#xff0c;速度是 1 厘米/秒。当两只蚂蚁碰面时&#xff0c;它们会同时掉头往相反的方向爬行。这些蚂蚁中&#xff0c;有 1 只蚂蚁感冒了。并且在和其它蚂蚁碰面时…

编译错误:rpcndr.h(192,14): error C2872: “byte”: 不明确的符号

Windows上使用C11 编译出现错误1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\shared\rpcndr.h(192,14): error C2872: “byte”: 不明确的符号1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\shared\rpcndr.h(191,23): message : 可…

第十章 opengl之光照(投光物)

OpenGL投光物平行光点光源衰减聚光平滑/软化边缘投光物 当前光线都是来自空间的一个点。但实际&#xff0c;我们有很多种类的光照&#xff0c;将光投射到物体的光源叫做投光物。需要讨论几种不同类型的投光物。大致为&#xff1a;定向光&#xff0c;点光源&#xff0c;聚光等 …

Shell编程:轻松掌握入门级Shell脚本,成为Shell高手

文章目录前言一. 实验环境二. shell基础入门精讲2.1 什么是shell脚本&#xff1f;2.2 shell的种类2.3 脚本案例2.3.1 打印 hello-word案例2.3.2 统计指定目录下的文件数和目录数2.4 shell脚本编写规范总结前言 &#x1f3e0;个人主页&#xff1a;我是沐风晓月 &#x1f9d1;个人…

微服务架构(小白教学1)

相信大家吃饭的时候肯定是很苦恼打饭之慢&#xff0c;在自己饥肠辘辘的时候&#xff0c;面对自己喜欢吃的食物窗口却如同有百万大军虎视眈眈&#xff0c;自己内心的煎熬可想而知有时候在想这么美味的食物&#xff0c;为什么窗口就只开一个呢&#xff1f;于是你告诉了你的爸爸&a…

浅谈运维工程师的开发能力的培养

写在前面 本文已获得作者授权&#xff0c;作者的博客地址&#xff1a;https://www.cuiliangblog.cn/ 原文链接&#xff1a;浅谈运维工程师的开发能力的培养 一、运维工程师发展路线 1. 传统运维 侧重点是解决具体的问题。要求具备扎实的底层的知识储备&#xff0c;如网络、l…

安卓 Frament + ViewPager使用示例

1. 组成架构 整个架构被包在一个外部Fragment之中&#xff0c;也可以放在一个Activity之中&#xff0c;随意。外部的fragment包含了两个组件&#xff0c;即途中的ViewPager和TabLayoutViewPager要套上一个FragmentStatePagerAdapter &#xff0c;适配器负责new出一个个fragment…

基于Jetson NX的模型部署

系统安装 系统安装过程分为3步&#xff1a; 下载必要的软件及镜像 Jetson Nano Developer Kit SD卡映像 https://developer.nvidia.com/jetson-nano-sd-card-image Windows版SD存储卡格式化程序 https://www.sdcard.org/downloads/formatter_4/eula_windows/ 镜像烧录工具…

嵌入式C语言九大数据结构操作方式详解

在C语言的开发过程中&#xff0c;灵活使用数据结构&#xff0c;对提高编程效率有极大的帮助。 目录 1 数组 2 链表 3 跳表 4 栈 5 队列 6 树 7 堆 8 散列表 9 图 10 总结 数据结构想必大家都不会陌生&#xff0c;对于一个成熟的程序员而言&#xff0c;熟悉和掌握数据…

【C++、C++11】列表初始化、右值引用

文章目录&#x1f4d6; 前言1. 统一的列表初始化1.1 { } 花括号初始化&#xff1a;1.2 std::initializer_list&#xff1a;2. 右值引用2.1 什么是左值和右值&#xff1a;2.2 右值的分类&#xff1a;2.3 左值引用和右值引用的比较2.3 右值的使用场景&#xff1a;2.4 新的类功能&…

SpringBoot整合Quartz以及异步调用

文章目录前言一、异步方法调用1、导入依赖2、创建异步执行任务线程池3、创建业务层接口和实现类4、创建业务层接口和实现类二、测试定时任务1.导入依赖2.编写测试类&#xff0c;开启扫描定时任务3.测试三、实现定时发送邮件案例1.邮箱开启IMAP服务2.导入依赖3.导入EmailUtil4.编…

为「IT女神勋章」而战

大家好&#xff0c;我是空空star&#xff0c;今天为「IT女神勋章」而战 文章目录前言一、IT女神勋章二、绘制爱心1.htmlcssjs来源&#xff1a;一行代码代码效果2.python来源&#xff1a;C知道代码效果3.go来源&#xff1a;复制代码片代码效果4.java来源&#xff1a;download代码…