倒排索引的数据结构:Term index、Term Dictionary、Posting List

简介: 倒排索引的数据结构:Term index、Term Dictionary、Posting List

2、倒排索引的数据结构

倒排索引其实包含了三种数据,分别是

  • 倒排表(Posting List)
  • 词项字典(Term Dictionary)
  • 词项索引(Term Index)


这几种文件分别存储了不同的数据


其中倒排表包含某个词项的所有id的数据存储了在.doc文件中;


词项字典包含了index field的所有经过normalization token filters处理之后的词项数据,最终存储在.tim文件中。


所谓normalization其实是一个如去重、时态统一、大小写统一、近义词处理等类似的相关操作;词项索引就是为了加速词项字典检索的一种数据结构,落地文件为.tip。.tip文件和.tim文件的数据结构如下图所示:

4d9fb9ba8aea4cc8b876ed9df6f3023d.png


Lucene中通过FST Index信息来读取当前域在索引文件.tim的具体信息,而同一个索引所有域的FSTIndex都被连续的写入在同一个.tip文件中,所以就需要indexStartFP 来索引 FSTIndex。


FSTIndex底层是一个字节数组,存储了每个Block在.tim中的起始位置,如上图所示,Block f和Block g对应的Block分别被保存在了.tim文件的Block 0和Block 1的位置。


每个Block内部又保存了Block Header、Suffix和Stats信息以及Metadatas信息,其中Block Header中存储了当前Block中的Pending Block和Pending Term的总计数,也就是EntryCount,Sufix则是保存了当前Block后缀的个数以及分别是什么,如block b的SufixLength=2,为f、g。Stats则保存了当前Term的词频和文档频率,参见org.apache.lucene.index.TermsEnum.TermStats。


其中docFreq为包含当前Term的doc数量,totalTermFreq为当前term在所有文档中的当前字段中出现的总次数,但实际保存的是和docFreq的差值,这也是遵循通用最小化算法的法则表现。需要注意的是,两者均是指在同一个域内的计数。Metadatas这里不着重介绍。


关于倒排表的文件结构,我们仅需知道其内部存储了包含Term的id数组、词频、postion、payload、offset等信息,需要重点注意的是ES内部采用怎样的压缩算法。这一点在下一节内容展开来讲。

相关文章
|
2月前
|
存储 NoSQL Java
使用 Redis 的 List 数据结构实现分页查询的思路
使用 Redis 的 List 数据结构实现分页查询的思路
|
8月前
|
存储 JavaScript 前端开发
数据结构之List | 让我们一块来学习数据结构
数据结构之List | 让我们一块来学习数据结构
90 0
|
8天前
|
存储 NoSQL Redis
Redis入门到通关之Redis数据结构-List篇
Redis入门到通关之Redis数据结构-List篇
24 1
|
2月前
|
存储 索引 Python
Python中的基础数据结构:列表(List)详解
本文将深入探讨Python中的基础数据结构——列表(List),包括其创建、访问、修改、常用操作以及背后的原理。通过示例代码,帮助读者更好地理解和应用列表。
23 0
|
4月前
|
存储 NoSQL 关系型数据库
Redis List 底层三种数据结构原理剖析
Redis List 底层三种数据结构原理剖析
61 0
|
10月前
|
存储 Java 开发者
Java-数据结构(三)-List:ArrayList和LinkedList及其相关面试题
Java-数据结构(三)-List:ArrayList和LinkedList及其相关面试题
144 0
|
5月前
|
Python
python数据结构,列表(list)和元组(tuple)有什么区别?
python数据结构,列表(list)和元组(tuple)有什么区别?
|
6月前
|
存储 安全 Java
数据结构之List基础入门与详解
数据结构之List基础入门与详解
58 0
|
8月前
|
存储 容器
【数据结构】 List与顺序表及接口的实现
【数据结构】 List与顺序表及接口的实现
|
9月前
|
容器
数据结构之第三章、List介绍
在集合框架中,List是一个接口,继承自Collection。 站在数据结构的角度来看,List就是一个线性表,即n个具有相同类型元素的有限序列,在该序列上可以执行增删改查以及变量等操作。 【面试题】Collection中有那些方法?虽然方法比较多,但是常用方法如下: 注意:List是个接口,并不能直接用来实例化 如果要使用,必须去实例化List的实现类。在集合框架中,ArrayList和LinkedList都实现了List接口。
43 0
数据结构之第三章、List介绍