模糊q大家肯定都用过,
类似的还有前缀q, 通配符q, 范围q,正则q等等,
尽管它们各不相同,但都属于自动机,所以它们是相通的。
理解一个,对理解其它的,会有帮助。
“模糊查询”,看起来很简单,
好像就是两个串比一下,是不是相差一个(或两个字符)的事情,
规则是这样子的,但要生成这个规则,是个复杂的过程。
类似的还有前缀q, 通配符q, 范围q,正则q等等,
尽管它们各不相同,但都属于自动机,所以它们是相通的。
理解一个,对理解其它的,会有帮助。
“模糊查询”,看起来很简单,
好像就是两个串比一下,是不是相差一个(或两个字符)的事情,
规则是这样子的,但要生成这个规则,是个复杂的过程。
5 个回复
Charele - Cisco4321
赞同来自:
首先得理解自动机(简称am)查询相关的东西
大佬博客里有说
https://www.amazingkoala.com.c ... .html
博客里拿了一个难度适中,易于理解的范围q做为示例
它会生成这么一个自动机
这个图很直观,就是用来判断哪些词可以符合范围q,
(困难的是明白这个图生成的过程)
图中元素:一个是节点,一个是转换(也可以叫边,有方向的),
跟FST有点类似。
各个自动机查询,实际就是生成的不同的这种自动机图,从而实现不同的功能
Charele - Cisco4321
赞同来自:
如果你认真看过博客,应该了解了自动机的意思,
(自动机查询的细节不是现在关心的)
下面说,关于模糊q时的参数,他会影响自动机的生成
参数意思官网都有说
1 fuzziness,
就是那个莱距离,0无意义,2太复杂,只取1
2 prefix_length,简单起见,只为0
3 transpositions,简单起见,只为false(缺省是true)
Charele - Cisco4321
赞同来自:
比如我们执行是fuzzyQuery("b"),
(这个图中,所有节点都是绿色,就是停在这个节点上是okay的)
是不是这样子呢,可以判断一下:
1 如果空串""(这是匹配的,因为""加上b就是"b")
它停在在0节点上, ok
2 如果是"b", 他匹配查询, 它ok在1上
3 "x", 成功在3上
4 “bx"(删除一个字符就是"b"了),ok在2上
5 "bxx"呢,当走到节点2时,因为2上没路了,最后的"x"没法找,所以fail
6 "xa", 走到3,因为3上面只有"b"的路,没有"a"的路,所以fail
7 "xb", okay在2上
8 “xbb", 停在2上,没路了,"xbb"不匹配我们这个模糊q
Charele - Cisco4321
赞同来自:
比如我们的查询是fuzzyQuery("es"),
它生成的这是样子的,
在只有两个字符(查询参数都是最简化)时,它有8个节点
比range查询要复杂!
红色节点,表示停在这个节点上是不okay的(绿色的可以)
大家可以目测一下,看看是不是正确。
Charele - Cisco4321
赞同来自:
开始说如何生成自动机的
这个截图来自代码,
表示参数:莱氏距离是1,transposition=false时用到的配置,
(一共有4个,这个是最简单的)
这是神奇(或者说困难)开始的地方。
这些注释,先看下它表达的是什么意义。明白了才能往下,,,