電子メール フィルタを作成していますが、1 つの電子メールを多数のフィルタ/ルールに効率的に一致させる方法が必要です。電子メールは、次のフィールドのいずれかで照合できます。
- 名前から
- 差出人アドレス
- 送信者名
- 差出人住所
- 主題
- メッセージ本文
現在、5000 を超えるフィルターがあり (さらに増え続けています)、これらはすべて PostgreSQL (9.1) データベースの単一のテーブルで定義されています。各フィルターには、Python 正規表現が入力された上記のフィールドが 1 つ以上含まれている場合があります。
フィルタリングが現在行われている方法は、すべてのフィルターを選択してメモリにロードすることです。次に、空白以外のすべてのフィールドで正の一致が見つかるまで、電子メールごとにそれらを繰り返します。残念ながら、これは、1 つの電子メールに対して 30,000 (5000 x 6) もの再照合操作が行われる可能性があることを意味します。明らかに、これはフィルターが追加されるにつれてスケーリングされません (実際には既にスケーリングされていません)。
これを行うより良い方法はありますか?
これまでに検討したオプション:
保存された Python 正規表現を POSIX スタイルのものに変換して、PostgreSQL の SIMILAR TO 式を利用します。これで本当に速くなるのだろうか?単に負荷を別の場所に移動しているように思えます。
ユーザーごとにフィルターを定義します。これは実際には実用的ではありませんが、私たちのシステムではユーザーが事前定義された豊富なフィルターから実際に利益を得ているからです。
フィルタリングする最初の電子メールが正規表現として保存されるエラスティック検索のようなドキュメントベースの検索エンジンに切り替えます。同様のメールを見つけることで、特定の機能セットに絞り込んでテストし、肯定的な一致を得ることができます.
ベイズ フィルターに切り替えると、同様のメールや既存のメールへの変更を検出する機械学習機能も得られますが、それらは同じものであると推測するのに十分な確率で一致します。これはクールに聞こえますが、特にうまくスケーリングできるかどうかもわかりません。
他に考慮すべきオプションやアプローチはありますか?