首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL混合Damerau-Levenshtein模糊和相似通配符

MySQL混合Damerau-Levenshtein模糊和相似通配符
EN

Stack Overflow用户
提问于 2013-01-10 23:40:00
回答 1查看 1.1K关注 0票数 2

我最近在MySQL中实现了Damerau-Levenshtein算法的UDF,我想知道是否有一种方法可以将Damerau-Levenshtein算法的模糊匹配与类似函数的通配符搜索结合起来?如果我在一个表中有以下数据:

代码语言:javascript
复制
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算法的查询...

代码语言:javascript
复制
select text from table where damlev('Document',tablename.text) <= 5;

...with通配符匹配以在我的查询中返回in 1、2和4。我不确定语法,或者这是否可能,或者我是否必须以不同的方式处理它。上面的select语句在issolation中工作得很好,但不适用于单个单词。我必须将上面的SQL更改为...

代码语言:javascript
复制
select text from table where 
 damlev('let's find this document',tablename.text) <= 5;

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-10 23:51:40

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

对单个单词匹配的查询将如下所示:

代码语言:javascript
复制
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 

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

代码语言:javascript
复制
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上对匹配的交叉行进行分组来对结果进行排名,并根据匹配次数进行排名。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14261580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档