FST是什么,最开始我也不知道,直到我看了两篇博客,http://www.shenyanchao.cn/blog/2018/12/04/lucene-fst/ https://blog.csdn.net/zx2011302580235/article/details/88594342 看完了之后才真的懂了什么是FST,所以建议大家先看一遍这两篇博客,然后再看我的,因为我写的不是介绍FST的,而是深入到代码层面。
在之前研究IK的时候,看了他存储词典的格式,接触到了前缀树这种数据结构,他的好处是可以共享前缀,但是并不能共享后缀,而FST就能共享后缀,实现更加高效的存储或者查找。当然FST比前缀树添加了一个要求:必须是按照字典顺序添加的,而前缀树则没有这个要求。FST除了能存东西,判断某个东西是否存在,即起到Set的功能外,还能实现Map的功能,即存储、查找key-value。在lucene的词典表、同义词的模块中都使用了FST,另外,我自己在工作中,也用到了,用来保存分词的权重,使用FST的确是能大大的降低内存,当然他的查找复杂度是要比HashMap要慢一些,他的查找复杂度是O(length(input)),查找的内容越长需要的时间也就越多,但是他得内存消耗比起Hashmap来说真的是太小了。
通过上面的两天博客,可以大概了解FST的组成包括两部分,一个是节点(Node),另一个是边(Arc),一个arc指向一个节点,在这个arc上有一个输入叫做label,还有输出(也可能没有输出),还有一个可能的finalOutput(最终输出,以后会介绍这个的作用)。一个节点可能有多个arc指向,但是一个arc只能指向一个节点。arc上的label其实就是输入的一部分,比如输入是abc,则会有三个arc,四个node,每个arc上的输出分别是a、b、,至于输出的话需要配合其他的节点才能确定。在FST的形成过程中,始终有一个叫做frontier的数组,也就是刚刚添加的一个term(或者说路线),frontier的存在就是为了做共享前缀,当下一个term过来的时候,先计算共享前缀(所以这里要求FST必须是按照排序顺序写入的),将现在的frontier中除去共享前缀以外的部分都会编译进入到fst中,然后将新的term出去共享前缀以外的部分写入到frontier,重新更新frontier,直到最后写入完成,调用Builder.finish方法将最后的frontier写入到fst中,然后再将root节点(也就是第一个节点,实际上就是所有的开头的arc)编译进fst,然后再经过压缩(不压缩也是可以用的,只是使用的内存会稍微一点)。在编译进入fst的时候,会查找共享后缀,比如之前写的是ab、现在突然来了一个bb,此时需要把aa编译进入fst,frontier中保存的是bb,等到下一个term过来时,假设来的是c,则需要把bb也编译进入,如果这里能用共享后缀的话,ab和bb就可以使用同一个边b指向结束的node了。看到这里估计会大概对fst有个初步的概念了。
FST很难以理解,但是真的很有用,理解了FST,也算是把自己的能力又提升了一个台阶。我个人用了一周的课余时间才把FST的代码看完,也算是收货颇丰,接下来我将分别介绍FST的生成、压缩、读取。先说一下我看的是lucene6.6版本的。
后续:第二篇博客,FST的生成并没有发表完全,ITEYE提示我有敏感词没法发表,所以仅仅保存了一部分,经过几个小时的努力仍然没有找到哪个词是敏感词最终放弃了,所以第二篇博客写的不全。浪费我好几个小时!
相关推荐
1. FSTbytes:这是一个字节数组,存储了完整的FST图信息。通过这个数组,可以重建FST图,从而快速定位到term在磁盘上的存储位置。 2. FSTNode:表示FST图中的节点。节点有两种类型:UnCompiledNode和CompiledNode。...
赠送源代码:fst-2.57-sources.jar; 赠送Maven依赖信息文件:fst-2.57.pom; 包含翻译后的API文档:fst-2.57-javadoc-API文档-中文(简体)-英语-对照版.zip; Maven坐标:de.ruedigermoeller:fst:2.57; 标签:...
《关于Lucene的词典FST深入剖析》这篇文章是由申艳超撰写的,主要探讨了Apache Lucene这个全文搜索引擎库中的一个关键数据结构——有限状态转换器(Finite State Transducer,简称FST)。FST在Lucene中被用于构建和...
1. **高性能**:FST通过优化的序列化算法和字节码处理,实现了比Java默认序列化快几倍的速度。这在处理大量数据或者高并发场景下,能显著提升系统性能。 2. **小内存开销**:FST在序列化过程中能够减少无用的元数据...
《fst2.4及其依赖包详解》 在Java开发中,高效的序列化和反序列化是关键环节之一,尤其在大数据处理、网络通信以及持久化存储等场景中。FST(Fast Serialization)库是一个高性能的Java对象序列化库,旨在替代标准...
赠送源代码:fst-2.57-sources.jar; 赠送Maven依赖信息文件:fst-2.57.pom; 包含翻译后的API文档:fst-2.57-javadoc-API文档-中文(简体)版.zip; Maven坐标:de.ruedigermoeller:fst:2.57; 标签:ruedigermoeller...
根据提供的文件内容,这里是一份关于74FST3253高速4选1数据手册的知识点整理: 1. 器件介绍: 74FST3253是由ON Semiconductor生产的高速4选1多路选择器/解复用器总线开关。这款器件在4到5.5伏的电压范围内与CMOS ...
FST算法-关新全1 FST(Finite State Transducer)是一种有限自动机,也称为Mealy machine,是Lucene中的一个核心算法,用于检索term信息存储的位置。在Lucene中,term按照其字典顺序排序(term在存储时称为input)...
1. **构造FST**: 用户可以通过添加状态、边和转换来构建FST。这个过程允许用户定义输入符号、输出符号和权重,以满足特定的映射需求。 2. **序列化与反序列化**: Vellum库支持将FST保存到磁盘,以便于持久化和共享...
FST610变频器是深圳市佛斯特科技有限公司生产的一款高性能矢量通用型变频器,它支持多种控制方式,如VF控制、无PG矢量控制、转矩控制,拥有丰富的参数功能,适用于对速度、转矩响应速度、低频力矩要求较高的场合。...
佛斯特FST-500系列变频器是一款广泛应用在工业自动化领域的设备,它通过调节电机的供电频率来实现电机速度的控制,从而达到节能、调速的目的。本说明书主要涵盖了该系列变频器的基本原理、功能特性、安装调试、操作...
在IT领域,配置文件的管理和读取是系统初始化和运行中的关键步骤,特别是在软件开发、运维自动化...通过阅读README.TXT,你可以获得关于如何使用和解读“fst”配置文件的具体步骤和示例,从而更好地应用到实际工作中。
jaque.zip,Java查询库使语言级代码表达式在运行时以表达式树的形式表示为对象,
**1. 加速产品上市** 由于Linux系统广泛应用于不同类型的嵌入式设备,对每款设备进行彻底的测试通常耗时且成本高昂。FST提供了一种全面的解决方案来应对复杂而全面的测试挑战,使经过测试的设备能够按时上市,同时...
1. **介绍**:SITRANS FST030是超声波流量计系列的一员,设计用于精确测量液体流量。它利用超声波在流体中传播的时间差来确定流速,适用于清洁或微粒悬浮的液体。 2. **安全注意事项**:手册中的安全警示系统分为四...
### 帧差法改进Matlab源代码解析与详解 #### 一、帧差法基本原理及应用背景 帧差法是一种广泛应用于视频处理领域的技术,主要用于运动目标检测。其核心思想是通过比较相邻帧之间的差异来判断物体的移动情况。这种...
标题 "fst.rar_fst_visual c" 暗示这是一个与 Fibonacci 系列测试相关的项目,使用了 Visual C++ 这个编程环境。Fibonacci 系列是计算机科学中的一个经典概念,通常用于教学和练习算法。Visual C++ 是微软公司开发的...
这个压缩包文件"**Fst_sliding_window-master**"很可能包含了执行此类分析所需的全部代码和资源。 Fst滑动窗口分析的基本流程包括以下几个步骤: 1. **数据准备**:首先,你需要一个遗传变异数据集,通常是SNP(单...
FST650变频器说明书,包括安装,配线,接线端子图,操作说明,详细功能讲解,故障检查与排除,保养和维护,通信协议,以及功能参数简表等技术资料。
提供的源代码可以作为学习AES加密算法的宝贵资源,也可以直接应用于实际项目中,提供加密和解密的功能。为了确保代码安全,开发者应遵循良好的编程实践,如输入验证、错误处理和安全的内存管理,同时要注意避免常见...