当前位置: 首页 > 科技观察

搜索引擎倒排索引分析

时间:2023-03-16 00:46:04 科技观察

上一篇ElasticSearch术语中提到了倒排索引,那么本文就来讲解一下什么是倒排索引,倒排索引的数据结构以及ElasticSearch索引中的倒排索引。倒排索引倒排索引(InvertedIndex)也常被称为倒排索引。它是搜索引擎中非常重要的数据结构。它为什么如此重要?以一本书《重构 改善既有代码的设计》为例:如果a这本书没有目录的话,理论上是可以读的,但是关了书下次再读就需要一些时间了。通过给一本书加一个目录页,可以快速的了解这本书的大致内容分布和每一章的页数,这样在查询内容的时候效率会非常高,所以图书目录就是一个简单的索引书的内容。目录页假设您想在本书中搜索关键字case语句的页码。你该怎么办?一些技术书籍会在末尾提供索引页。本书索引页如下:索引页只需要从Searchthecasestatementintheindexpage,就可以查到关键词在书中的页码位置。看完这个例子,让我们把书籍和搜索引擎做一个简单的类比:书籍中的目录页相当于一个正向索引(ForwardIndex),而索引页相当于一个倒排索引的简单实现,正向索引是指文档ID与文档内容和词之间的关系,倒排索引是指词与文档ID之间的关系。我们来看一个很简单的例子:有三个文档,每个文档的内容是三本关于ElasticSearch的书。那我们想想怎么把它变成倒排索引呢?把书中内容中出现的所有词分成不同的关键词(Term),排列在第一栏,分别是ElasticSearch、Mastering、Server和Essentials;第二列统计关键字在所有内容中出现的次数,例如ElasticSearch在内容中出现3次,记为3;第三列标记了文档ID和文档出现的位置。比如ElasticSearch出现在文档1、2、3中,第一个文档的位置是第二个,所以标注为1。以上就是简单的正向索引和倒排索引的结构。让我们看一下倒排索引的数据结构:倒排索引的数据结构。倒排索引的核心分为两部分。第一部分是词词典(TermDictionary)),记录了所有文档的词以及词与发帖列表的关联关系。在前面的例子中,单词的数量不是很多,但是在实际生产中,单词的数量会非常多,所以会使用B+树和hashzipper的方式来存储单词的字典,以满足高性能插入和查询。第二部分是发帖列表(PostingList),记录了单词对应的文档组合。发帖列表由倒排索引项(Posting)组成,倒排索引项包括:文档ID:用于获取原始信息词频(TF,TermFrequency):单词在文档中出现的次数,用于用于相关性打分位置(Position):单词在文档中的位置,用于句子搜索(PhraseQuery)使用GitHub,搜索关键词会高亮)我们用一张图来整体看一下倒排索引:一个倒排索引是由词词典(TermDictionary)和发帖列表(PostingList)组成的,词词典会记录发布列表中每个单词的偏移位置。比如在查找Allen时,首先通过词典快速定位到Allen,然后从Allen中获取倒排列表中的偏移量,快速定位到倒排列表中的位置,从而真正得到倒排索引Item[12,15](这里只是一个DocumentID的列表,其实就是一个item包含了上面提到的4项信息),拿到这个item的时候可以去index里面获取原始信息,可以计算出score和对其进行排序并将其返回给用户。了解了倒排索引的数据结构,我们再来看看ES中的倒排索引!ElasticSearch倒排索引那么ElasticSearch中的文档都是基于Json格式的,其中一个包含多个字段,每个字段都会有自己的倒排索引。在Mapping中,可以设置不对某些字段进行索引,这样可以节省存储空间,但同时也会使该字段不可搜索。比如一个文档包含username和job两个字段:{"username":"wupx","job":"programmer"}在建索引的时候是根据字段建的,那么在ES中username会有一个倒排的Index,作业也会有一个倒排索引。综上所述,本文主要介绍什么是倒排索引及其数据结构。下篇文章将学习如何在ES中分词形成倒排索引。参考资料Elasticsearch核心技术与实战https://dwz.cn/ELv7FvuX