有个人长的像洋葱,走着走着就哭了…….

关于FST的一些讨论

Elasticsearch | 作者 Charele | 发布于2022年06月04日 | 阅读数:1961

 一直在看大神的文章,
https://www.amazingkoala.com.c ... .html
谈一下我的一些观点。
 
另外:如果不去看(或者说不理解)Lucene代码,你光了解FST,是没什么实际作用的。
只是说哦大概知道了有这么一个东西存在,其他就没了。
 
说实在的,Lucene代码,跟ES的,不是一个等级的。
ES的虽然多,但功能明确,结构简单,比较好理解
(也有一些我感觉复杂的,比如快照那部分,在备份发生变化时,它的元数据是如何调整的)
 
Lucene涉及底层数据读写和算法实现,所以难理解。 
 
 下面说的,如果有错误或想法,请指出。
已邀请:

Charele - Cisco4321

赞同来自:

1
111.png

 
这里,他提到了FST bytes里面的“四元组”概念,
严格来说,这是不正确的,说应该是“五元组”。看下面的情况:

111.png
既有output,又有finalOutput的情况下,就会产生5元组。
具体情况,图中我已经标得很清楚了,一看就明白
 
另外:这里有个问题,如果我找"ac"的时候,是不是一定要经过"b"呢??? 
 

Charele - Cisco4321

赞同来自:

2
关于4元组中的"flag"标记,
可能是版本原因,还有一个标记那个文章里没有提及:
333.png

具体作用嘛感兴趣的可以自己研究。

Charele - Cisco4321

赞同来自:

3
他提到了FST的导入模式,就是FST初始是加载进内存还是留在硬盘的意思,
还有其他一些可选的参数,比如AUTO啥啥的,
111.png

 
这个话题在较新的版本9.1(我用的ES 8.2.0)中已经无效了,
它直接用的就是off-heap,不会用到on-heap了。
111.png



 有个例外,就是在suggest的时候会用on-heap,那个不讨论。

Charele - Cisco4321

赞同来自:

4
很多相关文章中会提到tip,tim,
在新版Lucene中,他把元数据放在了tmd里面,
444.png


这使无疑给我们理解查询增加了一点难度。
tmd,是Term Metadata
 
它现在成了总管,它保存了tip,tim的文件指针:
111.png

 

Charele - Cisco4321

赞同来自:

5
来说一下新版Lucene中不一样的一些地方(就是大神链接文章里没有的)
给有兴趣的同学了解下。
 
  一就是对suffix的压缩,就是为了节省空间(不一定会压)
看看压缩算法描述:
111.png

1> 看注释,此物就是为了对suffix压缩的
2> 数字是编号,就是为了识别用
 
00表示不压缩。压缩算法的细节就不深究了,估计我也看不懂:-(
另外,这个类里面,提供了自己的解压方法,压缩方法在相应的静态方法里提供

Charele - Cisco4321

赞同来自:

6
采用Lz4压缩的情况
222.png

绿1表示会用压缩的前提(只是前提条件)
 
绿2表示会用Lz4压缩的前提:suffix的总长度大于suffix条目的6倍 然后会进行lz4压缩,
只有当节省了1/4的空间,才会采用lz4这种方式。
注意:    压缩后的数据会存在红色的spareWriter里面

Charele - Cisco4321

赞同来自:

7
如果上面,没有用lz4,那就会尝试另外一种叫LOWERCASE_ASCII的方式(转小写也能压缩?)
同上面一样,成功了数据就会在红色的spareWriter里面。

111.png

黄色代码是把上面执行过的残留清一下,这是必须的

Charele - Cisco4321

赞同来自:

8
下面看看对3种不同压缩情况的处理:
222.png

三个绿色就是对编码的处理,
1> 对后缀数理左移3位,空出最右边的"000"
2> 如果是叶block,则变为"100",
 
关于叶block是什么,就是现在要处理的这一段pendingEntry里面,有没有pendingBlock。
具体可参与链接文章。
 
 3> 最右边两位,就是指定不同的压缩方式了,就是写进5楼对应的序号,以便在读的时候,采取相应解压方式
 
(所以最后3位的可能性会是000, 001, 010, 100, 101, 110
但肯定不会出现011, 111,因为跟本没有"11"这种压缩方式。)
 然后,把这个token写进tim文件。
 
然后,就是写具体的后缀数据到tim了,
蓝色的是不压缩的,
红色的是两种压缩的情况(上面说了,只要压缩了,压缩过的数据就会在spareWriter里面)
 
黄色的就是对两种情况容器的清理,以便下次使用。
 
下面再说说读tim文件(就是执行查询)时的情况:
 
 
 
 
 

要回复问题请先登录注册