Elasticsearch-倒排索引

     倒排索引就是单词到文档id的关系,如下所示,左边是一个正排索引,右边就是一个单词到文档id的倒排索引:
     倒排表以字或词为关键字进行索引,表中关键字所对应的记录表项记录了出现这个字或词的所有文档,一个表项就是一个字表段,它记录该文档的ID和字符在该文档中出现的位置情况。

核心组成:
倒排索引包含两部分:

1.单词词典:用B+树或哈希拉链法存储,记录文档的单词到倒排列表的关联关系;
2.倒排列表:由倒排索引项组成,包括文档id、词频tf、位置(所在文档id)、索引(单词在文档中的位置),如下所示是Elastic单词的倒排索引表:

es的json文档中的每个字段都有自己的倒排索引,可以指定某些字段不做索引,这么做可以节省磁盘空间,但也会导致这些字段不会被检索.

倒排索引介绍

单词——文档矩阵

单词-文档矩阵是表达两者之间所具有的一种包含关系的概念模型,图1展示了其含义。下图的每列代表一个文档,每行代表一个单词,打对勾的位置代表包含关系。

从纵向即文档这个维度来看,每列代表文档包含了哪些单词,比如文档1包含了词汇1和词汇4,而不包含其它单词。从横向即单词这个维度来看,每行代表了哪些文档包含了某个单词。比如对于词汇1来说,文档1和文档4中出现过单词1,而其它文档不包含词汇1。矩阵中其它的行列也可作此种解读。

搜索引擎的索引其实就是实现“单词-文档矩阵”的具体数据结构。可以有不同的方式来实现上述概念模型,比如“倒排索引”、“签名文件”、“后缀树”等方式。但是各项实验数据表明,“倒排索引”是实现单词到文档映射关系的最佳实现方式,所以本文主要介绍“倒排索引”的技术细节。

倒排索引基本概念
文档(Document):一般搜索引擎的处理对象是互联网网页,而文档这个概念要更宽泛些,代表以文本形式存在的存储对象,相比网页来说,涵盖更多种形式,比如Word,PDF,html,XML等不同格式的文件都可以称之为文档。再比如一封邮件,一条短信,一条微博也可以称之为文档。在本书后续内容,很多情况下会使用文档来表征文本信息。

文档集合(Document Collection):由若干文档构成的集合称之为文档集合。比如海量的互联网网页或者说大量的电子邮件都是文档集合的具体例子。

文档编号(Document ID):在搜索引擎内部,会将文档集合内每个文档赋予一个唯一的内部编号,以此编号来作为这个文档的唯一标识,这样方便内部处理,每个文档的内部编号即称之为“文档编号”,后文有时会用DocID来便捷地代表文档编号。

单词编号(Word ID):与文档编号类似,搜索引擎内部以唯一的编号来表征某个单词,单词编号可以作为某个单词的唯一表征。

倒排索引(Inverted Index):倒排索引是实现“单词-文档矩阵”的一种具体存储形式,通过倒排索引,可以根据单词快速获取包含这个单词的文档列表。倒排索引主要由两个部分组成:“单词词典”和“倒排文件”。

单词词典(Lexicon):搜索引擎的通常索引单位是单词,单词词典是由文档集合中出现过的所有单词构成的字符串集合,单词词典内每条索引项记载单词本身的一些信息以及指向“倒排列表”的指针。

倒排列表(PostingList):倒排列表记载了出现过某个单词的所有文档的文档列表及单词在该文档中出现的位置信息,每条记录称为一个倒排项(Posting)。根据倒排列表,即可获知哪些文档包含某个单词。

倒排文件(Inverted File):所有单词的倒排列表往往顺序地存储在磁盘的某个文件里,这个文件即被称之为倒排文件,倒排文件是存储倒排索引的物理文件。

倒排索引为什么快

正向索引

  • 什么是正向索引
    在解释反向索引之前,需要先了解一下什么是正向索引,这也将解释倒排索引之所以会出现的背景原因。
    所谓正向索引,其结构就是每个文档和关键字做关联,每个文档都有与之对应的关键字,记录关键字在文档中出现的位置和次数,用户查询的时候是根据关键字去查询的。
    例如,搜索引擎在处理网页文档的时候,会从网页中提取出来一些特殊关键词,比如文章标题、文本内容、作者、单位、网页阅读数、点赞数、评论数等等,同时统计关键词出现的次数、位置、格式等信息,之后将这些提取的词组成一个集关键词合。
    这样,网页文档与关键词之间的映射关系是 一个网页文件对应多个关键词,被存储进搜索引擎的索引库,其所实现的是一个 “文档-关键词” 矩阵, 如下表展示:

 

      在上表所展示的 “文档-关键词” 矩阵索引中,如果用户使用搜索引擎查找目标关键字(比如 火星),搜索引擎就会从索引库中所有的关键字包含 火星 的文档,也就是 web_x_1、web_x_2,并根据网页文件自身的价值评分高低(比如关键词出现的次数)按顺序展示给用户,用户得到的就是 按顺序 展示的 web_x_2web_x_1 两个网页。这就是正向索引实现的大致流程。

  • 正向索引的问题
    这个过程存在一个致命的问题,那就是在海量的网页里找到所有的关键词包含 火星 的网页,将是一个漫长的过程,在上面的例子中,如果总共有 1000亿个网页,并且有100万个包含火星,那么需要的计算量是惊人的。
    实际上,受制于时间、内存、处理器等等资源的限制,技术上正向索引是不能实现的。
    在这种背景下,倒排索引出现了。

反向索引

  • 什么是反向索引
    反向索引(Inverted Index),也叫倒排索引,相比于正向索引,其采用的是 “关键词-文档” 矩阵,关键词与网页文档之间的映射关系是 一个关键词对应多个网页文档,如下图所示:

     在这个矩阵中,火星 关键词对应的所有网页都被提前找到,甚至网页文档的权重都被提前计算好并排序,当用户输入 火星 关键词时,就会立刻到 web_x_2, web_x_1 的反馈结果。
这里有些人会有疑问,关键词数量会不会太多,以至于超过网页问的数量,这样效率不会反而变低了么,其实不然,人类的语言词汇数量是相对有限、且固定的,但网页数量却没有上限。比如汉语中,汉字30000个、词汇大概40万,但汉语网站数量却远远不止这么些。
需要注意的是,由于每个字或词对应的文档数量在动态变化,所以倒排表的建立和维护都较为复杂,但是在查询的时候由于可以一次得到查询关键字所对应的所有文档,所以效率高于正排表。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值