【问题标题】:Speedup levenshtein query加速 levenshtein 查询
【发布时间】:2021-06-21 04:10:55
【问题描述】:

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

  1. 后端(MySQL)
    • “DNames”表
      • “全名”字段
      • “ID”字段
  2. 前端(MS 访问)
    • “levenshtein”function
    • “列夫”查询
      • “lev_dist”字段(使用上述函数计算出的 levenshtein 距离,按 asc 排序)
      • “全名”字段
      • “ID”字段
    • “结果”形式的“srch”文本框

我的问题是,当我运行查询(即使用“srch”文本框)而不进行排序时,它的速度足够快,但是当我使用排序时,大约需要 30 到 90 秒才能完成(取决于电脑规格)。我需要排序操作来找到“srch”文本框中的文本和数据库之间的前 10 个(最接近的)匹配,那么我怎样才能加快这个过程呢?有没有办法让它达到最大 5 秒?此过程可以同时从 5 台 PC 上运行。我尝试使用 MySQL levenshtein function ,但花了 2 分钟!!

【问题讨论】:

  • 问题是mysql需要计算所有满足查询的记录的距离,然后对结果集进行相应的排序。它不能使用任何索引,也不能使用任何快捷方式。如果您想使用这样的文本分析,那么我很遗憾地说,传统的 rdbms 可能不是您的最佳工具。将整个数据集读入内存并执行分析,这是适合您内存的数据集的最佳行动方案。市面上有一些特定的文本分析工具,它们也可以为更大的数据集加快计算速度。
  • 你能发布查询和levenshtein函数/查询吗

标签: mysql database ms-access levenshtein-distance


【解决方案1】:

你会接受妥协吗?在大约 1 毫秒内找到“小”距离内的所有单词(如果数据缓存在 buffer_pool 中)?

  1. 构建一个包含大约 5M-10M 行的表格(基于您的 1M '字')。它将有两列 - F(word), word。
  2. 查找 F(word) 以获取可能的单词列表。

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

word --> ord, wrd, wod, wor, word
letter --> etter, ltter, leter, lettr. lette, letter

(注意“字母”出现两次)

表和查询:

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 距离:

  • 任意一个字母,
  • 相邻字母换位(距离=2,但很重要),
  • 在任何位置添加一个字母。

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

  1. 使用我的技术。如果你得到了一些结果,那就退出吧。
  2. 回到缓慢的 Levenshtein 搜索。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-08
    • 2019-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-02
    • 1970-01-01
    相关资源
    最近更新 更多