【Elasticsearch 系列】 倒排索引

正排索引和倒排索引

在讲倒排索引前,先了解下什么是正排索引。在搜索引擎中每个文件对应一个文档 ID ,是文档 ID 到文档内容和单词的关联。

文档 ID 文档内容
1 Mastering ElasticSearch
2 ElasticSearch Server
3 ElasticSearch Essentials

倒排索引是单词到文档 ID 的关系

Term Count DocumentId: Position
ElasticSearch 3 1:1,2:0,3:0
Mastering 1 1:0
Server 2 2:1
Essentials 3 1:0

上面这个倒排索引记录每个词出现的次数,以及出现在文档的位置。

倒排索引的核心组成

倒排索引包含二个部分:

  • 单词词典(Term Dictionary),记录了所有的文档的单词,记录单词到倒排列表的关联关系。
    • 一般来说,单词词典一般来讲比较大,可以使用 B + 树或哈希拉链法实现,以满足高性能的插入和查询。
  • 倒排列表(Position List),记录了单词对应文档的集合,由倒排索引项组成。
    • 倒排索引项
      • 文档 ID
      • 词频 TF,该单词在文档中出现在次数,用于相关性打分
      • 位置 Position,单词在文档中出现的位置,用于语句搜索(phrase query)
      • 偏移,记录单词的起始位置,实现高亮显示。

对于下面这个文档列表:

文档 ID 文档内容
1 Mastering ElasticSearch
2 ElasticSearch Server
3 ElasticSearch Essentials

对 ElasticSearch 这个词的倒排列表(Position List)是:

Doc ID TF Position Offset
1 1 1 <10:23>
2 1 0 <0,13>
3 1 0 <0,13>

ES 中的倒排索引

对于 ES 中 JSON 文档中的每一个字段,都有自己的倒排索引。
当然,也可以对某些字段不做索引。其优点是节省存储空间、缺点是无法被搜索。


   转载规则


《【Elasticsearch 系列】 倒排索引》 孤独如梦 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
Arrays.asList 存在的坑 Arrays.asList 存在的坑
前言在刷 leetcode 的时候,需要把一个数组转成一个list,并且需要往这个list中添加元素。很自然的就想到了 Arrays.asList() 这个方法。愉快的写出了下面的代码。 List<Integer> list = Ar
2019-10-14
下一篇 
【Elasticsearch 系列】 文档的基本 CRUD 和批量操作 【Elasticsearch 系列】 文档的基本 CRUD 和批量操作
前言以下操作均在 kibana 下进行,提前需要安装 kinana。 CRUDIndex 操作 # 文档不存在,创建一个新的文档,索引名为 my_indexs ,type 默认为 doc, 文档 id = 1 put my_indexs/_
2019-09-26
  目录