倒排索引


1 索引

1.1 什么是索引

索引是用于快速检索数据的一种数据结构。举个例子,新华字典的目录页就是典型的索引,可以通过目录查找对应汉字的详细数据,如果没有目录,那么每一个汉字都需要翻阅整个新华字典才能找到释义,太浪费时间了。

1.2 倒排索引能做什么

数据库索引通过索引列查询详细的数据,以下表为例。

id content
1 我经常在美团上点外卖
2 我偶尔在饿了么上点外卖
3 外卖不如学校食堂好吃
4 我很少点商业街的外卖

数据库索引将id与title相关联,可以通过id搜索对应的title。但假如我需要查找content包含外卖的条目信息,那么在数据库索引中可以使用模糊查询%外卖%的方式,但我们知道这种查询方式会走全表扫描,效率低下。更进一步的,如果我想搜索美团外卖关键词呢。似乎btree索引无法实现这样的需求了。

因此,实际上倒排索引需要对文档内容进行分词。

content 分词结果
我常点美团的外卖 我、常点、美团、的、外卖
我常点饿了么的外卖 我、常点、饿了么、的、外卖
外卖不如学校食堂好吃 外卖、不如、学校、食堂、好吃
我不点商业街的外卖 我、不点、商业街、的、外卖

并且,每个分词都会跟对应的id关联起来。

分词 文档id
[1、2、4]
常点 [1、2]
美团 [1]
饿了么 [2]
[1、2、4]
外卖 [1、2、3、4]
不如 [3]
学校 [3]

那么现在,如果想要查询外卖这个关键词,那么会首先拿到文档id1、2、3、4,然后通过id去搜索到具体的content内容。

如果想要查询外卖 美团这个关键词,那么会拿到文档id[1、2、3、4]与文档id[1],然后做一个合并操作只留下文档id[1].再通过id搜索具体内容。

现在我们已经知道倒排索引的流程大致是什么样的了。但这里有几个问题仍然还没有明确:

  • 分词是如何做的?
  • 文档id的合并操作如何实现?
  • 使用什么样的数据结构实现的倒排索引?

接下来的部分会对这几个问题进行阐述。

2 lucene查询原理

2.1 基本概念

2.2 查询过程

2.2.1 term index

2.2.2 term dictionary

2.2.3 合并position

2.2.3.1 基于跳跃表
2.2.3.2 基于bitset

文章作者: Jacob
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Jacob !
 上一篇
elasticsearch elasticsearch
2022-04-16 Jacob
下一篇 
git git
git的一些常用命令查询,以及一些开发过程中遇到的git的用法
2021-11-15 Jacob
  目录