• ベストアンサー
  • すぐに回答を!

複合語検索で・・・

  • 質問No.3910959
  • 閲覧数167
  • ありがとう数2
  • 気になる数0
  • 回答数3
  • コメント数0

お礼率 37% (55/147)

自分用の蔵書検索システムを作ってるのですが、
キーワード検索でつまづいてしまいました。

単一のキーワードでの検索は実装できたので、
こんどはスペース区切りによる複合語検索に挑戦しました。
(検索タイプは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でつなげたりしてみたのですが、
どうもうまくいきませんでした。

また、もっとスマートなやりかたがあったら
ぜひ教えてください。

どうかよろしくお願いします。

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

  • 回答No.3
  • ベストアンサー

ベストアンサー率 66% (93/140)

LIKE、REGEXPは、テーブルのINDEXを使えないことがほとんどですので、全行検索になります。
したがって、テーブルサイズがn倍になれば、実行時間もn倍と考えていいでしょう。
RDBMSでは、これしか手はないですね。

蔵書登録時に、単語を切り出し(RDBMSとは別です)、この単語と蔵書の関連をテーブルとして登録する手はあります。単語にはINDEXを付けます。
単語への分解は、リンクを参考にしてください。
結構、骨が折れるかも・・・

その他の回答 (全2件)

  • 回答No.2

ベストアンサー率 66% (93/140)

こんなんで、どうでしょう?

select *
from bookstock
where concat(author,' ',title) regexp '太郎|物語';

パターンの部分は、PHPで動的に作ってください。
LIKEにしろ、REGEXPにしろ遅いですが、ご自分の蔵書検索なら、
問題ないでしょう。
お礼コメント
madman666

お礼率 37% (55/147)

回答ありがとうございます。

いまは自分用のものを作っていますが、
これは練習用で、いずれは本格的なものを作りたいと思っています。

それで、
通常はこのような検索では
LIKEは使わないのでしょうか?

全文検索というのも調べてみたのですが、
日本語ではいろいろと障害があるようで・・・

どうか詳しく教えていただけないでしょうか?

よろしくお願いします。
投稿日時:2008/04/02 16:21
  • 回答No.1

ベストアンサー率 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 '%グル%'

このような感じになるかと思います。
お礼コメント
madman666

お礼率 37% (55/147)

UNIONで結合できるのですね。
ありがとうございます!
投稿日時:2008/04/02 16:18
結果を報告する
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,600万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A

その他の関連するQ&Aをキーワードで探す

ピックアップ

ページ先頭へ