谈到ES中的倒排索引,就不得不说到有限状态机:FST(Finate State Transducers)。当事务一分为二的时候,看到一个整体,那么就更能帮助我们理解这个概念。
既然说到有限状态机,那么什么是无限状态机?无限状态机,从字面意思我们大概就能明白,有无限个状态,无法穷举所有状态的计算的机器。比如,无限循环的小数,除不尽的数,无法列举所有状态。这就好比永动机,计算需要无尽的内存,还要保证可持续的电力供应。如果要解决此类问题,可以使用符合图灵完备性的机器实现。
有限状态机:顾名思义,就是可以穷举实体所有状态,通过机器去实现。然后通过各种优化,减少内存占用。减少内存占用最常用的方式是通过算法实现压缩,然后再通过反解析来获取原有数据。减少磁盘,网络之间的IO。现有网盘极力推荐使用客户端,应该跟这个也有一定的关系。其内部肯定也有一定的优化压缩算法,这个大家具体去了解一下。
好了,到了这里,今天要关注的有限状态机FST的思想可以开始探讨了。
首先有一组数据,tea term test tester that this ,我们输入的数据在一段时间内是一个有限状态的集合,那么如果这个集合足够大,我们如何通过算法优化,来更好的优化内存存储,减少磁盘,网络IO实现呢?
我们来看一个FST直观感受的界面,把上述单词依次输入进去,看下他的变化,大家应该就明白这里面的奥义了。
输入tea:可以看到从黑线开始,单词首先被拆分成各个字符,前一个指向后一个,最后a显示是一个终结状态,也就是单词的结束,也能区分出来,这条线比前面的粗。
输入term:这个里面可以看到,te这两个字符被复用了,两个单词形成了一个有向无环图。
而a状态的确定,根据r的出现,而最终确定,我们默认,数据是排好序的。
输入test|tester: 可以清楚看到,test中间有个输出状态,tester有个最终的状态,也就是test被完全复用了,实际上test这个t会有输出一个数字,来确定这个状态属于一个完整的单词输出。
同理:我们输入that,this会从e下面多出一个分支,th在两个单词之间会复用,我们做下验证。
可以看到确实跟我们推测的一样。大家有兴趣,可以自己去尝试一下。此外ES的也有RBM,和FOR压缩算法,大家私下可以了解一下。
因为场景的转变,技术是不断迭代的,而先进思想是永远不会落伍的,获取到更多的思想智慧,才能把创新的步子迈出去。