値を比較するより効率的な方法を探しています。
これが私がやっていることです。ログを解析し、値をデータベースに保存します。各値は約 500 文字です。基本的にはエラーをログに保存するので、次の電子メールを読んだときに、エラーが以前のものと同じかどうかを確認します。もしそうなら、私はそれらを一緒にグループ化します。
そのため、固有のエラーに遭遇するたびに、エラー テーブルに格納されます。新しい電子メールを読むたびに、エラーの 500 文字を抽出し、それを比較して同一か近いか (通常は 95%) を確認し、同じエラーの場合はemail_id
とerror id
というリンク テーブルに格納しますerror_link
。メールテーブルにも詳細を保存しますが、それはあまり関係ありません。
5通のメールがあるとしましょう
メール 1 はerror1
メール 2 ですerror2
メール 3 はerror1
メール 4 ですerror3
メール 5 はerror2
最初のループではerror 1
、エラー テーブルに追加されます。
メール 1: 私が設定したエラー テーブルではerror_id=1
、error_text="error1"
. 私が設定したerror_link
テーブルではemail_id=1
、error_id=1
。
メール 2: 私が設定したエラー テーブルではerror_id=2
、error_text="error2"
. 私が設定したerror_link
テーブルではemail_id=2
、error_id=2
。
メール 3: エラー テーブルでは、 との一致が見つかったので何もしませんerror_id=1
。私が設定したerror_link
テーブルではemail_id=3
、error_id=1
。
メール 4: 私が設定したエラー テーブルではerror_id=3
、error_text="error3"
. 私が設定したerror_link
テーブルではemail_id=4
、error_id=3
。
メール 5: エラー テーブルでは、 との一致が見つかったので何もしませんerror_id=2
。私が設定したerror_link
テーブルではemail_id=5
、error_id=2
。
私が使用するコードは、現在の 500 文字の電子メールからスニペットを取得し、エラー テーブルをループして次のスクリプトを実行します。
similar_text($snippet_new_pre, $snippet_text, $similar_percent);
if ($similar_percent > 95)
{
echo "We have a match";
}
ここでの問題は、特にクエリが大きくなり、時々PHP Fatal error: Maximum execution time of 20 seconds exceeded
.
に設定してみ0
ましたが、役に立ちましたが、時々動かなくなります。スクリプト全体に含まれる時間がそれを超えているためにこれが発生しているのか、それとも 1 つのクエリに対する以下の実際のコードなのかはわかりません。
similar_text($snippet_new_pre, $snippet_text, $similar_percent);
その行を参照していますが、メールが少ないときにクエリをより頻繁に実行するだけで修正されるのでしょうか、それとも実際のクエリ自体を改善してよりスマートにする必要があるのでしょうか?
アイデアを比較する文字のサイズを小さくする以外に、より良いクエリを作成する必要がある場合は、最初の 100 文字でのみクエリを実行し、60% を超える場合は 500 文字のクエリ全体を実行して、多くのことを行うことを考えていました。一致に近くないものの計算は少なくなりますが、これが役立つかどうかはわかりません.