【问题标题】:levenshtein alternativelevenshtein 替代品
【发布时间】:2011-01-29 04:10:25
【问题描述】:

我有大量查询并使用 levenshtein 来计算拼写错误,现在 levenshtein 导致 mysql 占用完整的 cpu 时间。 我的查询是 UNION 语句中的全文搜索 + levenshtein。 sql1 是我当前的查询,sql2 只是全文搜索,速度快,不占用太多 cpu 时间,最后一个将达到峰值!

你们中的任何人还有其他方法来获取拼写错误吗? 请不要回答规范化数据,我已经想到了,但不适用于我的数据,因为我无法预先进行匹配/计算并创建带有索引的单独表。

            $sql1 = "(SELECT * FROM ci_sanctions_properties WHERE prop_type='LASTNAME' AND prop_value!='' AND MATCH(prop_value) AGAINST ('+usama bin laden' IN BOOLEAN MODE)) UNION (SELECT s.* FROM (SELECT levenshtein(prop_value, 'usama bin laden') AS dist, sanction_id, prop_type, prop_value FROM ci_sanctions_properties WHERE prop_type='LASTNAME' AND prop_value!='') s WHERE dist < 3) ORDER BY sanction_id";

        $sql2 = "SELECT * FROM ci_sanctions_properties WHERE prop_type='LASTNAME' AND prop_value!='' AND MATCH(prop_value) AGAINST ('+usama bin laden' IN BOOLEAN MODE) ORDER BY sanction_id";

        $sql3 = "SELECT s.* FROM (SELECT levenshtein(prop_value, 'usama bin laden') AS dist, sanction_id, prop_type, prop_value FROM ci_sanctions_properties WHERE prop_type='LASTNAME' AND prop_value!='') s WHERE dist < 3";

【问题讨论】:

    标签: mysql levenshtein-distance


    【解决方案1】:

    如果您只与 MySQL 相关联,则没有简单的解决方案。

    这通常使用专门的 ngram 索引来解决,用于快速候选查找过滤,然后仅在 10-50 个候选上计算 levensthein,这比为所有对计算 levensthein 更快。

    Solr/Lucene 等专门的全文搜索引擎已内置此功能。

    PostgreSQL 有 pg_trgm contrib 模块 (http://www.postgresql.org/docs/9.0/static/pgtrgm.html),它就像一个魅力。

    您甚至可以在 MySQL 中使用全文索引来模拟这一点,但是您必须从所有文档中收集单词并将它们转换为 ngram,在它们上创建全文索引,然后将它们全部组合在一起以进行快速查找。这会给冗余、同步带来各种麻烦……不值得你花时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-29
      • 2011-06-10
      • 2014-04-18
      • 2012-04-08
      • 2012-07-09
      • 2011-03-31
      • 2023-03-12
      相关资源
      最近更新 更多