首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >加速levenshtein查询

问加速levenshtein查询
EN

Stack Overflow用户
提问于 2021-03-24 12:38:42
回答 1查看 173关注 0票数 0

我有一个约100万条记录的多用户数据库管理系统,其结构如下:

  1. 后端(MySQL)
    • "DNames“表
      • “全名”字段
      • "ID“字段

  2. 前端(MS Access)
    • "levenshtein“函数
    • "lev“查询
      • "lev_dist“字段(使用上述函数计算出的levenshtein距离,排序为asc)
      • “全名”字段
      • "ID“字段

代码语言:javascript
复制
- "srch" textbox in "result" form

我的问题是,当我在没有排序的情况下运行查询(即使用"srch“文本框)时,速度足够快,但是当我使用排序时,大约需要30到90秒才能完成(取决于pc规范)。我需要排序操作来查找"srch“文本框中的文本与数据库之间的前10位(最近的)匹配,那么如何加快这个过程呢?有没有办法让它达到最大5秒?这个过程可以在5台PC机上同时运行。我试过使用MySQL levenshtein 函数,但花了2分钟!

EN

回答 1

Stack Overflow用户

发布于 2021-03-24 19:54:53

你愿意接受妥协吗?如果数据缓存在buffer_pool中,那么可以在1ms内找到“小”距离内的所有单词?

  1. 建立一个大约500万到1000万行的表格(基于你的100万字)。它会有两列-- F( word ),word。
  2. 查找F(word)以获得可能的单词列表。

F(字)是一组字符串--取“单词”并删除每个字母,加上原来的单词。例如:

代码语言:javascript
复制
word --> ord, wrd, wod, wor, word
letter --> etter, ltter, leter, lettr. lette, letter

(注意'leter‘发生了两次)

表和查询:

代码语言:javascript
复制
CREATE TABLE ricks_leven ()
    fword VARCHAR(22) NOT NULL,  -- F(word)
    word  VARCHAR(22) NOT NULL,  -- the desired word
    PRIMARY KEY(fword, word)
) ENGINE=InnoDB;

SELECT word, COUNT(*) AS ct
    FROM ricks_leven
    WHERE fword IN ('etter', 'ltter', 'leter', 'lettr'. 'lette', 'letter')
    GROUP BY word
    ORDER BY ct DESC
    LIMIT 10;

完美的匹配将自动排在输出的第一位。接下来可能会出现其他一些“可能”的拼写错误。我不知道Levenshtein距离是否以同样的方式命令结果。

这个算法涵盖了这些常见的排版,它们都有一个很小的Levenshtein距离:

  • 任何一封信的下落,
  • 相邻字母转位(distance=2,但很重要),
  • 在任何位置添加的字母。

在速度和完整性之间的折衷:

  1. 用我的技巧。如果你得到了一些结果,那就退出。
  2. 回到缓慢的Levenshtein搜索。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66781225

复制
相关文章

相似问题

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