PHP、MySQLで動作する検索プログラム

このQ&Aのポイント
  • プログラミング初級者のため、PHPとMySQLを使用して検索プログラムを作成しています。しかし、商品データが増えると処理が重くなり、タイムアウトが発生してしまいます。高速な処理を行うためのフリーの検索プログラムや参考書を探しています。
  • 検索サイトを作成している初心者ですが、商品データが増えると処理が重くなり、タイムアウトが発生してしまいます。PHPとMySQLを使用しており、SQLのLIKE文でワードを検索していますが、処理能力に限界があるようです。高速な検索プログラムや参考書を教えていただきたいです。
  • 初心者が作成している検索サイトの処理が重くなり、タイムアウトが発生してしまいます。現在はPHPとMySQLを使用しており、SQLのLIKE文でワードを検索していますが、商品データが増えるにつれて処理能力の限界に達しています。高速な検索プログラムや参考書があれば教えてください。
回答を見る
  • ベストアンサー

PHP、MySQLで動作する検索プログラム

プログラミング初級者です。 Windows環境で、PHP、データベースMySQLにて、検索サイトを練習で作っていますが、フリーで何か良い検索エンジンのプログラムはありますか? 書籍の検索サイトをつくっていまして、商品データは4万、商品のタイトルは長くても30文字、説明文は長いもので1000文字くらいのデータで、検索クエリに対して、単純にSQL文、LIKEでタイトルか説明文にワードが含まれているもの(ヒットしたもの)を画面に表示できるようにはなりました。 一応動くことが確認できたので、商品数を15万にふやしたところ、いきなり動作が重くなり、タイムアウトで画面が表示されなくなってしまいました。 SQL分のLIKEで呼び出すには処理能力に限界があり、ちゃんとした検索プログラムを組み込まないと高速に処理できないのかな?と思っています。 (そもそも、組み込んで使えるようなプログラムがあるのかもわかりませんが。。) 最終的には300万商品くらいは検索できるサイトにしたいと思ってまして、何か良いフリーの検索プログラムや、参考になりそうな書籍があれば是非ご紹介お願いいたします。 初級者なので、適切な質問になっていないかもしれませんが、お分かりのかた、アドバイスくださいませ。

  • PHP
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • WDY
  • ベストアンサー率27% (121/433)
回答No.2

検索を早くする方法はいくつかありますが環境がわからない為 1.Indexを張る。 2.検索結果を別ファイルで持つ。 3.テーブル構成を変える。 4.DBサーバのスペックを変える 5.作り方にもよりますがプログラム側で取得したデータのJoin等を行う。 等々があります。 時間があるようでしたら 夢幻 http://www.yumemaboroshi.net/ で似たようなサイトをダウンロードしてどういう作り方をしているか見てみてはどうでしょう?

buttero
質問者

お礼

ご回答ありがとうございます。 インデックスという考え方を知りませんでした。まずはそのあたりを勉強することで前進しそうです。またそもそもテーブル構成もパフォーマンスをまったく意識していなかったので、改善の余地がありそうです。勉強すべきポイントが見えてきました。ありがとうございました。

その他の回答 (1)

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

>単純にSQL文、LIKEでタイトルか説明文にワードが含まれているもの インデックスは設定していますか? LIKEは前方一致もしくは後方一致である程度のスピードが期待できます。 前方・後方一致では必ずしも有効な処理が期待できませんのでご注意ください >説明文は長いもので1000文字くらいのデータ とありますが、この長さになるとヒットさせるのであれば 全文検索で処理する必要がありそうです。 ただ英語と違って単語の一つ一つが独立していない日本語での全文検索は それなりに下処理が必要なので、いろいろ学習していただく必要があります。 場合によっては単なる説明分ではなくキーワードを任意に羅列した方が よいかもしれません

buttero
質問者

お礼

ご回答ありがとうございます。 インデックスは設定しておらず、またそういう設定ができること自体お恥ずかしながら知りませんでした。まずはここからじっくり勉強してみます。 キーワードの羅列、のところですが、長い文章を簡単な処理で単語単位に区切ってくれるような便利なものって何かあるでしょうか?トークナイザーというのを勉強すると良いのかな?と思ってますが、違いますでしょうか?もし何かご存じでしたらご教授いただけると嬉しいです。

関連するQ&A

  • PHP・MYSQL キーワード検索について

    HPにキーワード検索を導入しようと思っているのですがどうもうまくいきません。 現在は下記のように記述しています POSTパラメータを取得 $word = $_POST['word']; //SQL文 $sql = 'SELECT * FROM `table` WHERE `word` LIKE \'%$word%\' LIMIT 0, 30 ';    ↑ ここに直接ワードを入力したら正常に検索できました。 ポストで受け取ったデータを何かに変換しないと検索できないのでしょうか? 宜しくお願いします。

    • ベストアンサー
    • PHP
  • MySQLでWHERE条件が効かない

    環境: PHP 5.0.3 MySQL 4.0.14b(Win)(←古いこと承知) IIS 5.1 『いますぐ導入!PHP+MySQLで作る最速Webシステム』という入門本のサンプル プログラムを使って勉強していますが、SQLのWHERE文が効かず全レコードが 出てきてしまいます(同書は PHP 4.3.1 を前提に書かれます) 単純に、書籍のISBN、タイトル、価格などが収められたサンプルデータベースで、 こういう↓ search_form.htm から sample.php にPOSTしてます。 書籍タイトル<INPUT size="44" type="text" name="title" maxlength="100"> を含む sample.php は、上記などに入力された検索文字列でWHERE条件で絞込みます。 一部抜粋しますと: | //SQL文を組み立てます(フォームの値をWhereに指定) | $sql = "select * from bookinfo | where (isbn like '$isbn%') and | (title like '%$title%')"; | //priceは指定されているときだけSQL文に追加 | if (strlen($price) > 0) { | $sql .= " and (price <= $price)"; | } | $sql .= " order by isbn"; | | //SQL文の確認用(デバッグ時のみ使用します) | print $sql; どの検索条件を入力しても全レコードが出力してしまうので、上記抜粋の 最後の行のコメントを有効にしたところ、こういうSQL文を吐き出しており、 入力した文字列が有効になっていません。 select * from bookinfo where (isbn like '%') and (title like '%%') order by isbn 対応方法につき、ちょっと見当がつかないのですが、何かお心当たりが ありましたらご教示いただけますと幸いです。よろしくお願い致します。

    • ベストアンサー
    • PHP
  • phpで複数の検索語を検索対象にしたい

    環境:php+mysql やりたいこと: 半角や全角スペースの入った複数の検索語を検索対象にしたいです。 例:りんご みかん で検索されたキーワード 現在のコードは以下のとおりです。。 長くなるので、検索結果数だけの処理までを書いてます。 $sql の箇所で for文など使って繰り返し処理をさせればよいのかと思い google先生で検索しましたが、、どうにも該当しそうなサイトが見つからず アドバイスいただきたく質問させていただきました。 単語1つの場合だけ検索結果が正しく動きますが、 現在は、検索フォームに「りんご みかん」と入れると 検索結果ゼロになります。 これはこれで正しいのですが、、 希望は「りんご みかん」と入れると りんごとみかんを含む検索をしてほしい と考えてます。 <?php $keywords = $_GET["key"]; //検索キーワードのデータが何件あるか? $sql="select * from item where title like '%".$keywords."%' or Description like '%".$keywords."%' or category like '%".$keywords."%' "; $datas = mysql_query($sql , $db ); $num = mysql_num_rows($datas); echo "検索結果は "."<span style=\"font-size:30px;\">".$num."</span>"."件です。<br>"; } ?>

    • ベストアンサー
    • 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
  • PHPからのLIKE検索ができません。

    こんばんわ。お世話になります。 PHPからSQLを発行してLIKE検索をしようとしているのですがうまくいきません。(Xampp MySQL) $keyword = htmlspecialchars($_POST['keyword']); mysql_real_escape_string($keyword); $sql = "select * from master where name like '%{$keyword}%'"; テーブル内の name にマッチするはずの言葉があるのにマッチしません。 ちなみに echo $sql; とSQL文を表示させてPhpMyAdminでそれを実行すると、目的の検索結果が表示されます。 いろいろ検索してみたところ、LikeをLike Binary にする方法などがありましたが、どうにもうまくいきませんでした。文字コードはフォーム側、PHP・SQLともにUTF-8です。 '%{$keyword}%'あたりの書き方が悪いのでしょうか。 お手数おかけいたしますがアドバイスの程お願いいたします。

    • ベストアンサー
    • MySQL
  • MySQLにおける検索結果

    Windows2000のIISでMySQLをインストールしました。 インストール自体はうまくいき、 また、ODBCを入れてAccessから接続もできるようにしました。 ところが、このAccessから検索をしたところ、 検索結果がおかしいのです。 【環境】 Windows2000 IIS MySQL Ver.3.23.38 Access2000 【検索SQL】 Select * from table where name like 'て% 【結果】 name ----- ゆきたに ゆら 上記のように「name」の上1文字が「て」で 始まるデータとしたはずなのに、「ゆ」で始まるデータが 出てきてしまいました。 同じく上1文字が「と」で始まるデータで検索をしても、 同じ結果が出ています。 念のため、likeではなく、Left(name,2) = 'て'又は'と'で 検索もしましたが、同じ結果でした。 何が悪いのでしょうか? よろしくお願いします。

  • jspでMysql検索で困っています。

    jspでMysql検索で困っています、 コマンド画面で下記の入力をすると条件の検索が出来ます。 select * from kanagawa where fish like '%コイ%'; (8件中検索されるのは1件でそれが表示されます) jspで命令すると、違う結果が返されてきます。 String sql; sql="select * from kanagawa where fish like '%コイ%'"; ResultSet rs=db.executeQuery(sql); 最初は変数でテーブル名等受け取っていたのですがうまくいかなかったので直接検索文を入れたのですが結果は同じく違う物が検索されてしまいます。(fishのフィールド8件中5件が結果としてでます。) 何を調べても間違いなさそうですが・・ どうにもならず困っています、助けてください、お願いします。

  • PHPでMySQLを使った検索のプログラム

    「たったコレだけでPHPプログラミングが理解できる本」を参考にPHPでプログラムを書いていまして、 ビジネスホテルの検索機能をチェックボックス機能を余分につけて検索できないか試したのですが、 チェックボックスにチェックを入れると全く検索できず他のテキストボックスに入力するだけなら検索できます。 なんとかチェックボックスを有効にできないかいろいろなサイトを調べたり本を読んだりしましたが解決策が見つかりません。 いろいろな機能に対応できるようなプログラムを組みたいと思ったのでかなりの初心者で大変恐縮ですが、どなたかご教授お願いできないかと思っております。 あと参考になるサイトがございましたら、教えていただきたいと思っております。 何卒よろしくお願い致します。 前半省略 <form name="search_form" action="" method="post" > <input type="hidden" name="cmd" value="search" /> <table> <tr> <th>物件種別</th> <td> <input type="checkbox" name="kodawari_key[]" value="温泉" <?php if( $_REQUEST["kodawari_key"] == "温泉" ){ print( 'checked' ); } ?>/> 温泉 <input type="checkbox" name="kodawari_key[]" value="ランチ" <?php if( $_REQUEST["kodawari_key"] == "ランチ" ){ print( 'checked' ); } ?>/> ランチ<br /> <input type="checkbox" name="kodawari_key[]" value="ディナー" <?php if( $_REQUEST["kodawari_key"] == "ディナー" ){ print( 'checked' ); } ?>/> ディナー</td> </tr> <tr> <th>価格帯</th> <td> <input type="text" name="price_min" value="<?php print( htmlspecialchars( $_REQUEST["price_min"] ,ENT_QUOTES ) ) ?>" size="8"> ~ <input type="text" name="price_max" value="<?php print( htmlspecialchars( $_REQUEST["price_max"] ,ENT_QUOTES ) ) ?>" size="8"><br /> </td> </tr> <tr> <th>住所</th> <td><input type="text" name="address" value="<?php print( htmlspecialchars( $_REQUEST["address"] ,ENT_QUOTES ) ) ?>" size="20"></td> </tr> </table> <input type="submit" value="検索" class="Btn-gray button"> </form> <p>&nbsp;</p> <?php if( $_REQUEST["cmd"] == "search" ){ $pdo = new PDO("mysql:host=localhost; dbname=hotel_reservation; charset=utf8", "koredake", "koredake123", array( PDO::ATTR_EMULATE_PREPARES => false ) ); $sql = "select * from hotels where 1 = 1 "; $condition = array(); if( !empty( $_POST["kodawari_key"] )){ $sql = $sql . " and kodawari_key = :kodawari_key"; $condition["kodawari_key"] = $_REQUEST["kodawari_key"]; } if( !empty( $_REQUEST["price_min"] ) ){ $sql = $sql . " and price >= :price_min "; $condition[":price_min"] = $_REQUEST["price_min"]; } if( !empty( $_REQUEST["price_max"] ) ){ $sql = $sql . " and price <= :price_max "; $condition[":price_max"] = $_REQUEST["price_max"]; } if( !empty( $_REQUEST["address"] ) ){ $sql = $sql . " and ( pref like :pref or city like :city or address like :address ) "; $condition[":pref"] = "%{$_REQUEST["address"]}%"; $condition[":city"] = "%{$_REQUEST["address"]}%"; $condition[":address"] = "%{$_REQUEST["address"]}%"; } $statement = $pdo->prepare( $sql ); $statement->execute( $condition ); $results = $statement->fetchAll(); ?> <table border="1"> <caption>検索結果</caption> <tr> <th></th> <th>ホテル名</th> <th>宿泊料金</th> <th>住所</th> </tr> <?php foreach( $results as $result ){ ?> <tr> <td><img src="hotel/<?php print( htmlspecialchars( $result["id"], ENT_QUOTES )); ?>.png" /></td> <td><?php print( htmlspecialchars( $result["hotel_name"], ENT_QUOTES )); ?></td> <td>\<?php print( htmlspecialchars( number_format( $result["price"] ),ENT_QUOTES ) ); ?></td> <td> <?php print( htmlspecialchars( $result["pref"], ENT_QUOTES ) ); ?> <?php print( htmlspecialchars( $result["city"], ENT_QUOTES ) ); ?> <?php print( htmlspecialchars( $result["address"], ENT_QUOTES ) ); ?> </td> </tr> <?php } } ?> </table> </div> </body> </html>

    • ベストアンサー
    • MySQL
  • phpでmysqlを検索、計算

    PHPでmysql内のデータを、条件で絞込み、 一致するものの平均と個数を画面で表示したいのですが、 エラーが表示され、検索結果を表示することができません 現在書いているコードは以下になります ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー <html> <head> <title>検索結果</title> </head> <body> <?php ~~省略~~ $Name = $_POST['namae']; $Day = $_POST['hiduke']; $conn = mysql_connect($url,$user,$pass); $sdb = mysql_select_db($db,$conn); $sql1 = select avg(score) from seiseki where name = "$Name" and day like "$Day*"; $sql2 = select count(score) from seiseki where name = "$Name" and day like "$Day*"; $sql3 = select count(score) from seiseki where name = "$Name" and day like "$Day*" and score = 1; $res1 = mysql_query($sql1); $res2 = mysql_query($sql2); $res3 = mysql_query($sql3);  print "<table border=1 cellpadding=0 cellspacing=0>\n";  print "<tr>\n";  print "<td>合計</td>";  print "<td align=right>{$sql2}回</td>;"  print "</tr>\n";    print "<tr>"; print "<td>1</td>";  print "<td align=right>{$sql3}回</td>;"  print "</tr>\n";    print "<tr>\n";  print "<td>平均</td>";  print "<td align=right>{$sql1}</td>";  print "</tr>\n";  print "</table>\n"; mysql_free_result($res,&res2,&res3); mysql_close($conn); ?> </body> </html> ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー seisekiテーブルにはnameとdayとscoreがあり、 nameはyamadatarouのようにローマ字で dayは20110110のように数字で scoreには1~4の数字が入っています nameは完全一致、dayは前方一致で sql1では数字の平均、sql2では合計回数、sql3では1の回数をカウントしています 30行目「$sql1 = select avg(score) ~ ~ ~」のあたりに記述エラーがあると表示されるので、 おそらく検索方法の文法が間違っているのですが、 色々調べてみても記述の仕方がこの方法以外見つかりません 何か記述方法の間違いや別の記述方法がありましたら、ご教授お願いいたします また、現在エラーは表示されていませんが、 print近辺も見ようみ真似での記述ですので、間違いなどがありましたら ご教授いただけないでしょうか

    • ベストアンサー
    • PHP
  • PHP+MySQLでの検索処理について2

    前回質問させて頂いた件ですが詳細情報を追記致します。 PHP+MySQLで部分一致検索の処理を作成しているのですが ある文字は正常に検索できてある文字は正常に検索できていないといった文字によって動きが異なります。 原因が不明なのでどなたか教えてください。 宜しくお願いします。 【現象】 下記の(1)(2)のDB項目を"作成"の部分一致で検索しても(1)しか検索されない。(両方とも漢字) (1)XXX作成 (2)○○○作成 【環境】 PHPのバージョン・・・4.4.2 MySQLのバージョン・・・4.0 【検索SQLの一部】 "テーブル名 LIKE '%".mb_convert_encoding(検索文字列,"UTF8","SJIS")."%'"; 【php.info情報】 mbstring.http_input:auto mbstring.http_output:SJIS mbstring.internal_encoding:SJIS mbstring.language:Japanese mbstring.encoding_translation:On Multibyte Support:enabled Multibyte Support :enabled

    • ベストアンサー
    • PHP

専門家に質問してみよう