ElasticSearch - 倒排索引

ElasticSearch - 倒排索引

八月 21, 2019

Elasticsearch使用一种叫做倒排索引(inverted index)的结构来做快速的全文搜索。倒排索引由在文档中出现的唯一的单词列表,以及对于每个单词在文档中的位置组成。
我们把正排索引看作是书的目录,那倒排索引就是类似词典中单词的索引页,告诉你它在第几页:

  • 书籍
    1. 正排索引 - 目录页
    2. 倒排索引 - 索引页
  • 搜索引擎
    1. 正排索引 - 文档id到文档内容和单词的关联
    2. 倒排索引 - 单词到文档id的关系

正排索引:

文档Id 文档内容
1 blue yellow
2 yellow green
3 yellow red

倒排索引:

Term Count DocumentId:Postition
yellow 3 1:1,2:0,3:0
blue 1 1:0
green 1 2:1
red 1 3:1

倒排索引的组成

  • 单词词典
    记录所有文档的单词,记录到此到倒排列表的关联关系
    ps: 单词词典一般很大,通过b+或者哈希拉链法实现,满足其高性能的插入与查询
  • 倒排列表
    记录了单词对应的文档结合,由倒排索引项组成:
    1. 文档id
    2. 词频 - 该词在文档中出现的次数,用于相关性评分
    3. 位置 - 文档中分词的位置。 用于语句搜索
    4. 偏移 - 记录单词的开始结束位置,实现高亮显示

Demo:Elasticsearch

文档Id 文档内容
1 Mastering Elasticsearch
2 Elasticsearch Server
3 Elasticsearch Essentials
Doc Id TF Position Offset
1 1 1 <10,23>
2 1 0 <0,13>
3 1 0 <0,13>

ES的倒排索引

  • ES的json文档中的每个字段,都有自己的倒排索引

  • 可以指定对某些字段不做索引

    优点: 节省存储空间  
    缺点: 字段无法被搜索