Elasticsearch - 倒排索引

Caret Up

为创建倒排索引,es首先将每个文档的 content 域拆分成单独的词(词条 || Tokens),并创建一个包含所有不重复词条的排序列表,然后记录每个词条出现在哪个文档。

倒排索引

  1. 倒排索引包含两个部分
    1. 单词词典,记录所有文档的单词,记录单词到倒排列表的关联关系
      • 单词词典一般比较大,可以通过 B+ 树或者哈希拉链法实现,以满足高性能的插入与查询
    2. 倒排列表,记录了单词对应的文档结合,由倒排索引项组成
      • 倒排索引项
        1. 文档 ID - 文档唯一ID
        2. 词频 TF - 该单词在文档中出现的次数,用于相关性评分
        3. 位置 Position - 单词在文档中分词的位置。用于语句搜索 (phrase query)
        4. 偏移 Offset - 记录单词的开始结束位置,实现高亮显示
  2. Elasticsearch 的 JSON 文档中的每个字段,都有自己的倒排索引
  3. 可以在 Mapping 中指定对某些字段不做索引
    • 优点:节省存储空间
    • 缺点:字段无法被搜索

直观的例子

  • 图书

    • 正排索引 - 目录页
    • 倒排索引 - 索引页
  • 搜索引擎

    • 正排索引 - 文档 id 到文档内容和单词的关联
    • 倒排索引 - 单词到文档id 的关系