引言
倒排索引的概念是基于
MySQL
这样的正排索引而言的,所以本文章以对比的形式介绍正排索引和倒排索引他们各自的特点以及区别。
正排索引
概念
正排索引是一种直接通过文档ID(或文档标识)来访问文档内容的索引方式。在正排索引中,每个文档都有一个唯一的标识符,通过这个标识符可以直接定位到文档本身。
例如:
特点
直接访问:如果是根据
id
查询,那么直接走索引,查询速度非常快。
但如果是基于
title
做模糊查询,只能是逐行扫描数据,流程如下:
1
)用户搜索数据,条件是
title
符合
"%
手机
%"
2
)逐行获取数据,比如
id
为
1
的数据
3
)判断数据中的
title
是否符合用户搜索条件
4
)如果符合则放入结果集,不符合则丢弃。回到步骤
1
逐行扫描:也就是全表扫描,随着数据量增加,其查询效率也会越来越低。当数据量达到数百万时,就是一场灾难。
结构简单:逻辑上类似于数据库中的主键索引。
更新困难:当文档更新时,可能需要更新整个文档的索引条目。
倒排索引
概念
倒排索引是一种通过单词(或短语)快速定位到包含这些内容的文档列表的索引方式。它是基于内容的单词或短语来组织的,每个单词都对应一个倒排列表(Posting List),列出了包含该单词的所有文档的位置信息。
倒排索引中有两个非常重要的概念:
文档( Document
):用来搜索的数据,其中的每一条数据就是一个文档。例如一个网页、一个商
品信息
词条( Term
):对文档数据或用户搜索数据,利用某种算法分词,得到的具备含义的词语就是词
条。例如:我是中国人,就可以分为:我、是、中国人、中国、国人这样的几个词条
创建倒排索引
是对正向索引的一种特殊处理,流程如下:
- 将每一个文档的数据利用算法分词,得到一个个词条
- 创建表,每行数据包括词条、词条所在文档id、位置等信息
- 因为词条唯一性,可以给词条创建索引,例如hash表结构索引
如图:
倒排索引的
搜索流程
如下(以搜索
"
华为手机
"
为例):
- 用户输入条件 "华为手机" 进行搜索。
- 对用户输入内容分词,得到词条: 华为 、 手机 。
- 拿着词条在倒排索引中查找,可以得到包含词条的文档id:1、2、3。
- 拿着文档id到正向索引中查找具体文档
如图:
特点
高效搜索:非常适合于全文搜索,可以快速检索包含特定单词或短语的文档,无需全表扫描。
结构复杂:需要维护一个词典和多个倒排列表。
更新高效:在文档更新时,只需要更新相关的倒排列表。
节省空间:通过压缩和优化技术,可以有效地减少索引占用的存储空间