2011-01-29 13 views
5

Ho una grande serie di query e uso levenshtein per calcolare gli errori di battitura, ora levenshtein fa sì che mysql abbia tempo di cpu completo. La mia query è una ricerca a testo completo + levenshtein in una dichiarazione UNION. sql1 è la mia query corrente, sql2 è solo la ricerca fulltext che è veloce e non usa troppa CPU, l'ultima la leventhein che farà il picco!alternativa di levenshtein

Qualcuno di voi ha un modo alternativo per ottenere gli errori di battitura? Si prega di non rispondere alla normalizzazione dei dati, ci ho pensato, ma non è applicabile ai miei dati, in quanto non posso pre-fare le partite/calcoli e creare una tabella separata con gli indici.

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

risposta

4

Se si sono legati solo a MySQL non c'è una soluzione facile.

Solitamente questo viene risolto utilizzando l'indicizzazione di ngram specializzata per il filtro di ricerca rapido candidato e quindi il calcolo di levensthein solo su 10-50 candidati, che è più veloce del calcolo di levensthein per tutte le coppie.

specializzati motori di ricerca full-text come Solr/Lucene hanno costruito in questo.

PostgreSQL ha pg_trgm contrib modulo (http://www.postgresql.org/docs/9.0/static/pgtrgm.html) che funziona come un fascino.

Puoi anche simularlo in MySQL utilizzando l'indicizzazione di testo completo, ma devi raccogliere parole da tutti i tuoi documenti convertirli in ngrams, creare indici di testo completo su di essi e hackerarli tutti insieme per una rapida ricerca. Che porta tutti i tipi di problemi con la ridondanza, la sincronizzazione ... non vale il tuo tempo.