目录
查看builder类(package org.apache.lucene.util.fst)
查看BlockTreeTermsWriter类(packageorg.apache.lucene.codecs.blocktree)
FST存储到文件中的存储结构(TermIndex词项索引和TermDictionary词项字典)
首先声明图片数据来源:b站马士兵教育。
luncence源码百度云:
链接:https://pan.baidu.com/s/12EQtJ_t-P3-P_CJnHIfnEw
提取码:abcd
数据结构FST简述
了解一下trie前缀树:复用所有前缀

FSM(Finite State Machines)有限状态机: 表示有限个状态集合以及这些状态之间转移和动作的数学模型。其中一个状态被标记为开始状态,0个或更多的状态被标记为final状态
FSA:有限状态接收机
确定性:在任何给定状态下,对于任何输入,最多只能遍历一个transtion
非循环:不可能重复遍历同一个状态
Final唯一性:当且仅当有限状态机在输入序列的末尾处于最终状态时,才接受特定的输入序列
以上例子,如果输入‘wl’会怎样?其实就是可以搜索到的了。因为l指向的节点3已经是final节点了。为解决这样的问题,引出FST
FST简述及它的查询过程
FST:有限状态转化机
FST最重要的功能是可以实现key到value的映射,相当于HashMap<K,V>。FST的查询速度比hashMap慢一点,但是内存消耗比hashMap小很多。FST在lucene大量使用:倒排索引的存储,同义词词典的存储,搜索关键字建议等等。
对于es来说,它是基于lucence开发,底层的数据结构使用的就是fst,它的主要优点:
- 查询快
- 极致压缩空间占用
特性:
确定性:在任何给定状态下,对于任何输入,最多只能遍历一个transtion
非循环:不可能重复遍历同一个状态
transducer: 转化器有相关的值(payload),final节点会输出一个值
比起前面的前缀树以及FSA,在存储的时候多了一个value值。
考虑以下输入字符:
此时,再输入wl试试?尽管节点3是final节点,但是由于值对不上,所以不会搜索成功的。
从Lucence源码中看FST的结构
查看builder类(package org.apache.lucene.util.fst)

节点模型:node
考虑需要输入这样一组数据
由于按照字典序排序,输入abd的时候,由于此时系统不知道后面是否还存在abde,abdc类似的数据,所以此时输入的abd就是unCompliledNode
当输入abe的时候,已经可以确定后面不会有abd这些数据了(字典序),但是无法确定ab前缀还是否存在,直到输入ac为止才确认不会有ab前缀了。此时字符’d’被移除出frontier数组,把它冻结起来 -freezeTail
描述边,也就是出度的类是Arc

label:存放那个输入的字符作为Key
output:存放对应的值也就是Value
target:简单理解为存放偏移量,如果arc描述的字符不是最后一个字符的时候,就会有这么一个偏移量。
flags:其实就是起始值,通过位运算(通用最小化算法)得来.
查看BlockTreeTermsWriter类(packageorg.apache.lucene.codecs.blocktree)
PendingEntry—PendingBlock --PendingTerm
通过输入的字符,一般的是Term,满足某种条件则会被聚合成Block

Block——根据给的阈值(min24,max48)划分成Block或者Term
简单理解:若是子节点少于24,则仍然为单独的PedingTerm,若是大于等于24,则会被聚合成一个PendingBlock.如果这个PendingBlock大于48,则会被分成多个FloorBlock
通过构建过程来理解:
1.输入abd,abe,此时还都是正常的情况。(abd和abe都是term)

2.输入abfi,abfj,abfk,此时可以看到f已经有三个出度k I j了,初步满足聚合成Block的条件
此时还都是term,没有聚合成block,虽然已经满足了条件给出的3个。但是由于输入项还没确定完.所以还不能聚合起来。
3输入abgl---->聚合成Block
由于此时已经确定f已经不会做修改了,此时由于f有三个出度,所以I j k可以聚合成pedingBlock

4.继续输入abgm,abgn,abgo,abgp,abgp,abgq,abgr。此时g已经有七个出度了!!但是没有聚合成Block

等到结束g出度的输入的时候,才会发生聚合block
5.输入abh,此时聚合成g的block,它底下还有两个floorblock

FST存储到文件中的存储结构(TermIndex词项索引和TermDictionary词项字典)
.tip: 存放Term-Index
.tim:存放Term-Dictonary

Term-index里面存放的FSTindex存放Block的前缀记录,末尾指向block..这些block具体存放在.tim文件也就是term Dictonary里面。
block具体存放的是啥?

BlockHeader:
Suffix: 
states: 
metaLength: 
再来看看FST-Index和block更详细的内容

以这样一个词项字典

还是这张图
构建FST-Index

其中flag是标志位,代表着一个block的开始.

本文深入解析了FST(Finite State Transducer)数据结构,介绍了其查询过程、Lucene源码中的实现细节,包括Builder类和BlockTreeTermsWriter,以及FST在存储(TermIndex和TermDictionary)和构建过程中的关键概念。通过图解展示了节点添加和FST字符串读取的步骤。
最低0.47元/天 解锁文章
2万+

被折叠的 条评论
为什么被折叠?



