2011-01-29 4 views
5

У меня есть большой набор запросов и используйте levenshtein для расчета опечаток, теперь levenshtein заставляет mysql принимать полное время процессора. Мой запрос - это полнотекстовый поиск + levenshtein в инструкции UNION. sql1 - это мой текущий запрос, sql2 - это только полнотекстовый поиск, который быстр и не использует слишком много времени процессора, а последний - самый лучший из них.levenshtein alternative

У любого из вас есть альтернативный способ получения опечаток? Пожалуйста, не отвечайте на нормализацию данных, я думал об этом, но не применим к моим данным, так как я не могу предварительно выполнить матчи/вычисления и создать отдельную таблицу с индексами.

  $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"; 

ответ

4

Если вы связаны только с MySQL, нет простого решения.

Обычно это решается с помощью специализированного индексации ngram для быстрой фильтрации поиска кандидатов, а затем вычисляет levensthein только как 10-50 кандидатов, что быстрее вычисляет levensthein для всех пар.

специализированные полнотекстовые поисковые системы, такие как Solr/Lucene имеют это встраивается.

PostgreSQL имеет pg_trgm вно модуль (http://www.postgresql.org/docs/9.0/static/pgtrgm.html), который работает как Шарм.

Вы можете даже имитировать это в MySQL, используя полнотекстовую индексацию, но вам нужно собирать слова из всех ваших документов, конвертировать их в ngrams, создавать на них полнотекстовые индексы и взламывать их все вместе для быстрого поиска. Который приносит всевозможные проблемы с избыточностью, синхронизацией ... не стоит вашего времени.