我有一大堆查询并使用levenshtein来计算拼写错误,现在levenshtein导致mysql占用完整的cpu时间。 我的查询是UNION语句中的全文搜索+ levenshtein。 sql1是我当前的查询,sql2只是全文搜索,这是快速的,并没有使用太多的CPU时间,最后一个leventhein将会达到峰值!
你们中的任何一个人都有另一种方式来获取拼写错误吗? 请不要回答规范化数据,我已经想到了,但不适用于我的数据,因为我不能预先进行匹配/计算并创建一个带索引的单独表。
$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";
答案 0 :(得分:4)
如果你只与MySQL绑在一起,那就没有一个简单的解决方案。
通常使用专门的ngram索引进行快速候选查找过滤,然后仅在10-50个候选者上计算levensthein,这比计算所有对的levensthein更快。
像Solr / Lucene这样的专业全文搜索引擎内置了这个。
PostgreSQL有pg_trgm contrib模块(http://www.postgresql.org/docs/9.0/static/pgtrgm.html),它就像一个魅力。
你甚至可以使用全文索引在MySQL中模拟这个,但是你必须从所有文档中收集单词,将它们转换为ngrams,在它们上创建全文索引,然后将它们全部破解以便快速查找。这会给冗余带来各种麻烦,同步...不值得你花时间。