• ベストアンサー

PHP+MYSQLでワード検索

PHP+MYSQLでワード検索を作りたいです。 検索は二つのテーブルの中のいくつかのフィールドに対して行います。 例えばキーで結ばれたテーブルA、Bがあったとして、 テーブルAのフィールド1、フィールド2、フィールド3、 テーブルBのフィールド3、フィールド4、フィールド5のいずれかに [佐藤]という文字列が含まれているデータを取り出す という事をしたいのです。 select * from テーブルA A, テーブルB B where A.フィールド1 = '%佐藤%' or A.フィールド1 like '%佐藤%' or A.フィールド2 like '%佐藤%' or ... という書き方だと、検索対象フィールドやレコードが多いと速度が遅くなりそうな気がします。 フルテキストインデックスを使用して検索を作成しようと思ったら、日本語は対応していないという事でした。 何か良い方法はありませんか? アドバイスをお願いします。 また、上のテーブルA、Bのレコードデータが貼り付けられたHTMLファイルがあります(1レコードで1ファイル)。 HTMLファイルを変数に読み込み、文字列が含まれているかをチェックする方法を思いついたのですが、これは重くなりますか? 検索対象レコードは現在150程度ですが、将来的には数千~数万になると予想されます。

質問者が選んだベストアンサー

  • ベストアンサー
  • taskuni
  • ベストアンサー率71% (49/69)
回答No.3

いくつかのフィールドに渡って検索をかけたい場合、 自分の場合は、検索用のフィールドを1つ用意して、 レコードの追加・更新時に、検索対象フィールドの文字列を半角スペース等の区切り文字で連結して、検索用フィールドに書き込むようにしています。 検索は検索用フィールドに対して行うだけなので、SQLもすっきりすると思います。 テーブル名:フィールド名:データ テーブルA:フィールド1:あいうえお テーブルA:フィールド2:かきくけこ テーブルA:フィールド3:さしすせそ テーブルB:フィールド1:佐藤 テーブルB:フィールド2:本田 テーブルB:フィールド3:渡辺 と、データがある場合。 このデータの追加・更新時に、 テーブルAまたは、テーブルAと関連付けたテーブルにある検索用フィールドに テーブルA:検索用フィールド:あいうえお かきくけこ さしすせそ 佐藤 本田 渡辺 こういう風に、保存して。 SQLは、 select * from テーブルA where 検索用フィールド = '%佐藤%' みたいになると思います。 予期しない文字でヒットしないように、上の場合だと「藤本」等でヒットしないように区切り文字を入れています。 後で一件一件連結しながら検索するよりは早くなるのではないかと思っているのですが、まだちゃんと試してません。

kamay
質問者

お礼

ありがとうございます。 試してみますね。

その他の回答 (2)

回答No.2

yambejp さんは、index の使用を薦めていますが、like があると、indexはまず、効きません。 like の検索は、基本的には全件をスキャンします。 劇的に効くかどうかやってみないとわかりませんが、 CONCAT(A.フィールド1,A.フィールド2,A.フィールド3...) like '%佐藤%' というのは、どうでしょうか? 重いlikeの処理は軽減されます。

kamay
質問者

お礼

ありがとうございます。 試してみますね。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

indexさえ作っておけば、likeでつないだやり方で じゅうぶん速度は得られると思います。 すくなくともmysqlの実力から考えて数万程度なら 遅くなるというイメージさえないと思います。 百万とかこえてくれば重くなるかもしれませんが。 ただ、複数のフィールドに同じ名前がでてくるような テーブル構成というと、テーブルの作り方を 工夫するだけでもっと効率化できそうですが・・・。

kamay
質問者

お礼

ありがとうございます。 参考にさせていただきます。

関連するQ&A