搜索引擎之倒排索引浅析[通俗易懂]

搜索引擎之倒排索引浅析[通俗易懂]上一篇文章 "ElasticSearch 术语" 中提到了倒排索引,那么这篇文章就来讲解下什么是倒排索引,倒排索引的数据结构以及 ElasticSearch 中的倒排索引。 倒排索

搜索引擎之倒排索引浅析

上一篇文章 ElasticSearch 术语中提到了倒排索引,那么这篇文章就来讲解下什么是倒排索引,倒排索引的数据结构以及 ElasticSearch 中的倒排索引。

倒排索引

倒排索引(Inverted Index) 也常被称为反向索引,是搜索引擎中非常重要的数据结构,为什么说它重要呢,我们首先拿一本书《重构 改善既有代码的设计》举个例子:

如果一本书没有目录的话,理论上也是可以读的,只是合上书下次再次阅读的时候,就有些耗费时间了。

通过给一本书加目录页,可以快速了解这本书的大致内容分布以及每个章节的页码数,这样在查询内容的时候效率就会非常高了,所以书的目录就是书本内容的简单索引。

目录页

想象一下你要搜索 case语句 这个关键词在这本书的页码,你应该怎么办呢?有些技术类的书籍会在最后提供索引页,这本书的索引页如下:

索引页

只需要从索引页中查找 case语句,就可以查找到关键词在书本中的页码位置了。

看完这个例子,让我们来把图书和搜索引擎做个简单的类比:

图书当中的目录页就相当正向索引(Forward Index)索引页就相当于倒排索引的简单实现,在搜索引擎中,正向索引指的是文档 ID 到文档内容和单词的关联,倒排索引就是单词到文档 ID 的关系

下面来看一个很简单的例子:

文档 ID 文档内容
1 Mastering ElasticSearch
2 ElasticSearch Server
3 ElasticSearch Essentials

如上有三篇文档,每篇文档的内容都是关于 ElasticSearch 的三本书,那我们思考下怎么样变为一个倒排索引呢?

Term Count DocumentId:Position
ElasticSearch 3 1:1,2:0,3:0
Mastering 1 1:0
Server 1 2:1
Essentials 1 3:1

把书中内容出现所以的词都分成不同的关键词(Term),排列在第一栏,分别是 ElasticSearchMasteringServerEssentials;第二栏是统计了关键词在所有内容中出现的次数,比如 ElasticSearch 在内容中出现了三次,就记为 3;第三栏标注的是文档 ID 和文档出现的位置,比如 ElasticSearch 在第 1,2,3 文档中都出现了,在第一个文档所处的位置是第二个,所以标注的为 1。

以上就是简单的正排索引和倒排索引的结构,下面让我们来看下倒排索引的数据结构:

倒排索引数据结构

倒排索引的核心分为两部分,第一部分为单词词典(Term Dictionary),记录所有文档的单词以及单词到倒排列表的关联关系。在前面的例子中,单词的量并不是很多,但是在实际生产中,单词量会非常大,所以实际会采用 B+ 树和哈希拉链法去存储单词的词典,以满足高性能的插入与查询。

第二部分是倒排列表(Posting List),它记录了单词对应文档的结合,倒排列表是由倒排索引项(Posting) 组成,倒排索引项包含:

  • 文档 ID:用于获取原始信息
  • 词频(TF,Term Frequency):该单词在文档中出现的次数,用于相关性评分
  • 位置(Position):单词在文档中分词的位置,用于语句搜索(Phrase Query)
  • 偏移(Offset):记录单词的开始结束位置,实现高亮显示(比如用 GitHub 搜索的时候,搜索的关键词会高亮显示)

下面我们来用一张图来整体看下倒排索引:

搜索引擎之倒排索引浅析[通俗易懂]

一个倒排索引是由单词词典(Term Dictionary)和倒排列表(Posting List)组成的,单词词典会记录倒排列表中每个单词的偏移位置。比如当搜索 Allen 的时候,首先会通过单词词典快速定位到 Allen,然后从 Allen 这里拿到在倒排列表中的偏移,快速定位到在倒排列表中的位置,从而真正拿到倒排索引项 [12,15](这里只是列了下 Document ID,其实是像上面讲的包含 4 项信息的项),拿到这个项可以去索引上拿到原始信息,可以去计算打分排序返回给用户。

再了解了倒排索引的数据结构后,让我们来看下 ES 中的倒排索引吧!

ElasticSearch 倒排索引

那么在 ElasticSearch 中的文档是基于 Json 格式的,其中一个文档包含多个字段,每个字段都会有自己的倒排索引。在 Mapping 中可以去设置对某些字段不做索引,这样做可以节省存储空间,但同时也会导致这个字段无法搜索了。

比如一个文档,其中包含两个字段 usernamejob

{
    "username":"wupx",
    "job":"programmer"
}

代码100分

在构建索引的时候是根据字段构建的,那么 ES 中 username 会有一个倒排索引,job 也会有一个倒排索引。

搜索引擎之倒排索引浅析[通俗易懂]

总结

这篇文章主要介绍了什么是倒排索引以及它的数据结构,下一篇文章将会学习如何在 ElasticSearch 中分词来形成倒排索引。

参考文献

Elasticsearch核心技术与实战

https://dwz.cn/ELv7FvuX

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/9707.html

(0)
上一篇 2023-02-02
下一篇 2023-02-02

相关推荐

  • window10 离线安装oralce及相关信息「建议收藏」

    window10 离线安装oralce及相关信息「建议收藏」离线oracle 准备 windows环境 java jdk oracle安装包,建议使用oracle-11g的版本 安装 安装java jdk 安装oracle oracle远程配置 服务器ora…

    2023-02-02
    152
  • Pycharm打包教程

    Pycharm打包教程Pycharm是一个非常流行的Python IDE,由于其强大的功能和易于使用的界面,被广泛用于Python开发。在实际项目中,我们通常需要将Python代码打包成可执行文件(exe或者app),方便交付或者发布。本篇文章主要介绍如何使用Pycharm来打包Python代码。

    2024-08-08
    27
  • Python Numbers的数据分析和可视化优化

    Python Numbers的数据分析和可视化优化Python是一种易学易懂的编程语言,它已成为许多程序员和工程师的首选语言。Python的丰富库使它成为数据分析和可视化的高效工具。在本文中,我们将详细探讨Python Numbers模块的数据分析和可视化优化,并提供示例代码。

    2024-02-27
    110
  • 查看Oracle客户端版本及位数-Windows

    查看Oracle客户端版本及位数-WindowsGPS平台、网站建设、软件开发、系统运维,找森大网络科技!https://cnsendnet.taobao.com来自森大科技官方博客http://www.cnsendblog.com/index….

    2023-04-19
    157
  • mongodb orm python_鼠标用法

    mongodb orm python_鼠标用法 “`python import pymongo # 连接MongoDB client = pymongo.MongoClient(host=’localhost’, port=27017)…

    2023-02-22
    162
  • mysql8.0文档_Mysql事务

    mysql8.0文档_Mysql事务以下文章来源于MySQL解决方案工程师,作者徐轶韬 MySQL8.0里包括一款功能——CPU资源分组管理。它实现的目的是将CPU资源分组,并且赋予运行不同类型的查询。通过它可以解决DBA的一些痛点,…

    2023-01-31
    142
  • Python中的and和or用法

    Python中的and和or用法在Python中,and和or是逻辑运算符。and运算符是指两个条件同时成立,结果为True;or运算符是指两个条件中有一个成立,结果为True。

    2024-06-27
    46
  • 灵活运用SQL Server2008 SSIS变量「建议收藏」

    灵活运用SQL Server2008 SSIS变量「建议收藏」在SSIS开发ETL(Extract-Transform-Load),数据抽取、转换、装载的过程。我们需要自己定义变量 一、SSIS变量简介 SSIS(SQL Server Integration S

    2022-12-29
    153

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注