7

私は大量のクエリを持っており、levenshtein を使用してタイプミスを計算しています。現在、levenshtein により mysql がフル CPU 時間を消費しています。私のクエリは、UNION ステートメントの全文検索 + レーベンシュタインです。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";
4

1 に答える 1

5

MySQLだけに縛られている場合、簡単な解決策はありません。

通常、これは、高速候補ルックアップフィルタリング用の特殊なngramインデックスを使用して解決され、10〜50の候補でのみlevenstheinを計算します。これは、すべてのペアのlevenstheinを計算するよりも高速です。

Solr/Luceneのような特殊な全文検索エンジンにはこれが組み込まれています。

PostgreSQLには、チャームのように機能するpg_trgm contribモジュール(http://www.postgresql.org/docs/9.0/static/pgtrgm.html)があります。

フルテキストインデックスを使用してMySQLでこれをシミュレートすることもできますが、すべてのドキュメントから単語を収集してngramに変換し、フルテキストインデックスを作成し、それらをすべて一緒にハックして高速検索を行う必要があります。これは冗長性、同期に関するあらゆる種類の問題をもたらします...あなたの時間の価値はありません。

于 2011-02-05T23:56:10.243 に答える