逆方向のキーワード検索

更新日
2017.07.23
作成日
2007.03.05

渡した文字列の中に、あるカラムのキーワードを持っているレコードを取り出します。

    例としては禁止ワードなどのテーブルから、最終的にヒットしたレコードのaction項目を取り出したいと思います。
    このままだとちょっと実用できないですが応用で何かに使えるかも?なので一応メモ。

    キーワードテーブル

    idmatchtypekeywordaction
    1 like 禁止1 block
    2 match 禁止2 block
    3 like 保留1 reserve
    4 like 保留2 reserve

    文字列の中に含まれるキーワードをもつレコードを取り出す。

    WHERE
     CASE matchtype WHEN 'like'
      -- matchtypeがlikeなら含まれている場合
     THEN '文字列' LIKE CONCAT('%',keyword,'%')
      -- matchtypeがmatchなら完全一致する場合
     ELSE 'この文字には禁止1ワードが入っている' = keyword
    END

    ID1の「禁止1」のレコードが取り出されます。前方一致とか後方一致を加えても。

    禁止語句のフィルターなど検索ができますが、インデックスが効かないので長い文字列でどのぐらいコストがかかるかは知りません。キーワードレコード数はともかく、文字列が大きくなると遅くなりました。
    キーワードのマッチングなど大抵の場合は、いちいちDBにアクセスするよりもテキストファイルにキャッシュを吐いておいてそこからPHP側で検索するほうが無難ですが、あとで何かに使えるかもしれないのでry