• ベストアンサー

複合語検索で・・・

自分用の蔵書検索システムを作ってるのですが、 キーワード検索でつまづいてしまいました。 単一のキーワードでの検索は実装できたので、 こんどはスペース区切りによる複合語検索に挑戦しました。 (検索タイプはAND検索のみです) $array = explode(" ", $_GET['keyword']); $cnt = count($array); $where = " WHERE "; for($i=0; $i < $cnt; $i++){ $where.= "title LIKE '%".$array[$i]."%'"; if($i < $cnt-1){ $where .=" AND "; } } 以上のようにして、なんとかできました。 これを著者テーブルにも対応させたいのです。 たとえば、検索キーワードに 「太郎 物語」 と入力したとすると、 書籍テーブルか著者テーブルのいずれかに、 「太郎」および「物語」が含まれるものを表示したいのです。 つまり、 「太郎物語」というタイトルの書籍や、 「~物語」というタイトルで著者が「~太郎」という書籍などを表示するようにしたいです。 ORでつなげたりしてみたのですが、 どうもうまくいきませんでした。 また、もっとスマートなやりかたがあったら ぜひ教えてください。 どうかよろしくお願いします。

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

  • ベストアンサー
  • masa6272
  • ベストアンサー率66% (93/140)
回答No.3

LIKE、REGEXPは、テーブルのINDEXを使えないことがほとんどですので、全行検索になります。 したがって、テーブルサイズがn倍になれば、実行時間もn倍と考えていいでしょう。 RDBMSでは、これしか手はないですね。 蔵書登録時に、単語を切り出し(RDBMSとは別です)、この単語と蔵書の関連をテーブルとして登録する手はあります。単語にはINDEXを付けます。 単語への分解は、リンクを参考にしてください。 結構、骨が折れるかも・・・

参考URL:
http://chasen-legacy.sourceforge.jp/

その他の回答 (2)

  • masa6272
  • ベストアンサー率66% (93/140)
回答No.2

こんなんで、どうでしょう? select * from bookstock where concat(author,' ',title) regexp '太郎|物語'; パターンの部分は、PHPで動的に作ってください。 LIKEにしろ、REGEXPにしろ遅いですが、ご自分の蔵書検索なら、 問題ないでしょう。

madman666
質問者

お礼

回答ありがとうございます。 いまは自分用のものを作っていますが、 これは練習用で、いずれは本格的なものを作りたいと思っています。 それで、 通常はこのような検索では LIKEは使わないのでしょうか? 全文検索というのも調べてみたのですが、 日本語ではいろいろと障害があるようで・・・ どうか詳しく教えていただけないでしょうか? よろしくお願いします。

  • oops1967
  • ベストアンサー率62% (5/8)
回答No.1

はじめまして、madman666さま SELECT文をUNIONで結合してみてはいかがでしょうか? テーブルレイアウトが解らないので、サンプルですが SELECT id,name FROM mst_user where mailaddress LIKE '%fat%' UNION SELECT id,name FROM mst_group where name LIKE '%グル%' このような感じになるかと思います。

madman666
質問者

お礼

UNIONで結合できるのですね。 ありがとうございます!