Elasticsearch实战与原理解析
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.5 倒排索引

在中文信息检索领域,索引的发展经历了基于字的索引和基于词的索引两种。不论是基于字做索引,还是基于词做索引,在建立索引过程中,均涉及正排索引和倒排索引两个数据结构。

正排索引的数据结构如图2-5所示。

图2-5

如图2-5所示,在正排索引中,以网页或文章映射关系为Key、以分词的列表为Value。而在实际搜索网页或文章时,恰恰与此结构相反,即在搜索时是以查询语句的分词列表为Key来进行搜索的。因此,为了提高搜索效率,我们需要对正排索引进行转化,将其转化为以分词为Key、以网页或文章列表为Value的结构,而这个结构就是倒排索引,如图2-6所示。

图2-6

在介绍完正排索引和倒排索引的结构后,下面我们以三句话为例,展示基于字的索引和基于词的索引的区别。

内容1:英国是近代的世界强国。

内容2:美国是当代的世界强国。

内容3:中国是未来的世界强国。

当基于字做索引时,对上述三句话进行字的分解,分解结果如下所示。

内容1:英国是近代的世界强国。

内容2:美国是当代的世界强国。

内容3:中国是未来的世界强国。

倒排索引结构如表2-1所示。

表2-1

当基于词做索引时,对这三句话进行分词,分词结果如下所示。

内容1:英国是近代的世界强国。

内容2:美国是当代的世界强国。

内容3:中国是未来的世界强国。

倒排索引结构如表2-2所示。

表2-2

通过对比不难发现,基于词做索引的索引内容明显比基于字做索引的索引内容要少,因而查询时会更加高效。

此外,在倒排索引中一般还会记录更多的信息,如词汇在网页或文章中出现的位置、频率和权重等,这些信息在查询阶段会用到。

在倒排索引中,有词条(Term)、词典(Term Dictionary)、倒排表(Post List)三个名词,下面我们一一介绍。

词条是索引里面最小的存储和查询单元。一般来说,在英文语境中词条是一个单词,在中文语境中词条指的是分词后的一个词组。

词典又称字典,是词条的集合。单词词典一般是由网页或文章集合中出现过的所有词构成的字符串集合。

倒排表如图2-2所示,倒排表记录的是词出现在哪些文档里、出现的位置和频率等。

在倒排表中,每条记录被称为一个倒排项。

前文中提及,Elasticsearch是基于Lucene实现的。在Lucene中,词典和倒排表是实现快速检索的重要基石。另外,词典和倒排表是分两部分存储的,词典存储在内存中,倒排表存储在磁盘上。