在之前研究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提示我有敏感词没法发表,所以仅仅保存了一部分,经过几个小时的努力仍然没有找到哪个词是敏感词最终放弃了,所以第二篇博客写的不全。浪费我好几个小时!

fst 共享后缀_FST源代码解读1——FST是什么相关推荐

  1. fst 共享后缀_FST源代码解读2——FST的生成

    本篇博客介绍FST的生成.它使用的是生成器模式,因为FST的生成太复杂了,所以必须使用生成器模式,他的类是:org.apache.lucene.util.fst.Builder.Builder(INP ...

  2. fst 共享后缀_关于Lucene的词典FST深入剖析

    核心是在于如何快速的依据 查询词 快速的查找到所有的相关文档,这也是 倒排索引(Inverted Index) 的核心思想.那么如何设计一个快速的(常量,或者1)定位词典的数据结构就显得尤其重要.简单 ...

  3. fst 共享后缀_谈谈lucene中的FST

    FST是lucene中用来存储字典,并进行检索的核心数据结构,我记得在lucene3.0版本前都用的是跳跃链表(不清楚的同学以后我会专门写一篇磁盘索引技术来说清楚,网上也有相关资料),实际上采用该数据 ...

  4. java计算机毕业设计校园共享单车系统源代码+系统+数据库+lw文档

    java计算机毕业设计校园共享单车系统源代码+系统+数据库+lw文档 java计算机毕业设计校园共享单车系统源代码+系统+数据库+lw文档 本源码技术栈: 项目架构:B/S架构 开发语言:Java语言 ...

  5. jqfactor_analyzer源代码解读02

    jqfactor_analyzer单因子分析02 首先jqfactor_analyzer源代码解读01中已经得到了self._clean_factor_data(注意binning_by_group参 ...

  6. ML:LGBMClassifier、XGBClassifier和CatBoostClassifier的feature_importances_计算方法源代码解读之详细攻略

    ML:LGBMClassifier.XGBClassifier和CatBoostClassifier的feature_importances_计算方法源代码解读之详细攻略 目录 LGBMClassif ...

  7. 《加强5G公众移动通信系统无线电频率共享管理》最新解读来啦

    <加强5G公众移动通信系统无线电频率共享管理>最新解读来啦! 人工智能技术与咨询 近日,工业和信息化部印发了<关于加强5G公众移动通信系统无线电频率共享管理有关事项的通知>(下 ...

  8. 基于ssm高校共享单车管理系统 (源代码+数据库) 604

    部分代码地址 https://gitee.com/ynwynwy/webike-public 基于ssm高校共享单车管理系统 (源代码+数据库) 一.系统介绍 用户管理,服务点管理,单车管理,分类管理 ...

  9. linux内核奇遇记之md源代码解读之八阵列同步二

    linux内核奇遇记之md源代码解读之八阵列同步二 转载请注明出处:http://blog.csdn.net/liumangxiong 在上一小节里讲到启动同步线程: 7824 mddev->s ...

最新文章

  1. 倒梁法matlab,在编制措施项目清单时,关于钢筋混凝土模版及支架费项目,应在清单中列明(    )...
  2. C#温故而知新学习系列之.NET框架高级特性—概述.NET框架中的反射(一)
  3. JavaScript求当月天数
  4. 找到一个全能的免费空间!支持SQL和.net2.0
  5. 智能合约WASM语言 (1)概述
  6. springmvc教程--整合mybatis开发(spring+springMVC+mybatis整合开发)
  7. Java新手入门的30个基本概念
  8. POJ1063 Flip and Shift
  9. k近邻算法_K近邻(knn)算法是如何完成分类的?
  10. 最近发包给朋友,搞定软件小活儿、解决小功能模块的感受
  11. XMind--思维导图
  12. 烽火通信FSU数据采集设备通过中国铁塔测试
  13. Python编写端口扫描器
  14. java如何使截取字符串_java中如何截取字符串中的指定一部分
  15. python爬虫爬取公众号_Python selenium爬取微信公众号文章代码详解
  16. Hadoop LZO压缩配置
  17. 1335 工作计划的最低难度(动态规划)
  18. C语言REPEAT程序,汇编语言定使用WHILE、REPEAT、FOR 和 FORC伪指令定义重复语句块
  19. JavaScript(Dom对象的操作)
  20. java.lang.NoClassDefFoundError: org/codehaus/plexus/compiler/manager/NoSuchCompilerException

热门文章

  1. LeetCode动态规划股票系列整理
  2. EXCEL中输入斜杠变日期问题
  3. 当桌游遇上VRnbsp;杀人终于能见血了!
  4. gitlab使用说明 与Tortoise Git一起使用
  5. 服务器7379如何用u盘装系统,小编教你怎么用U盘安装win7系统
  6. java当前时间的时间戳_java获取时间戳和当前时间
  7. linux最常用的下载命令
  8. 【C语言总结篇】新起点
  9. vue3+ts使用app.config.globalProperties全局挂载实例方法,扩展模块解决ts类型检查报错
  10. ubuntu设置定时重启