# 9.3.3 倒排索引入门

## 正排与倒排索引

* 在一本书的开始，有一个目录 - 正排

![](https://2471267620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LfNyxSFSDaHeCRaQx74%2F-LoOfS_Tpa_i-9ODFL2N%2F-LoOfVJqZ9Wg_2VSSaxW%2F1568083459813.png?generation=1568093903111112\&alt=media)

* 在一本书的最后，有一个索引页 - 倒排

根据关键词查看内容所在页

![](https://2471267620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LfNyxSFSDaHeCRaQx74%2F-LoOfS_Tpa_i-9ODFL2N%2F-LoOfVJsgN-3YXrmyHyl%2F1568083528241.png?generation=1568093902319367\&alt=media)

### 图书和索引引擎的类比

* 图书
  * 正排索引 - 目录页
  * 倒排索引 - 索引页
* 索引引擎
  * 正排索引 - 文档id到文档内容和单词的关联
  * 倒排索引 - 单词到文档id的关联

### 举例

![](https://2471267620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LfNyxSFSDaHeCRaQx74%2F-LoOfS_Tpa_i-9ODFL2N%2F-LoOfVJuDgfDSkgcYgdd%2F1568084661010.png?generation=1568093901579051\&alt=media)

## 倒排索引

### 倒排索引的核心组成

* 倒排索引包含两个部分
  * 单词词典（Term Dictionary）,记录所有文档的单词，记录单词到倒排列表的关联关系
    * 单词词典一般比较大，可以通过B + 树或哈希拉链法实现，以满足高性能的插入与查询
  * 倒排列表（Posting List）,记录了单词对应的文档组合，由倒排索引项组成
    * 倒排索引项（Posting）
      * 文档ID
      * 词频 TF - 该单词在文档中出现的次数，用户相关性评分
      * 位置（Position）- 单词在文档中分词的位置。用于语句搜索（phrase query）
      * 偏移（Offset）- 记录单词的开始结束位置，实现高亮显示

### 举例

Elasticsearch的在文档内容的索引

![](https://2471267620-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LfNyxSFSDaHeCRaQx74%2F-LoOfS_Tpa_i-9ODFL2N%2F-LoOfVJw597nXy9EW4k7%2F1568085534232.png?generation=1568093903214178\&alt=media)

### Elasticsearch的倒排索引

* Elasticsearch的JSON文档中的每个字段，都有自己的倒排索引
* 可以指定对某些字段不做索引
  * 优点：节省存储空间
  * 缺点： 字段无法被搜索
