搜索引擎之倒排索引浅析

上一篇文章 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"}

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

总结

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

参考文献

Elasticsearch核心技术与实战

https://dwz.cn/ELv7FvuX

(0)

相关推荐

  • 搜索引擎springboot集成(elasticSearch)

    各位小伙伴们,今天是今年的最后一天,这是我今年的最后一篇博客,在这里祝大家新年快乐!本次讲的是近几年比较流行的search搜索引擎,本文写的比较粗略,希望大家看了会有所收获,如若写错,请在评论区指出, ...

  • 基于Elasticsearch检索型智能问答机器人实现方案(详细)

    一.设计方案 最近项目需要在做一个客服问答系统,里面涉及到了大量的问题搜索. 1.1 系统功能 在特定的垂直业务领域下,问答系统可以回答用户所提出的一系列问题,其主要功能包括问句预处理.问句理解.问句 ...

  • 大数据安全分析07_大数据存储技术介绍

    鉴于网络安全数据组成的复杂性.规模,以及对实时搜索响应的需求,需要通过大数据存储集群快速实现空间的扩容,在PB级的安全数据中做到安全分析查询的秒级响应,同时需要为数据提供了冗余机制,保障数据的安全. ...

  • ElasticSearch的学习笔记并整合SpringBoot做测试

    ElasticSearch的学习 简介 ElasticSearch是一个分布式的开源搜索和分析引擎,MySQL专攻于数据的持久化存储与管理(即CRUD),在真正要处理海量数据的检索与分析时,Elast ...

  • 浅析:搜索引擎如何排名一个页面?

    我们每天都在思考,如何将自己的关键词排名提升到百度首页,但我们几乎从来没有静下来思考,搜索引擎是如何排名一个页面? 这就是为什么,有的SEO人员,看到明明是"SEO垃圾页面": ① ...

  • ​浅析农贸市场设计改造与动态线路规划的重要性

    浅析农贸市场设计改造与动态线路规划的重要性 现代农贸市场的日常运作,动态线路设计必须保持稳定发展的首要因素.完善合理的动态线路规划,不仅能反映进入市场时的客货供应情况,而且对引导顾客的购物趋势也有很大 ...

  • 浅析抗体偶联药物的理想抗原靶点应该具有哪些特征

    近年来抗体偶联药物(ADC)已经成为抗肿瘤药物研发的热点,可以将细胞毒药物直接运输到癌细胞发挥杀伤作用.合适的抗原靶点.高度特异性的抗体.理想的偶联子和高效的偶联药物的选择是一个成功的ADC药物需要具 ...

  • 浅析人工智能的发展方向

    众所周知人工智能现如今正在高速发展,并且深入人们的生活和工作中,这不仅对人工的生活和工作提供了便利,同时也对人们未来的生活产生了影响.那么未来人工智能的发展方向主要在哪些方面? 一是在治疗方面,开发出 ...

  • 后疫情时代,互联网医疗发展模式及特点浅析

       近年来,在医改.分级诊疗.消费升级.老龄化.大数据.AI等多种因素叠加影响下,互联网医疗产业迅速发展.随着移动互联网技术与医疗服务加速融合,互联网医疗市场呈现出百花齐放之态势. 近一年多由于疫情 ...

  • 浅析中药外治法的诊疗思路

    中药外治法是中医治疗学的重要组成部,是以中医基础理论为指导,包括中草药制剂,除口服药外,施于皮肤.孔窍.腧穴及病变局部等各种独特治疗方法,目前种类已达150余种,既丰富又实用. 中药外治法,具有&qu ...

  • TDMA 噪声问题浅析

    时分多址(Time division multiple access,缩写:TDMA) 是一种为实现共享传输介质或者网络的通信技术. 在移动通信中GSM 2G网络中的标准制式.用在EGSM,GSM,D ...

  • 搜索引擎是怎么工作的?听听谷歌工程师是怎么说的

    搜索引擎大家都不陌生,百度和谷歌是我们最常用的两个搜索引擎.搜索引擎大家肯定都是会用的,比如说现在我想知道猎豹的奔跑速度,只需在搜索框中输入"猎豹的奔跑速度"后点击搜索,这时候我想 ...

  • 20世纪西方抽象艺术:浅析抽象绘画的历史发展进程和审美特征

    在当代很多艺术展览馆上,不少人都会遇到一些令人"尴尬"的艺术作品,他们常常歪歪扭扭,画有让人难以理解的涂鸦和方形,这个时候,很多人并没有透彻的理解这些奇怪的画,不少人坚信这些画应该 ...