- ベストアンサー
複合語検索で・・・
自分用の蔵書検索システムを作ってるのですが、 キーワード検索でつまづいてしまいました。 単一のキーワードでの検索は実装できたので、 こんどはスペース区切りによる複合語検索に挑戦しました。 (検索タイプは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でつなげたりしてみたのですが、 どうもうまくいきませんでした。 また、もっとスマートなやりかたがあったら ぜひ教えてください。 どうかよろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
LIKE、REGEXPは、テーブルのINDEXを使えないことがほとんどですので、全行検索になります。 したがって、テーブルサイズがn倍になれば、実行時間もn倍と考えていいでしょう。 RDBMSでは、これしか手はないですね。 蔵書登録時に、単語を切り出し(RDBMSとは別です)、この単語と蔵書の関連をテーブルとして登録する手はあります。単語にはINDEXを付けます。 単語への分解は、リンクを参考にしてください。 結構、骨が折れるかも・・・
その他の回答 (2)
- masa6272
- ベストアンサー率66% (93/140)
こんなんで、どうでしょう? select * from bookstock where concat(author,' ',title) regexp '太郎|物語'; パターンの部分は、PHPで動的に作ってください。 LIKEにしろ、REGEXPにしろ遅いですが、ご自分の蔵書検索なら、 問題ないでしょう。
- oops1967
- ベストアンサー率62% (5/8)
はじめまして、madman666さま SELECT文をUNIONで結合してみてはいかがでしょうか? テーブルレイアウトが解らないので、サンプルですが SELECT id,name FROM mst_user where mailaddress LIKE '%fat%' UNION SELECT id,name FROM mst_group where name LIKE '%グル%' このような感じになるかと思います。
お礼
UNIONで結合できるのですね。 ありがとうございます!
お礼
回答ありがとうございます。 いまは自分用のものを作っていますが、 これは練習用で、いずれは本格的なものを作りたいと思っています。 それで、 通常はこのような検索では LIKEは使わないのでしょうか? 全文検索というのも調べてみたのですが、 日本語ではいろいろと障害があるようで・・・ どうか詳しく教えていただけないでしょうか? よろしくお願いします。