使用 man ascii 来查看 ASCII 表。

让人模糊的模糊查询

Elasticsearch | 作者 Charele | 发布于2023年09月10日 | 阅读数:1595

模糊q大家肯定都用过,
类似的还有前缀q, 通配符q, 范围q,正则q等等,
 
尽管它们各不相同,但都属于自动机,所以它们是相通的。
理解一个,对理解其它的,会有帮助。
 
“模糊查询”,看起来很简单,
好像就是两个串比一下,是不是相差一个(或两个字符)的事情,
规则是这样子的,但要生成这个规则,是个复杂的过程。
已邀请:

Charele - Cisco4321

赞同来自:

A 理解模糊查询,
首先得理解自动机(简称am)查询相关的东西
 
大佬博客里有说
https://www.amazingkoala.com.c ... .html
 
博客里拿了一个难度适中,易于理解的范围q做为示例
它会生成这么一个自动机
111.png

这个图很直观,就是用来判断哪些词可以符合范围q,
(困难的是明白这个图生成的过程)
 
 图中元素:一个是节点,一个是转换(也可以叫边,有方向的),
跟FST有点类似。 
各个自动机查询,实际就是生成的不同的这种自动机图,从而实现不同的功能

Charele - Cisco4321

赞同来自:

B
如果你认真看过博客,应该了解了自动机的意思,
(自动机查询的细节不是现在关心的)
 
  下面说,关于模糊q时的参数,他会影响自动机的生成
 
111.png

参数意思官网都有说
 
1 fuzziness,
就是那个莱距离,0无意义,2太复杂,只取1
 2  prefix_length,简单起见,只为0
 
3 transpositions,简单起见,只为false(缺省是true)

Charele - Cisco4321

赞同来自:

C 先有个直观了解,来看看模糊查询生成的自动机是什么样子的,
比如我们执行是fuzzyQuery("b"),
111.png

(这个图中,所有节点都是绿色,就是停在这个节点上是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

赞同来自:

D 再来看一个复杂一点的例子,
 
比如我们的查询是fuzzyQuery("es"),
它生成的这是样子的,
在只有两个字符(查询参数都是最简化)时,它有8个节点
比range查询要复杂!

222.PNG

红色节点,表示停在这个节点上是不okay的(绿色的可以)
 
大家可以目测一下,看看是不是正确。

Charele - Cisco4321

赞同来自:

E
开始说如何生成自动机的
 
这个截图来自代码,
 表示参数:莱氏距离是1,transposition=false时用到的配置,
(一共有4个,这个是最简单的)
 
222.PNG
 
这是神奇(或者说困难)开始的地方。
 
这些注释,先看下它表达的是什么意义。明白了才能往下,,,

要回复问题请先登录注册