ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

MySQLコミュの文字列検索について

  • mixiチェック
  • このエントリーをはてなブックマークに追加
今phpで掲示板を作って禁止ワード処理をしているのですが
例えばDBに『携帯』と登録してたとして
検索対象文字列が『携帯電話』だった場合
DBからデータを引っ張ってきてphp側でループさせて検証しているのですが、
これをDB側で出来ないかなと思い質問させて頂きました。

理由はDB側でやった方が軽くなると思ったからです。

感じ的には
select * from テーブル名 where '携帯電話',(ここで更にselect カラム名 from t_name like '登録してるワード')
のような感じで出来ないかなと思ってるのですがどうぞアドバイス宜しくお願いします。

コメント(10)

禁止ワードをDBに事前に登録しておき、新たに書き込まれようとしている発言(phpの変数)に、DBに登録してある禁止ワードが含まれているかどうかを検査したい ということかと。


おそらく、あまり効果が無いと思いますよ。DBが早いのは、適時索引などを利用できるからこそ です。分厚い本から、目次を使用して特定の項目を参照することによる速さと考えると良いかと思います。
# 単語が「含まれるかどうか」を判断するには、目次ではなくページ内容すべてを参照する必要がありますから、わざわざ、DBにデータを引き渡すだけ損 ということになると思います。

禁止ワードをチェックする前に、発言内容をDBに仮登録するのであれば、DB側でチェックできますが・・・仮登録された内容を削除する扱いが面倒になるだけで無駄ですよね?
書き込まれた文章を、あえて、DBに登録された禁止ワードが含まれるか否かをチェックするには、
まず、文章をchasenとかmecabとかの(文章が日本語であるというのが前提ですが)形態素解析エンジン
で文字を抽出して、その抽出された文言をそれぞれ、DBへselectするという方法もありますが。

文章全体を一度DBへ登録して、別の禁止ワードテーブルからキーワードを引っ張ってきてlike文で
あいまい検索すると結構コストがかかると思います。

MySQLやOracleなどのDBを使うとアクセスや検索コストが結構かかるので、自前でindexを作るという手
もありますね。大手の検索サイトなんかはそういうところが多いらしいですね。
想像ですが
単にLIKEの使い方がわからないってだけでは?
簡易版だそうですが。
http://phpspot.org/blog/archives/2005/11/php_17.html
にある
「すべての漢字を取り出す正規表現」をメソッド化し、戻り値の数だけループで以下のSQLを実行し続ける。
select if ((select NG_word from NG_word_tbl where NG_word like "%parameter%") IS NOT NULL, true, false)

で、trueなら禁止ワードに引っかかりましたとさ。
likeは負荷が高いので使っちゃダメ、というプロジェクトもありますが。
皆さん返信が遅くなりすみません。

僕の書き方があまりよくなく質問内容がうまく伝わらなかったようですが、言いたい事はうぇいくさんの返信の通りです。

またうぇいくさん、分かりやすい説明有難う御座います。

元々出来るかもと思う程度だったので今のままでいこうと思います。

もももも ゆうたろうさんからの内容も考えたのですが、今回は例として『携帯電話』という単語を使いそれだったらうまくいくと思うのですが、『ィジメ』とかって入れられた場合は使えないと思いやめました。

でも色々なアドバイスを皆さん有難う御座いました。


ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

MySQL 更新情報

MySQLのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング