gpt4 book ai didi

MySQL 混合 Damerau–Levenshtein Fuzzy 与 Like Wildcard

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:44:24 25 4
gpt4 key购买 nike

最近在MySQL中实现了Damerau-Levenshtein算法的UDF,想知道有没有办法把Damerau-Levenshtein算法的模糊匹配和Like函数的通配符搜索结合起来?如果我在表中有以下数据:

ID | Text
---------------------------------------------
1 | let's find this document
2 | let's find this docment
3 | When the book is closed
4 | The dcument is locked

我想运行一个包含 Damerau–Levenshtein 算法的查询...

select text from table where damlev('Document',tablename.text) <= 5;

...在我的查询中使用通配符匹配返回 ID 1、2 和 4。我不确定语法或者这是否可能,或者我是否必须以不同的方式处理这个问题。上面的 select 语句单独使用时效果很好,但不适用于单个单词。我必须将上面的 SQL 更改为...

select text from table where 
damlev('let's find this document',tablename.text) <= 5;

...当然只返回 ID 2。我希望有一种方法可以将模糊和通配符组合在一起,如果我希望返回的所有记录都包含单词“文档”或其变体出现在文本字段。

最佳答案

在处理人名并对其进行模糊查找时,对我有用的是创建第二个单词表。还创建第三个表,它是包含文本的表和单词表之间的多对多关系的相交表。当一行添加到文本表时,您将文本拆分为单词并适本地填充相交表,在需要时将新单词添加到单词表。一旦这个结构就位,您就可以更快地进行查找,因为您只需要在唯一单词表上执行 damlev 函数。一个简单的连接就可以得到包含匹配词的文本。 enter image description here

单个单词匹配的查询看起来像这样:

SELECT T.* FROM Words AS W
JOIN Intersect AS I ON I.WordId = W.WordId
JOIN Text AS T ON T.TextId = I.TextId
WHERE damlev('document',W.Word) <= 5

两个词看起来像这样(从我的脑海中脱颖而出,所以可能不完全正确):

SELECT T.* FROM Text AS T
JOIN (SELECT I.TextId, COUNT(I.WordId) AS MatchCount FROM Word AS W
JOIN Intersect AS I ON I.WordId = W.WordId
WHERE damlev('john',W.Word) <= 2
OR damlev('smith',W.Word) <=2
GROUP BY I.TextId) AS Matches ON Matches.TextId = T.TextId
AND Matches.MatchCount = 2

这里的优点是,以一些数据库空间为代价,您只需将耗时的 damlev 函数应用于唯一词,无论表的大小如何,这些词的数量可能只有几千个文本。这很重要,因为 damlev UDF 不会使用索引 - 它会扫描应用它的整个表来计算每一行的值。只扫描独特的词应该快得多。另一个优点是 damlev 应用于单词级别,这似乎是您所要求的。另一个优点是您可以扩展查询以支持对多个词的搜索,并且可以通过对 TextId 上匹配的相交行进行分组来对结果进行排序,并根据匹配次数进行排序。

关于MySQL 混合 Damerau–Levenshtein Fuzzy 与 Like Wildcard,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14261580/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com