2017-01-21 3 views
0

私のMySQLデータベースに私はユーザテーブルを持っています。ユーザー名フィールドにタイプミスしたまま検索を実行する必要があります。このトピックについては、非常に古い質問はほとんどありません。私は組み込みのmysqlの全文検索をテストしましたが、期待通りに動作しませんでした(それは誤植を処理しません)[私は知っていましたが、とにかく試しました]。 私の最善の選択肢は何ですか?私は今日、簡単な解決策があるべきだと考えました。私はelasticsearch上のユーザーテーブルを複製することを考えていて、そこから即座に検索しますが、これが引き起こす同期化の悪夢を避けたいと思っています。Typoを使ったMySQL検索

ありがとうございます!

+0

ユーザー名が単一の単語の場合は、[SOUNDEX](http://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_soundex)を試すことができます。私たちは同じ問題を抱えて弾力的な検索に移りました。それはDBからの負荷が大きいので同期の努力をする価値があります(私の場合は30%) – pratikvasa

+0

ありがとうございますが、私はsoundexが十分だとは思いません。同期にどのように近づいたか簡単に説明できますか?長期間に渡って2つのDBが整列していることをどのように確認できますか? –

+1

少し面倒です。 DB上で、ESインデックスに存在するテーブルにトリガを作成しました。このトリガーは、IDを変更してIDをテーブルに格納する行のすべてのIDを追加します。私たちはそのテーブルから読み込み、idをrabbitmqの待ち行列に送るcronジョブを作成しました。キューを使用して、障害に強いようにしました。 ESでインデックスを更新する消費者を書いた。私たちのテーブルは通常非常に低い更新レート(5アップデート/秒)を持っています。更新/挿入が大きい場合、これは難しくなります – pratikvasa

答えて

1

mysqlにSOUNDEXを使用できます。私たちはそれを試みましたが、それはうまく機能せず、検索も少し遅くなると言うことができます。

同様の問題があり、ESに切り替えました。次のように私たちが何をしたか

は次のとおりです。

  • はESに同期されますテーブルのトリガを作成しました。 トリガーは、新しいテーブルに書き込みます。そのようなテーブルの列は 次のようになります。

    IdToUpdate操作のDateTime IsSynced

    を操作は、作成、更新、削除されるだろう。 IsSyncedは、更新がESにプッシュされるかどうかを に通知します。

  • 次に、issyncedを '0'と設定したすべての行に対してこのテーブルを照会するコーンジョブを追加し、それらのIDと操作をRabbitMQのようなキューに追加します。これらのIDのISSyncedを1に設定する

    RabbitMQを使用する理由は、更新がESに転送されることを確認するためです。障害が発生した場合、いつでもオブジェクトを再キューすることができます。

  • キューからオブジェクトを取得してESを更新するコンシューマを作成します。

これ以外にも、初回使用時にデータベースからESインデックスを作成するユーティリティを作成する必要があります。

そして、あなたはまた、処理するESのFuzzy Searchで見ることができ、タイプミスのもあいまい検索をサポートしています

Completion suggester