数据结构(倒排索引)

news/2024/11/18 17:46:01/文章来源:https://www.cnblogs.com/luojw/p/18553262

倒排索引和正排索引

倒排索引是什么?

  倒排索引 也被称作反向索引(inverted index),是用于提高数据检索速度的一种数据结构,空间消耗比较大。倒排索引首先将检索文档进行分词得到多个词语/词条,然后将词语和文档 ID 建立关联,从而提高检索效率。
分词就是对一段文本,通过规则或者算法分出多个词,每个词作为搜索的最细粒度一个个单字或者 单词。分词的目的主要是为了搜索,尤其在数据量大的情况下,分词的实现可以快速、高效的筛选 出相关性高的文档内容。

  如下图所示,倒排索引使用 词语/词条(Term 来作为索引关键字,并同时记录了哪些 文档(Document 中有这个词语。

img

  文档(Document)****:用来搜索的数据,其中的每一条数据就是一个文档。例如一个商品信息、商家信息、一页网页的内容。
词语/词条(Term)****:对文档数据或用户搜索数据,利用某种算法分词,得到的具备含义的词语就是词条。例如 ''数据库索引可以大幅提高查询速度" 这段话被中文分词器 IK Analyzer 细粒度分词后得到[数据库,索引,可以,大幅,提高,查询,速度]。
词典(****Term Dictionary):Term 的集合。

Lucene 就是基于倒排索引来做的全文检索,并且 ElasticSearch 还对倒排索引做了进一步优化。

倒排索引的创建和检索流程了解么?

这里只是简单介绍一下倒排索引的创建和检索流程,实际应用中,远比下面介绍的复杂,不过,大体原理还是一样的。

倒排索引创建流程:

  1. 建立文档列表,每个文档都有一个唯一的文档 ID 与之对应。
  2. 通过分词器对文档进行分词,生成类似于 <词语,文档ID> 的一组组数据。
  3. 将词语作为索引关键字,记录下词语和文档的对应关系,也就是哪些文档中包含了该词语。

这里可以记录更多信息比如词语的位置、词语出现的频率,这样可以方便高亮显示以及对搜索结果进行 排序(后文会介绍到)。

Lucene 的倒排索引大致是下面这样的:

img

倒排索引检索流程:
  1. 根据分词查找对应文档 ID
  2. 根据文档 ID 找到文档
倒排索引由什么组成?

单词字典 :用于存储单词列表。一般用 B+Tree 或 Hash 拉链法存储,提高查询效率。

倒排列表 :记录单词对应的文档集合。分为:

  DocID:即文档 id
TF:单词出现频率,简称词频

  Position:单词在文档中出现的位置,用于检索

  Offset:偏移量,记录单词开始结束位置,用于高亮显示

正排索引由什么组成?

  不同于倒排索引,正排索引将文档 ID 和分词建立关联。

  根据词语查询时,必须先逐条获取每个文档,然后判断文档中是否包含所需要的词语,查询效率较低。

倒排索引和正排索引的区别是什么?

正排索引:

  优点:维护成本低,新增数据的时候,只要在末尾新增一个 ID  

  缺点:以 DocID 为索引,查询时需要扫描所有词语,一个一个比较,直至查到关键词,查询效率较低。

倒排索引:

  优点:建立分词和 DocID 关系,大大提高查询效率
缺点:建立倒排索引的成本高。并且,维护起来也比较麻烦,因为文档的每次更新都意味着倒排索 引的重建。还有一些搜索精度的问题,比如搜索dogs 和 dog 想要相同匹配结果,这时就需要合适的分词器了

Elasticsearch 可以针对某些字段不做索引吗?

  文档会被序列化为字段组成的 JSON 格式保存在 ES中。我们可以针对某些字段不做索引。

  这样可以节省存储空间,但是,同时也会让字段无法被搜索。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

旺仔水饺-冲刺日志 Day 6

作业所属课程 https://edu.cnblogs.com/campus/fzu/SE2024作业要求 https://edu.cnblogs.com/campus/fzu/SE2024/homework/13305团队名称 旺仔水饺102201140 黎曼 102201138 黄俊瑶102201127 罗永辉 102201130 郑哲浩102202144 傅钰 102202147 赖越172209028 伊晓 052101418 陈…

服务器时间不对导致.NET SDK连接Minio失败

这两天想弄个简单的文件系统来做测试,选中了Minio,公司的测试环境是windows server2019,随手搜起一篇教程(MinIO注册成服务在后台运行(Win10)_minio windows 注册成服务在后台运行-CSDN博客),按图索骥,一顿操作猛如虎, 使用“WinSW”加入系统服务。打开网页一看,好使。…

关于成人自学考试的一些建议

关于自己能不能坚持考完自考这条路来说,你需要考虑你能否坚持1-6年的自考流程 关于答卷分数的问题,只是公布分数,不公布对错,次次考试要么分数很低, 要么分数高的离谱,严重怀疑分数评判的标准。真实性 本人考试了5年,疫情耽误1年,工商管理的课程,选考3科 比英语还难。…

8.8

from scipy.integrate import odeint import numpy as np import pylab as plt yx = lambda y,x: [y[1], np.sqrt(1+y[1]**2)/5/(1-x)] x0 = np.arange(0, 1, 0.00001) y0 = odeint(yx, [0,0], x0) plt.rc(font, size=16) plt.plot(x0, y0[:,0]); plt.show() 2023310143007

DML

1.通过使用insert into 表名 values(值1,值2,值3)如果插入的数据与列一一对应,那么可以省略列名,但如果希望向指定列上插入数据,就需要写出列名 2.insert into 表名(列名1,列名2)values(值1,值2);也可以一次性向数据库中插入多条数据 3.insert into 表名(列名1,列名…

多部门协作效率低下?项目管理工具能帮你解决!

在现代企业中,不同部门间的协作日益成为工作成功的关键。无论是市场部、产品部,还是运营部、财务部,部门之间的高效协作能显著提升整体产出,避免信息孤岛与资源浪费。然而,在实际工作中,跨部门合作常常面临各种挑战,比如沟通不畅、信息分散、目标不一致等。而项目管理软…

修改IDEA中Servlet创建的模板

一、原Servlet模板创建出来的格式样式二、按图步骤修改注释参数 1.点击File->选择Settings,按下图步骤进入设置项。修改前的模板样式2.修改类创建时的默认方法三、重新创建Servlet时,新模板样式

202222313 2024-2025-1 《网络与系统攻防技术》实验六实验报告

1. 实验内容 1.1 实验要求 (1)掌握metasploit、nmap的用法。 (2)学习前期渗透的方法。 (3)利用4个漏洞,实现对靶机的攻击。 1.2 学习内容 (1)metasploit的用法:可以简单总结为“Search-Use-Show-Set-Exploit/run”。 (2)四种漏洞的原理。Vsftpd源码包后门漏洞:在特定版本的v…

创建表(1)

1.切换操作的数据库,默认是在MySQL中进行操作2.创建表,遵循固定格式,枚举可用enum(‘’,‘’)限制条件可用notnull 默认可设置default‘ ’3.修改表:可以用alter table进行修改 alter table 表名 add 列名 数据类型 列级约束条件; alter table 表名 drop column 列名 …

Flutter项目实战(1):通用项目框架搭建

下面介绍 Flutter 最基本的通用项目框架搭建,同时实现了一个登录界面图标和登录界面。 先看下效果图:使用ScreenUtilInit自适应界面大小; 使用Stack支持多个子界面在同一个全屏主界面上选择显示; 使用 Get 插件实现界面之间的跳转和国际化翻译; 界面都通过Transform实现了…

Rocky安装htop

本篇抄的,放在这里防止自己忘记 两条命令: dnf install epel-release -y dnf install htop -yhtop测试: [root@localhost ~]# htop //回车后出现如下图,按q退出