特にクエリ時間に関しては、REGEXP の使用には欠点があることは理解していますが、使用する以外に選択肢はありません。
問題は、使用される検索用語の数によっては、クエリの実行に 5 分以上かかる場合があることです。
私の仕事は、検索用語を取得し、正確な検索用語と、「ing」で終わる複数形、または検索用語の後に句読点が続くなど、単語のいくつかのバリエーションを見つけることですが、単語の断片ではありません。 car" は、"carbine" や "scar" と一致してはなりません。検索ワードは無数に使えますが、6個以上になると耐えられないほど長くなってしまいます。
これが私のクエリのサンプルです:
SELECT `id` FROM `table` WHERE ((
`name` REGEXP "[[:<:]]sesame street[[:>:]]" OR
`name` REGEXP "sesame street[[:punct:]]" OR
`name` REGEXP "[[:<:]]sesame street.?ing[[:>:]]" OR
`name` REGEXP "[[:<:]]sesame street.?s[[:>:]]"
) OR (
`venue` REGEXP "[[:<:]]disney[[:>:]]" OR
`venue` REGEXP "disney[[:punct:]]" OR
`venue` REGEXP "[[:<:]]disney.?ing[[:>:]]" OR
`venue` REGEXP "[[:<:]]disney.?s[[:>:]]"
))
AND `name` NOT LIKE "% tantrum %"
AND `name` NOT LIKE "% stepkids %"
AND `date` >= CURDATE()
ORDER BY `date` ASC;
クエリは単一のテーブルを使用するため、テーブル結合の問題はありません。
1 つのクエリに 30 の異なるキーワードを含めることができ、それらを含めるか除外するかのいずれかであり、これらの検索用語のバリエーションがあるため、各用語は 5 つの異なる条件を作成できます。クエリは REGEXP を使用するため、使用できる唯一のインデックスはフィールドですが、インデックスはandフィールドdate
に設定されます。代わりに Solr のようなものを使用するように検索エンジンを変更することを考えましたが、それでも、検索に必要な特異性を考えるとうまくいかないと思います。name
venue
どんなアドバイスでも大歓迎です。ありがとう