关于倒排索引表的总结

什么是倒排表(倒排索引) 文档(Document):一般搜索引擎的处理对象是互联网网页,而文档这个概念要更宽泛些,代表以文本形式存在的存储对象,相比网页来说,涵盖更多种形式,比如Word,PDF,html,XML等不同格式的文件都可以称之为文档。,并以词条创建索引.然后记录下包含该词条的所有文档编号.(单个分词映射到对应的若干个文档,所有分词和文档映射关系组合起来的就是倒排列表,辅助理解,不用说出). 未来搜索时,就可以通过对搜索关键字的分词,然后找到索引库中对应的文档,这就是倒排索引的原理.,创建文档索引,形成文档列表.然后对。 阅读详情

最近在研究elasticsearch的技术栈 ,发现ES底层是基于luence技术进行检索,检索的原理是倒排索引表。那么什么是倒排索引表呢?在知乎上看到一个讲解elasticsearch的倒排索引表的帖子。

链接是:https://zhuanlan.zhihu.com/p/33671444

为什么说elasticsearch的倒排索引表的检索速度是比关系型数据库的索引查新更快呢?首先,关系型数据库的底层索引的数据结构是b-tree树, B-tree树最大的缺点就是牺牲了一定的读取的效率换来更高的写入效率。当我们不需要支持快速的更新的时候,可以用预先排序等方式换取更小的存储空间,更快的检索速度等好处,其代价就是更新慢。要进一步深入的化,还是要看一下Lucene的倒排索引是怎么构成的。

首先介绍一个简单的例子。

比如有如下的数据:

在es中每一行对应着一个document, 每个文档都是有docid的,而且我们现在是针对document来建立倒排索引操作。

这里面的倒排索引是针对每一个字段 其中18,20叫做term ,[1,2]就是post list.

那么term index 和term dictionary 是什么呢?

假设我们有很多个term,比如:

Carla,Sara,Elin,Ada,Patty,Kate,Selena

如果按照这样的顺序排列,找出某个特定的term一定很慢,因为term没有排序,需要全部过滤一遍才能找出特定的term。排序之后就变成了:

Ada,Carla,Elin,Kate,Patty,Sara,Selena

这样我们可以用二分查找的方式,比全遍历更快地找出目标的term。这个就是 term dictionary。有了term dictionary之后,可以用 logN 次磁盘查找得到目标。但是磁盘的随机读操作仍然是非常昂贵的(一次random access大概需要10ms的时间)。所以尽量少的读磁盘,有必要把一些数据缓存到内存里。但是整个term dictionary本身又太大了,无法完整地放到内存里。于是就有了term index。term index有点像一本字典的大的章节表。比如:

A开头的term ……………. Xxx页

C开头的term ……………. Xxx页

E开头的term ……………. Xxx页

如果所有的term都是英文字符的话,可能这个term index就真的是26个英文字符表构成的了。但是实际的情况是,term未必都是英文字符,term可以是任意的byte数组。而且26个英文字符也未必是每一个字符都有均等的term,比如x字符开头的term可能一个都没有,而s开头的term又特别多。实际的term index是一棵trie 树:

例子是一个包含 "A", "to", "tea", "ted", "ten", "i", "in", 和 "inn" 的 trie 树。这棵树不会包含所有的term,它包含的是term的一些前缀。通过term index可以快速地定位到term dictionary的某个offset,然后从这个位置再往后顺序查找。再加上一些压缩技术(搜索 Lucene Finite State Transducers) term index 的尺寸可以只有所有term的尺寸的几十分之一,使得用内存缓存整个term index变成可能。整体上来说就是这样的效果。

现在我们可以回答说“为什么elasticsearch/Lucene 比mysql的检索速度快了?” 其实对于mysql来说的话 他缺少了term index这一层, 在写入数据的时候是按照b-tree的结构进行排序写入磁盘的。当检索一个term的时候需要若干次的磁盘random access操作这样效率就比较低(一次random access的时间消耗大约是10ms)。然而对于Lucene来说的话 分装了一层term index,并且term index按照trie树的结果在内存中,从term index查到对应的term dictionary的block位置之后,再去磁盘上找term,大大减少了磁盘的random access次数。

额外值得一提的两点是:term index在内存中是以FST(finite state transducers)的形式保存的,其特点是非常节省内存。Term dictionary在磁盘上是以分block的方式保存的,一个block内部利用公共前缀压缩,比如都是Ab开头的单词就可以把Ab省去。这样term dictionary可以比b-tree更节约磁盘空间。

关于elasticsearch数据压缩的技术---"增量编码压缩 就是将大数变成小数 按照字节存储"

如何实现分布式搜索(二)简单实现倒排索引表与数据导入 在上一节中,我们使用了HashMap来模拟trie字典树,通过使用字典树,我们就能够将一段字符串中的关键词给提取出来。 那么现在我们要实现两件事情即可: 一、数据导入 问题所在: 所谓巧妇难为无米之炊,虽然我不是巧妇,也不会做饭,但我会吃啊~ 回归正题,既然是做搜索,那你至少得有数据,有人会说:直接用数据库不就好了? 显然这样是不行得,数据库封装得太好了,因此你根本无法修改它的内部结构... 阅读详情

相关推荐

IR&IE笔记:倒排索引表与布尔模型

目录1. 一些基础概念2. 布尔模型3. 倒排索引 1. 一些基础概念 两个检索有效性参数: IDF逆向文件频率 (Inverse Document Frequency) for term Tj dfjdf_jdfj​ (document frequency of term Tj) is number of documents in which Tj occurs. 可以暂且理解为,某个单词出现次数越小,那文档中出现此单词的概率越小,信息量越高。 dfj=1, idfj=logN dfj=N, idfj

梆子井欢喜坨的博客 475

查找——索引顺序表和倒排表

查找8.3 索引顺序表和倒排表8.3.1 索引顺序表 8.3 索引顺序表和倒排表 当数据表中的数据元素个数n很大时,如果用顺序查找结构,则查找效率极低。如果采用有序表存储形式的折半查找,则为了维持数据表的有序性,时间开销很大;而且,当数据表很大时,计算机内存的容量可能不够。这时可采用索引方法来实现存储和查找。 8.3.1 索引顺序表 索引顺序表一般由主表和索引表两个部分组成,两者均采用顺序存储结构。 主表中存放数据元素的全部信息,索引表中存放数据元素的主键字和索引信息。 在图8-3所示的学生信息表的例子中

lseaJK的博客 6241

基于倒排索引表的搜索引擎简单实现

程序用java编写后向算法中文分词分词,并建立倒排索引表。然后在myeclipse下编写一个web形式的搜索测试页。

倒排索引

倒排索引(inverted index),也常被称为反向索引、植入档案或反向档案,是一种索引方法,被用来存储在在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射。它是文档检索系统中最常用的数据结构。倒排索引源于实际应用中需要根据属性的值来查找记录。这种索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址。由于不是由记录来确定属性值,而是由属性值来确定记录的位置,因而称为倒排索引。

jisuanbbs的专栏 768

java实现倒排索引表的布尔查询

java实现读取多个文件构成hashmap创建倒排索引表,然后实现布尔查询. 代码比较丑陋,初学者写的。多多包涵!

倒排索引表

倒排索引的实现。 一个文件含有几个文件的名字,打开这个文件之后读其他文件的内容,将内容出现的文件号输出。

MySQL中的正排/倒排索引和DoubleWriteBuffer

InnoDB是MySQL中一种常用的事务性存储引擎,它具有很多优秀的特性。其中,Doublewrite Buffer(双写缓冲区)是InnoDB的一个重要特性之一InnoDB Doublewrite Buffer是InnoDB的一个重要特性,用于保证MySQL数据的可靠性和一致性。它的实现原理是通过将要写入磁盘的数据先写入到DoublewriteBuffer中的内存缓存区域,然后再写入到磁盘的两个不同位置,来避免由于磁盘损坏等因素导致数据丢失或不一致的问题。

Cover_sky的博客 1712

从零构建智能ai语音助手:ESP32s3+Python+大语言模型实战指南

本文详细介绍了基于ESP32S3硬件和Python后端的智能语音助手系统开发指南。系统采用ESP32S3采集语音,通过WebSocket实时传输到Python后端处理,利用大语言模型实现自然语言理解和意图识别,再通过TTS合成语音返回。文章从系统架构、工作流程、技术实现(包括OPUS编码、WebSocket通信、ESP32音频处理)等方面进行了详细讲解,并提供了分阶段学习路线和常见问题解决方案。该项目展示了物联网技术与AI技术的融合应用,相比传统语音系统具有更高的灵活性和智能性,为开发者提供了完整的实现方案

Despacito0o的博客 2629

【简单理解】搜索引擎检索-倒排表(倒排索引)

【简单理解】搜索引擎检索-倒排表(倒排索引) 简单介绍倒排索引 倒排索引(Inverted index),也常被称为反向索引、置入档案或反向档案,是一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射。它是文档检索系统中最常用的数据结构。 常见应用:搜索引擎、问答系统、对话系统。 图说倒排索引 这里首先引出一个例子来详细介绍倒...

weixin_44151089的博客 4881

pytorch转onnx转paddlepaddle

1.pt转onnx 可查看我之前的文章:https://blog.youkuaiyun.com/oyjwin/article/details/117778583?spm=1001.2014.3001.5501

oyjwin的博客 1461

告别‘小爱同学’:用ESP32-S3和esp-sr SDK,从零打造一个离线语音助手(含完整代码)

本文详细介绍了如何利用ESP32-S3芯片和esp-sr SDK从零构建一个离线语音助手,涵盖硬件选型、声学设计、SDK配置及低功耗优化等关键步骤。通过实战案例和完整代码,帮助开发者实现自定义唤醒词和命令词,打造低成本、高隐私的本地语音控制解决方案。

weixin_29041195的博客 371

搜索引擎倒排索引表压缩:gamma编码

搜索引擎的倒排索引表所占的空间很大,对倒排索引表进行压缩显得非常必要。由于倒排索引表中存储的全部都是数字,对其进行压缩有着专门的方法,Gamma编码就是其中的一种。Gamma编码是一种基于位的变长编码……

小鼠标 3507

MATLAB基础应用精讲-【强化学习】Actor - Critic 算法(附python代码实现)

这种架构结合了策略梯度方法(Policy - Gradient Methods)和价值函数估计方法(Value Function Estimation Methods)的优点。在强化学习中,智能体(Agent)需要通过与环境(Environment)的交互来学习最优的行为策略,以获得最大的累积奖励(Cumulative Reward)。

qq_36130719的博客 363

倒排索引表的创建

倒排表的创建其实很简单,最简单的方法就是循环所有的单词一遍,然后记录每一个单词所出现的文档,然后把这些文档的ID保存成list即可。我们可以定义一个类似于hash_map, 比如 inverted_index = {}, 然后存放包含每一个关键词的文档出现在了什么位置,也就是,通过关键词的搜索首先来判断包含这些关键词的文档(比如出现至少一个),然后对于candidates问题做相似度比较。# 没在word_doc中的,建立一个空listi。# key:word,value:包含该词的句子序号的列表。

m0_46221545的博客 391

YOLOv11【第二章:核心模块进阶篇·第28节】DynamicHead动态检测头设计!

🏆 本文收录于专栏 《YOLOv11实战:从入门到深度优化》。本专栏围绕 YOLOv11 的改进、训练、部署与工程优化 展开,系统梳理并复现当前主流的 YOLOv11 实战案例与优化方案,内容目前已覆盖 分类、检测、分割、追踪、关键点、OBB 检测 等多个方向。

**My Coding Family** 1万+

实测!Gemini+ChatGPT赋能学术写作:我的论文写作SOP(附提示词)

各位同仁好,我是七哥。一个在高校里从事人工智能相关领域研究,钻研用大模型AI实操的学术人。可以和七哥交流学术写作或Gemini、GPT、Claude等大模型学术实操相关问题,多多交流,相互成就,共同进步。为什么ChatGPT逻辑清晰却写不长?为什么Gemini能深入分析但废话连篇?这其实是两种模型架构的本质差异,GPT系列擅长指令跟随和语言精炼,而Gemini原生支持超长上下文,适合深度文本生成。两者在深度生成与精炼表达上形成了天然互补。我们可以将它们组合起来使用发挥他们各自的特长。

智能AI让学术科研更容易 521

搜索引擎倒排索引表压缩:gamma编码、Golomb编码

搜索引擎的倒排索引表所占的空间很大,对倒排索引表进行压缩显得非常必要。由于倒排索引表中存储的全部都是数字,对其进行压缩有着专门的方法,Gamma编码就是其中之一。当你每天打开电脑,在百度搜索框中输入你要搜索的内容,按下回车之后,你可能不会意识到,有无数台主机在飞速运转,对比了数百万条记录,经过初步结果集生成、相关度打分、结果排序、摘要生成之后,才最终在你的屏幕上打出了你想要的结果。这一切仅仅发生在几

Kobe Bryant的专栏 2836

知识图谱设计简记

知识图谱是一种语义化的知识表示框架,通过实体-关系-属性三元组形式表达现实世界关联。其核心价值在于关联化整合数据、支持可解释性推理和赋能智能化应用。知识图谱可分为通用型和领域型两类,基本构成包括实体、关系、属性等基础元素,以及本体和实例等架构层元素。设计方法主要有自上而下、自下而上和混合式三种,需遵循业务导向、一致性等原则。在建模时需要明确属性与实体的判断标准,规范处理关系的方向性与对称性,并合理构建多重关系。主流技术框架如RDF和属性图体系均支持多重关系建模,选择需考虑业务需求。本体作为知识图谱的概念骨架

生活在别处 358

哈工大威海数据结构实验四

实验四 查找----基于词频的文件相似度 分析: 该实验的难度在于对倒排索引表的构建,在该实验中,我采用了链表作为索引表,哈希表作为存储单词的表,在索引表内存储单词的位置用来访问哈希表。另外一个难点在于,如何求结相似度,在该实验中我采用的是在每个索引表头存储单词数量,同时通过访问哈希表得出相同单词数量,通过公式 A∩B/A∪B 得出答案。 其实这里有两种方法,知识有的老师觉得用数组的话过于简单,不让用,这里使用那种方法看情况把。 1 数组: #include <iostream> #includ

hauxie的博客 1348

GameFramework教程✨六、怎样加载一个3D UI

怎样加载一个3D UI

星河造梦坊 1583

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【Golang系统开发】搜索引擎(3) 压缩倒排索引表

假设我们的数据集中有 800000 篇文章,每篇文章有 200 词条,每个词条有6个字符,倒排记录数目是 1 亿。那么如果我们倒排索引表中单单记录文档id,不记录文档内的频率和偏移信息。那么 文档id 的长度就必须是log2​80000020bit(文档可能每篇文章都存在,所以是以最长的长度要求),所以我们整个未压缩的倒排索引表的大小大概有,倒排记录数 * 文档id大小 = 100,000,000 * 20/8 = 250 MB。

面向生活编程 1624

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

lucene倒排索引表搜索原理

什么是正排索引?什么是倒排索引?搜索的过程是什么样的?会用到哪些算法与数据结构? 前面的内容太宏观,为了照顾大部分没有做过搜索引擎的同学,数据结构与算法部分从正排索引、倒排索引一点点开始。提问:什么是正排索引(forward index)?回答:由key查询实体的过程,是正排索引。用户表:t_user(uid, name, passwd, age, sex),由uid查询整行的过程,就是正排索引查...

千丈之松的专栏 4191

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

C/C++基于词频的文件相似度

题目3.基于词频的文件相似度 【难度系数】3 【问题描述】 大家熟悉的文件查重系统,实际上就是计算2个文件的相似度。而实现一种简单原始的文件相似度计算,即以两文件的公共词汇占总词汇的比例来定义相似度。两文件的相似度, 即两文件的公共词汇量占两文件总词汇量的百分比。若相似度超过80%,则认为两文件为相似。本算法只计算英文文件相似度(中文的分词比较复杂)。本题要求建立一个倒排索引表存储分词后词汇。 文件请自选。 【基本要求】 命令1,用户输入2个文件名,导入文件到内存中,展示2个文件内容。 命令2,开始对文件分

程序设计 1194

Datawhale组队学习——推荐系统Task05 用户倒排索引表的构建

以下学习笔记来自Datawhale组队学习的推荐系统课程,项目地址: https://github.com/datawhalechina/fun-rec 当我们了解了新闻物料的构建以及前后端交互的基础之后,剩下的就是去了解推荐流程在当前项目中是怎么实现的了,另外,以下内容主要是看的项目里docs下的md文件来的,实际代码有一些更改,不过大体逻辑应该是一样的。 倒排索引 一个未经处理的数据库中,一般是以文档ID作为索引,以文档内容作为记录。而倒排索引简单来说就是将单词或记录作为索引,将文档ID作为记录,这样

zxc123qwer的博客 1375

Spark学习案例(一)

####输出一个简单的倒排索引表 要求: 1、将指定目录下的所有文件数据读取到一个RDD中,返回的RDD[filePath.fileText] 2、文件路径D://data/inverted/*,再次文件夹下创建三个txt文件分别写出doc1:hello spark hello hadoop、doc2:hello hive hello hbase hello spark、doc3:hadoop hbase hive scala等 思路: 1、从filePath中获取路径名 2、从fileText中获取

逐梦 284

es的倒排索引结构

在倒排索引中,对于每个词语(或称为项,term),都会记录包含该词语的文档的位置信息。这种结构的设计使得可以通过词语来快速定位到包含该词语的文档,从而实现高效的文本检索。通过倒排索引,可以快速找到包含特定词语的文档,并且可以进行高效的文本搜索和检索。倒排索引在搜索引擎和信息检索系统中得到了广泛的应用。倒排索引(Inverted Index)是信息检索领域常用的一种数据结构,用于快速定位包含特定词语的文档或文本。

qq_63431773的博客 436
上一篇: mongodb删除某一个集合中记录的字段
下一篇: 关于mysql里面explain的字段学习
Bonyin
博客等级 码龄10年 166粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值