首页 > 其他分享 >数据结构(倒排索引)

数据结构(倒排索引)

时间:2024-11-18 17:44:43浏览次数:1  
标签:倒排 词语 ID 索引 文档 数据结构 分词

倒排索引和正排索引

倒排索引是什么?

  倒排索引 也被称作反向索引(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中。我们可以针对某些字段不做索引。

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

标签:倒排,词语,ID,索引,文档,数据结构,分词
From: https://www.cnblogs.com/luojw/p/18553262

相关文章

  • 常用代码模板2——数据结构
    单链表——模板题luogu826.单链表//head存储链表头,e[]存储节点的值,ne[]存储节点的next指针,idx表示当前用到了哪个节点inthead,e[N],ne[N],idx;//初始化voidinit(){  head=-1;  idx=0;}//在链表头插入一个数avoidinsert(inta){  e[idx]=a,ne[i......
  • Elasticsearch集群拒绝请求:索引磁盘使用超限
    这是一个典型的Elasticsearch集群因为磁盘空间不足而触发的保护机制,导致索引被设置为只读模式(read-only-allow-delete​)。以下是解决这个问题的步骤:释放磁盘空间:您需要清理服务器上的磁盘空间,删除不必要的旧索引或者日志文件,以降低磁盘使用率。可以使用以下命令删除不需要的索......
  • leetcode211. 添加与搜索单词 - 数据结构设计
    请你设计一个数据结构,支持添加新单词和查找字符串是否与任何先前添加的字符串匹配。实现词典类 WordDictionary :WordDictionary() 初始化词典对象voidaddWord(word) 将 word 添加到数据结构中,之后可以对它进行匹配boolsearch(word) 如果数据结构中存在字符串与......
  • 数据结构实验三 2024_树与图实验
    数据结构实验三2024_树与图实验7-1根据后序和中序遍历输出前序遍历本题要求根据给定的一棵二叉树的后序遍历和中序遍历结果,输出该树的前序遍历结果。输入格式:第一行给出正整数n(≤30),是树中结点的个数。随后两行,每行给出n个整数,分别对应后序遍历和中序遍历结果,数字间以......
  • 「高效信息檢索:開發旅遊網站的定製搜索引擎」
     摘要本文探討搜索引擎的工作原理、組成和數據結構,重點介紹針對雲南旅遊網內容的搜索引擎開發。使用Python實現,包括網絡爬蟲、向量空間模型和網頁排序,以滿足用戶的搜索需求。關鍵詞搜索引擎;信息檢索;網絡爬蟲;向量空間模型;網頁排序系統概述隨著信息時代的到來,互聯網......
  • Microsoft Windows 官方 Sysinternals 实用工具索引
    前言全局说明MicrosoftWindows官方Sysinternals实用工具,是官方提供的系统监控工具,分为几大类一、说明主页:https://learn.microsoft.com/zh-cn/sysinternals/downloads/下载页:https://learn.microsoft.com/zh-cn/sysinternals/downloads/二、一级分类文件和磁盘实......
  • NOIP 数据结构
    线段树标记看成序列而不是数权值对权值、标记对标记、标记对权值P1471区间加,区间平均值,区间方差区间平均值等同于区间和将方差式子拆解:$\frac{1}{n}\sum(A_i-\overline{A})^2=\frac{1}{n}(\sum{A_i}^2-2\sumA_i\overline{A}+n{\overline{A}}^2)$把\(\overline......
  • ES6 Set和Map数据结构用法详解
    文章目录前言Set数据结构创建Set添加元素删除元素删除所有数据获取set的大小(类似于数组的长度)检查是否包含某个元素四种遍历set的方法1.for...of循环2.forEach方法3.转换为数组后使用for循环4.keys(),values(),entries()集合运算方法Map数据结构创建Map添加元素(设......
  • 阿里面试:1000万级大表, 如何 加索引?
    本文原文链接文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录博客园版为您奉上珍贵的学习资源:免费赠送:《尼恩Java面试宝典》持续更新+史上最全+面试必备2000页+面试必备+大厂必备+涨薪必备免费赠送:《尼恩技术圣经+高并发系列PDF》,帮你实现技术自由,完......
  • Python+Flask实现搜索引擎,万能搜索框
    万能框指同时支持股票、基金、新闻搜索和命令查询等。下面按新闻、股票、基金检索顺序介绍。一、新闻搜索引擎主要技术当你用Python+Selenium下载新闻之后,如何下载参考上篇博文,就会面临新闻搜索的问题。自己做一个搜索引擎的优点很明显,没有广告,节省时间,如图的比较:搜索......