• ベストアンサー

複合語検索で・・・

自分用の蔵書検索システムを作ってるのですが、 キーワード検索でつまづいてしまいました。 単一のキーワードでの検索は実装できたので、 こんどはスペース区切りによる複合語検索に挑戦しました。 (検索タイプは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でつなげたりしてみたのですが、 どうもうまくいきませんでした。 また、もっとスマートなやりかたがあったら ぜひ教えてください。 どうかよろしくお願いします。

  • MySQL
  • 回答数3
  • ありがとう数2

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

  • ベストアンサー
  • 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で結合できるのですね。 ありがとうございます!

関連するQ&A

  • PHPでの複合列への検索

    始めまして、現在 PHPとMySQLで検索機能でDBのリストから該当する検索ワードを表示する物を作成しています。 1つの列での検索は、問題なく検索できるのですが、別の列を検索する為には、どの様に変更または追加すれば宜しいのでしょうか? 私自身でプログラムの追加を試したのですが、一つの列しか検索されません。 PHPは、始めたばかりで余り解っていません。 現時点でのプログラムです。 <?php //Read file require_once("connectDB.php"); //Pick up data $searchSelect = $_POST['searchSelect']; $keyword = $_POST['keyword']; $keyword = ereg_replace("[ @]+", " ", $keyword); $keyword = trim($keyword); //Search words if(empty($keyword)){ print "<html>"; print "<head><title>Blank</title></head>"; print "<body>"; print "Please input search word"; print "<p><a href=\"select3.php\" target=\"_self\">To all</a><p>"; print "</body>"; print "</html>"; exit; } //Make programing $array = explode(" ", $keyword); $cnt = count($array); $where1 = "WHERE "; $where2 = "WHERE "; <-今回追加した内容です。 for($i=0; $i < $cnt; $i++){ $where1 .= "PREF_ITEM LIKE '%".$array[$i]."%'"; $where2 .= "PREF_VALUE LIKE '%".$array[$i]."%'"; <-今回追加した内容です。 if($i < $cnt-1){ $where1 .=" ".$searchSelect." "; $where2 .=" ".$searchSelect." "; <-今回追加した内容です。 } } // send query $sql1 = "SELECT * FROM KA_SP ".$where1; $sql2 = "SELECT * FROM KA_SP ".$where2; <-今回追加した内容です。 $sql1 .= " ORDER BY PREF_CD"; $sql2 .= " ORDER BY PREF_CD"; <-今回追加した内容です。 $result = executeQuery($sql1, $sql2); <-今回変更した内容です。 //Set line $rows = mysql_num_rows($result); //Show data if($rows){ while($row = mysql_fetch_array($result)) { $tempHtml .= "<tr>"; $tempHtml .= "<td>".$row["PREF_CD"]."</td><td>".$row["PREF_AD1"]."</td><td>".$row["PREF_AD2"]."</td><td>".$row["PREF_ITEM"]."</td><td>".$row["PREF_VALUE"]."</td><td>".$row["PREF_SET"]."</td>"; $tempHtml .= "</tr>\n"; } $msg = $rows."Hit parameter list"; }else{ $msg = "No hit parameter"; } // Release memory mysql_free_result($result); ?> このプログラムからDBのKA_SPのテーブルの列:PREF_ITEMまたはPREF_VALUEから該当文字する検索文字の結果を表示したと思っています。 現時点では、PREF_ITEMの列のみで該当文字が検索されて結果が表示されます。 宜しくお願い致します。

    • 締切済み
    • PHP
  • MySQL+PHPでキーワード検索をもとに五十音検索を作りたいです

    キーワード検索のソースを元に五十音検索を作りたいです。 キーワード検索のソースを元に五十音検索を作りたいのですが、”あ”という文字を押したら”あ”の頭文字の一覧が出るようにするにはどうしたらいいでしょうか。 キーワード検索ではすでにキーワードを入れたら検索結果の一覧が出るようになっています。 以下が必要そうなコードの抜粋です。 <?php //抽出条件を組み立てる $array = explode(" ", $keyword); $cnt = count($array); $where = "WHERE "; for($i=0; $i < $cnt; $i++){ $where.= "koji OR kana LIKE '%".$array[$i]."%'"; if($i < $cnt-1){ $where .=" ".$searchSelect." "; } } // クエリを送信する $sql = "SELECT * FROM sampletable ".$where; $result = executeQuery($sql); //結果セットの行数を取得する $rows = mysql_num_rows($result); //表示するデータを作成 if($rows){ while($row = mysql_fetch_array($result)) { $tempHtml .= "<tr>"; $tempHtml .= "<td>".$row[no]."</td><td><A href='result2.php?koji=$row[koji]' target='_blank'>".$row[koji]."</A></td><td>".$row[kana]."</td>"; $tempHtml .= "</tr>\n"; } $msg = $rows."件のデータがあります。"; }else{ $msg = "データがありません。"; } ?> <h3>キーワード検索</h3> 故事成語用検索フォーム(複合語検索ができます) <form name="form2" action="search2.php" method="post"> <input type="text" name="keyword" size="25"> <input type="submit" name="search2" value="検索"><br /> </form>

    • 締切済み
    • PHP
  • phpとmysqlで「あいまい検索」をしたいです。

    phpとmysqlで「あいまい検索」をしようと思い、下記サイトを参考にしましたが、 http://d.hatena.ne.jp/akihito_sado/20120602/p1 PDOを使ってlikeデータを抜き出したい場合、bindParamを使うらしいですが、 http://rasukaru55.sitemix.jp/or_kensaku.php 下記の場合どう書き直すべきでしょうか? 打ち方が悪いのか、うまく作動しません。 教えてください。 ※bindParamを使えばSQLインジェクション対策になっていると言う事でしょうか? <html> <head></head> <body> <?php //POST送信されたデータを$text1へ $text1 =@$_POST["text1"]; //SQL(テーブルから列を抽出する $sql ="SELECT 列名 FROM 表名 "; //キーワードが入力されているときはwhere以下を組み立てる if (strlen($text1)>0){ //受け取ったキーワードの全角スペースを半角スペースに変換する $text2 = str_replace(" ", " ", $text1); //キーワードを空白で分割する $array = explode(" ",$text2); //分割された個々のキーワードをSQLの条件where句に反映する $where = "WHERE "; for($i = 0; $i <count($array);$i++){ $where .= "(列名 LIKE '%$array[$i]%')"; if ($i <count($array) -1){ $where .= " AND "; } } //別カラムも同じ検索したい $where2 = " OR "; for($i = 0; $i <count($array);$i++){ $where2 .= "(2列名 LIKE '%$array[$i]%')"; if ($i <count($array) -1){ $where2 .= " AND "; } } } ?> <form method="POST" action="<?php echo $_SERVER["PHP_SELF"]?>"> <table> <tr> <td><input type="text" name="text1"></td> <td><input type="submit" value="検索" name="sub1"></td> </tr> </table> </form> <?php //組み立てたSQL分を表示する echo "<p>組み立てたSQL分: ".$sql.@$where.@$where2; ?> </body> </html>

    • ベストアンサー
    • PHP
  • 自作の検索エンジンを作成しました。AND検索 or 検索の方法をご教授いただきたい。

    こんにちは。 複数のキーワードの検索が出来ません。 ゲーム 無料 等のキーワードで検索した場合のwhere句とのコラボ組み合わせが出来ません。 $keyword=$_POST[1]; $rs=$DB->$query("SELECT * FROM data WHERE"; if($keyword){ $str = array(" ", " and ", " AND "); $keyword = str_replace($str, " ", $keyword); if(stristr($keyword, " ")){//複数キーワードの検索 $ex = explode(" ", $keyword); $count = count($exkey); for($i=0; $i<$count; $i++){ if($i!="0"){ $sql = $sql." and"; } $sql = $sql." keyword LIKE '%{$ex[$i]}%'"); } }else{//単体キーワードの検索 $sql = " keyword LIKE '%{$keyword}%'"); } } $query = $query.$sql; $result = mysql_query($query); ...結果表示 これ今のソースですけど for のあたりに何か必要ない文字とか入っていますか。 色々しているうちに無駄に複雑にしてしまっているのではと言う感じもします。

    • ベストアンサー
    • PHP
  • PHPの参考書で分からないとこがあります

    PHPによるWebアプリケーションスーパーサンプル第2版のP.99のサンプルファイルにどうしても分からない箇所があります。 <html> <head> <title>絞込み検索キーワードをSQLに反映する</title> </head> <body> <?php // データを受け取る $text1 = @$_POST["text1"]; // SQL(ProductsテーブルからProductNameを抽出する) $sql = "SELECT ProductName FROM Products "; // キーワードが入力されているときはWHERE以下を組み立てる if (strlen($text1) > 0) { // 全角スペースを半角スペースに変換する $text2 = str_replace(" ", " ", $text1); // キーワードを空白で分割する $array = explode(" ", $text2); // 分割された個々のキーワードをSQLに反映する $where = "WHERE "; for ($i = 0; $i < count($array); $i++) { $where .= "(ProductName LIKE '%$array[$i]%')"; if ($i < count($array) - 1) { $where .= " AND "; } } } // 受け取った値を表示する echo "<p>検索キーワード:".$text1; // 組み立てたSQLを表示する echo "<p>組み立てたSQL:".$sql.@$where; ?> <form method="POST" action="<?php echo $_SERVER["PHP_SELF"]?>"> <table> <tr> <td><input type="text" name="text1" value="<?php echo $text1?>"></td> <td><input type="submit" value="送信" name="sub1"></td> </tr> </table> </form> </body> </html> 上記の for ($i = 0; $i < count($array); $i++) { $where .= "(ProductName LIKE '%$array[$i]%')"; if ($i < count($array) - 1) { $where .= " AND "; } } の箇所なんですが、そこに複数ある「.(ドット)」は何を表しているのでしょうか? また、 if ($i < count($array) - 1) { $where .= " AND "; が行っている処理を教えて下さい。 初歩的な質問かもしれませんが、よろしくお願いします。

    • ベストアンサー
    • PHP
  • 【PHP】複数語検索について

    お世話になります。 PHPにて複数語検索を行いたいのですが、うまく検索できずに困っています。 テーブル名はinformation、 レコード名はnameとして、スペース区切りで検索します。 $st = $db->prepare("SELECT * FROM information"); $where = array(); if($arr['name']){ $name_ary = explode(" ", $name); $name_count = count($name_ary); $where = ""; for( $i = 0; $i < $name_count; $i++ ){ if( $i != 0 ){ $where = ($where . " or"); } $where = $where . " name LIKE '%{$name_ary[$i]}%'"; } } $query= sprintf("SELECT * FROM information WHERE $where"); $st = $db->prepare($query); どなたかご教授いただけないでしょうか? 他の質問など見て真似たり、下記サイトを参考にしたりしているのですが、 うまくいかず困っております。 http://blog.olivesystem.com/824.html 何卒宜しくお願い致します。

    • 締切済み
    • PHP
  • テーブルをまたいだ検索

    このような検索をしたいのですが・・・ 書籍のデータベースを作っていて、 本の著者は共著の場合など、複数の場合があるので、 著者テーブルを別に作りました。 books id, title, publisher 1, AAA, A出版 2, BBB, B出版 3, CCC, C出版 authors(著者)テーブル id, author 1, 田中 2, 佐藤 3, 鈴木 3, 後藤 そして、検索フォームで著者名から検索したいのですが、 どのようにするのが普通なのでしょうか。 「author」テーブルからフォームで入力した「著者名」を検索して、 その後、そのIDをもつ書籍を「books」から引っ張ってくるというイメージなのですが・・・ たとえば著者名に「佐藤」と検索すると「CCC」という本が見つかるようにしたいのです。 また、書籍タイトル、著者名、出版社名を組み合わせて検索できるようにしたいのです。 これはクエリの組み立て方で解決できるのでしょうか? Mysqlのビューという機能を使って解決することはできるのでしょうか? 長くてわかりにくい文章になってしまいましたが、 どうかよろしくお願いします。

    • ベストアンサー
    • MySQL
  • スペース区切りの検索について

    現在PHP+CSVで簡易検索を作りましたが この度それをMYSQLで実現させようかと考えていますが 以前のような単純なCSV検索と同様の事が MYSQLのwhere句の部分で表現できなく困っています。 ■data.csv 鈴木一郎,野球選手,東京都新宿区 鈴木次郎,サッカー選手,東京都新宿区 検索方法(andで絞込み) キーワードを何も入れなければ全件出力。 たとえば検索キーとして 「鈴木」 「野球」と入れれば1行目が表示されるイメージです。 ■PHP+CSV $ArrKeyword=explode(" ",$KeyWord); $Data=file("data.csv"); for ($i = 0; $i < sizeof($Data); $i++) { for ($n = 0, $flag = 1; $n < sizeof($ArrKeyword); $n++) { if (!mb_eregi($ArrKeyword[$n], $Data[$i])){ $flag = 0; break; } } if ($flag) { $kensaku_kekka[] = $Data[$i]; } } ■MYSQL $ArrKeyword=explode(" ",$KeyWord); $where = " WHERE concat(name,com,jyusho) Like '%$ArrKeyword[0]%' "; if($ArrKeyword[1]){ for($i = 1; $i < sizeof($ArrKeyword); $i++) { $where .= "AND (concat(name,com,jyusho) like '%$ArrKeyword[i]%' )"; } } $sql = "SELECT * FROM `keigyou_tbl` $where"; //select文を実行 if(!$res=mysql_query("$sql")){ echo "sql失敗"; exit; } ■MYSQL版の場合2個目のキーワードが機能していません。

    • ベストアンサー
    • MySQL
  • Dreamweaverで検索フォーム

    はじめまして。 DreamWeaverを使ってPHP+MySQLでWEBアプリを作っております。 ログ表示部分まで完成して、検索用のhtmlフォームから条件を指定して検索結果のみをSELECTして表示させたいのですが、「and検索やor検索」ができなくて困っています。 他に似たような質問をされている方もいますが、書いたソースが異なっているように見受けたので、投稿させていただきました。 宜しくお願いします。 検索フォーム <form method="post" action="view.php"> <input type="text" name="key"> <input type="submit" name="search" value="検索"> </form> ログ表示PHP(view.php) //検索キーワードの初期値を設定する $colname_Recordset1 = "%"; if (isset($_POST['key'])) { $colname_Recordset1 = (get_magic_quotes_gpc()) ? $_POST['key'] : addslashes($_POST['key']); } $sql = "SELECT * FROM shoplist"; if(strlen($colname_Recordset1) > 0){  $colname_Recordset2 = str_replace(" ", " ", colname_Recordset1);  $array = explode(" ", $colname_Recordset2);  $where = "where ";  for($i=0; $i<count($array); $i++){   $where .= "address like '%$array[$i]%'";   if($i < count($array)-1){    $where .= " and ";   }  } } mysql_select_db($database_connTest, $connTest); $Recordset1 = mysql_query($sql.$where, $connTest) or die(mysql_error()); $row_Recordset1 = mysql_fetch_assoc($Recordset1); $totalRows_Recordset1 = mysql_num_rows($Recordset1);

    • ベストアンサー
    • PHP
  • phpで複数検索語をテーブル上の複数項目を対象

    php とmysqlの環境で作ってます。 以前、教えていただいた http://blog.olivesystem.com/824.html のサイトを参考に検索キーワードをテーブル上の複数の項目にまたがって検索したい と考え以下のように書いてみましたが、、エラーとなってしまうので、、、 アドバイスいただければと考えております。 ・実現したいこと 検索窓に 半角や全角で間を空けた入力キーワードをand検索とし テーブル上の複数の項目を参照して検索結果を得たい 例: 「バナナ りんご 千」で検索された場合 テーブルの内容 name setumei sanchi バナナ 長い 東京 りんご 丸い 青森 スイカ 丸い 千葉 このテーブルの3つの項目を参照して検索し、実現したいことが正しく動けば。。 検索結果数 3件 となる。 理由:nameに2件 sanchiに1件 該当キーワードが存在するため ・phpの内容 *getでキーワードを取得している状態以下を書いてます。 $keywd がGETで取得したキーワードが代入されます。 試しに2つ項目で動かないか?!書いてみた状態です。 $query = "SELECT * FROM item WHERE"; if($keywd){ $str = array(" "," ", " and ", " AND "); $keywd = str_replace($str, " ", $keywd); if(stristr($keywd, " ")){//複数キーワードでの検索 $ex = explode(" ", $keywd); $count = count($ex); for($i=0; $i<$count; $i++){ if($i!="0"){ $keyand = $keyand." and"; $keyor = $keyor." or"; } $keyand = $keyand." name LIKE '%{$ex[$i]}%'"; $keyor = $keyor." sanchi LIKE '%{$ex[$i]}%'"; $sql = $keyand.$keyor; echo $sql;//内容確認 } }else{//単体キーワードでの検索 $sql = " name LIKE '%{$keywd}%'"; } } $query1 = $query.$sql; $result = mysql_query($query1, $db ); $num = mysql_num_rows($result); echo "検索結果は "."<span style=\"font-size:30px;\">".$num."</span>"."件です。<br>"; ←ここがline111となります。 ・表示されたエラー Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home/users/xxxx/result.php on line 111 ・echoで確認した内容 「ソーラ o」で検索した状態 name LIKE '%ソーラ%' Description LIKE '%ソーラ%' name LIKE '%ソーラ%' and name LIKE '%o%' Description LIKE '%ソーラ%' or Description LIKE '%o%' よろしくお願いします。

    • ベストアンサー
    • PHP