一直在看大神的文章,
https://www.amazingkoala.com.c ... .html
谈一下我的一些观点。
另外:如果不去看(或者说不理解)Lucene代码,你光了解FST,是没什么实际作用的。
只是说哦大概知道了有这么一个东西存在,其他就没了。
说实在的,Lucene代码,跟ES的,不是一个等级的。
ES的虽然多,但功能明确,结构简单,比较好理解
(也有一些我感觉复杂的,比如快照那部分,在备份发生变化时,它的元数据是如何调整的)
Lucene涉及底层数据读写和算法实现,所以难理解。
下面说的,如果有错误或想法,请指出。
https://www.amazingkoala.com.c ... .html
谈一下我的一些观点。
另外:如果不去看(或者说不理解)Lucene代码,你光了解FST,是没什么实际作用的。
只是说哦大概知道了有这么一个东西存在,其他就没了。
说实在的,Lucene代码,跟ES的,不是一个等级的。
ES的虽然多,但功能明确,结构简单,比较好理解
(也有一些我感觉复杂的,比如快照那部分,在备份发生变化时,它的元数据是如何调整的)
Lucene涉及底层数据读写和算法实现,所以难理解。
下面说的,如果有错误或想法,请指出。
8 个回复
Charele - Cisco4321
赞同来自:
这里,他提到了FST bytes里面的“四元组”概念,
严格来说,这是不正确的,说应该是“五元组”。看下面的情况:
具体情况,图中我已经标得很清楚了,一看就明白
另外:这里有个问题,如果我找"ac"的时候,是不是一定要经过"b"呢???
Charele - Cisco4321
赞同来自:
关于4元组中的"flag"标记,
可能是版本原因,还有一个标记那个文章里没有提及:
具体作用嘛感兴趣的可以自己研究。
Charele - Cisco4321
赞同来自:
他提到了FST的导入模式,就是FST初始是加载进内存还是留在硬盘的意思,
还有其他一些可选的参数,比如AUTO啥啥的,
这个话题在较新的版本9.1(我用的ES 8.2.0)中已经无效了,
它直接用的就是off-heap,不会用到on-heap了。
有个例外,就是在suggest的时候会用on-heap,那个不讨论。
Charele - Cisco4321
赞同来自:
很多相关文章中会提到tip,tim,
在新版Lucene中,他把元数据放在了tmd里面,
这使无疑给我们理解查询增加了一点难度。
tmd,是Term Metadata
它现在成了总管,它保存了tip,tim的文件指针:
Charele - Cisco4321
赞同来自:
来说一下新版Lucene中不一样的一些地方(就是大神链接文章里没有的)
给有兴趣的同学了解下。
一就是对suffix的压缩,就是为了节省空间(不一定会压)
看看压缩算法描述:
1> 看注释,此物就是为了对suffix压缩的
2> 数字是编号,就是为了识别用
00表示不压缩。压缩算法的细节就不深究了,估计我也看不懂:-(
另外,这个类里面,提供了自己的解压方法,压缩方法在相应的静态方法里提供
Charele - Cisco4321
赞同来自:
采用Lz4压缩的情况
绿1表示会用压缩的前提(只是前提条件)
绿2表示会用Lz4压缩的前提:suffix的总长度大于suffix条目的6倍 然后会进行lz4压缩,
只有当节省了1/4的空间,才会采用lz4这种方式。
注意: 压缩后的数据会存在红色的spareWriter里面
Charele - Cisco4321
赞同来自:
如果上面,没有用lz4,那就会尝试另外一种叫LOWERCASE_ASCII的方式(转小写也能压缩?)
同上面一样,成功了数据就会在红色的spareWriter里面。
黄色代码是把上面执行过的残留清一下,这是必须的
Charele - Cisco4321
赞同来自:
下面看看对3种不同压缩情况的处理:
三个绿色就是对编码的处理,
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文件(就是执行查询)时的情况: