• 締切済み

phpでキーワードのマッチング処理

phpでキーワードのマッチング処理を行おうと思ってます。 データベースよりおよそ20000件のデータを取得して ある文言に対して20000件のデータと照合しヒットしたカウント数まで 取得できればよいと考えてます。 mb_substr_count関数を使ってみたのですが、処理に時間がかかってしまいました。 もう少し早い処理が出来る方法はphpだけでは可能でしょうか?

みんなの回答

回答No.3

preg_grepで絞り込んでから mb_substr_countとか preg_grepで全角文字がちゃんと抜き出せるという保障は 無いですが、少なくとも元データ数よりかは 絞り込めるはずです。

lewlondon
質問者

お礼

ありがとうございます。 カウントはあきらめようかと思ってます。 ※そもそもカウントは必要ないかなと。

全文を見る
すると、全ての回答が全文表示されます。
  • Xaval
  • ベストアンサー率58% (61/105)
回答No.2

言い忘れた。もう一つ。。 キーワードのマッチングって、すべてのキーワードを均等に使うわけじゃないんです。 つまり、偏りがあるので、キャッシングモデルが有効に働くのです。 上位100件のキーワードに対しては、キャッシュ可能な作りにするように、DB上のテーブルを編成するのも考えたほうがいいと思います。

lewlondon
質問者

お礼

参考になる意見ありがとうございます。 参考の上、もう少し検討してみます。

全文を見る
すると、全ての回答が全文表示されます。
  • Xaval
  • ベストアンサー率58% (61/105)
回答No.1

取得して比較ではなく、比較して取得しては?SQL内で。 DBに全文検索があるとかないとかにもよりますが。。

lewlondon
質問者

お礼

ありがとうございます~

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 【php】処理を軽くしたい

    SQLのデータを取得してそれを、 最適化する処理を作成しています。 具体的には データベースからデータを読み込む   ↓ $row = hoge($row);   ↓ 最適化された$row $rowfunction hoge($row){   処理1   処理2   処理3... } みたいな感じなんですが、一部の処理(座標からgooglemapを生成) が重くて他の処理がとばっちりをうけ、全体的に重くなってしまいます。 これを軽くしようとするのならば、どのような方法が考えられるでしょうか。 重い系の処理は切り離すしかないでしょうか。

    • ベストアンサー
    • PHP
  • substr_count() のPerl版

    substr_count() のPerl版はありますか? substr_count() のような関数をPerlで使いたいんです。 基本的に該当文字列の出現回数さえカウントできればいいんです。 誰か教えてください。

    • ベストアンサー
    • Perl
  • MySQLでもPHPでも出来る処理はどっちでやる?

    「MySQL」「PHP」、何れでも出来るような処理はどちらでやる方が良いのでしょうか? ■例1 … 取得データを正規表現で加工して利用したい場合 ・SQL重視 … 正規表現等を駆使したSQLで、後々利用しやすい形で取得 ・PHP重視 … 普通に取得して、PHPで正規表現を利用して加工 ■例2 … データ取得がヤヤコシイ場合 ・SQL重視 … (例えそれがどんなに長くなっても)SQL文をキチンと組み立て、一度にデータ取得 ・PHP重視 … 簡単なSQL文で一旦データ取得後、PHPのループ文内等処理で、再度DBアクセスしデータ取得 ・ちょっと例えが微妙かもしれないのですが、そもそもデータ取得する際、どのように考えるのが正しいのでしょうか? 1.なるべく利用予定に近い形でデータを取得 2.後で色々加工するかもしれないので、取得時点ではあまり加工せず、そのまま取得 ※要は、頻繁にDBへアクセスしてデータ取得するより、「DBへアクセスするのは極力避け、取得したデータはなるべく使い回す」方が良いのでしょうか? ・それとも、ここら辺はケースbyケースなので、一概には言えないのでしょうか? ・あるいは、別にどっちでもいい? あまり、気にしなくても良い?

    • ベストアンサー
    • MySQL
  • <img src=".php?id=id">をカウントしないようにしたい

    PHPでクリックされた回数をカウントしているのですが <?php $id=$_GET["id"]; カウント読み込み処理 カウント加算処理 header("Location: url"); ?> もし不正に<img src="http://hoge/count.php?id=id"> とした場合、クリックした回数ではなく 表示された回数をカウントされてしまいます。 <img src="http://hoge/count.php?id=id"> とした場合はカウントしない方法はありますか? よろしくお願いいたします。

    • 締切済み
    • PHP
  • PHP プルダウンを選んだ瞬間に処理開始

    PHPで、フォームのプルダウンを選んだ時、たとえば、「1月」を選んだ時に処理を開始し、選択されている1月のデータだけをデータベースからとってきて表示したいです。 <input type="submit" ~> の送信ボタンで送信するわけではなく、プルダウンを選んだ瞬間に処理開始したいので、$_POST[]では取得できませんでした。 PHPでプルダウンを選んだ瞬間にプルダウンのデータを送信する方法があれば教えてください。 PHPは現在勉強中の超初心者、javascriptはjQueryなら少々書ける程度です。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • EXCEL2007関数を実行させない方法

    EXCEL2007関数を実行させない方法 セルAにデータが入力されている場合、セルBに組み込まれている関数を実行しない。 というような制御は可能でしょうか。 シートAに入力されたキーワードをシートBのリストと照合して キーワードがシートB内に何件あるかをCOUNTで調べようと思っています。 一度何も考えずに実装してみたのですが、 この場合シートBのデータが膨大なものになると、 このブックを開くたびに照合が実行されて、莫大な時間がかかってしまっているようでした。 ですので、今回このような質問をさせていただきました。 アドバイスなどありましたら よろしくおねがいします!

  • PHPで画像処理

    あるWebサイトにある画像を定期的に取得して,PHPで画像を処理をしてサーバーに保存するプログラムを作ろうとしています. 処理したい画像の形式はGIFです.特にGIFにこだわりはないので違うフォーマットに変換してから処理してもいいとは思っています. 画像処理と言っても,特定のRGB値のピクセルを画像中から探して,その座標を取得するという単純なものなのです. そんなに難しくなさそうなのですがどうやればいいかわからないのでどなたか教えていただけませんか? GDやImageMagickが使えるのかと思って動かしてみましたが,結局使えそうな関数がみつからず頓挫しています. どなたかよろしくお願いします.

    • 締切済み
    • PHP
  • PHP バックグラウンド処理

    apache1.3系+PHPで大量のメール送信プログラムを作成していますが、ある動きで困っております。 特定のフォームにて件名と本文を入力し、submitすることでsystem関数を利用して別のプログラムをバックグラウンドで動かそうとしてますが、メール送信前にコメントを表示したいのです。 しかし、表示をする前に後に記述しているsystem関数が読み込まれるようで、system関数の処理が終わると、そのコメントが表示されるようになってしまってます。 例) // ここでコメントを表示 print<<<HTML <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP"> <title>WEBMAIL</title> </head> 送信を受付ました </body> </html> HTML; // メール送信プログラムをバックグラウンドで system("/usr/local/bin/php webmail2.php $subject $address $data & "); 実際に100件程のアドレスに向けて送信しましたが、送信処理は正常に動作しているようですがバックグラウンドで動いている気配がありません。 また、system関数の処理の前にコメントを表示したいのですが、実際に表示されるのは配送処理が終わってからとなっています。 system("/usr/local/bin/php webmail2.php $subject $address $data >/dev/null & "); ↑ これですと変数が受け渡しされませんでした。 先にコメントを表示するにはどうしたらいいのでしょうか?

    • ベストアンサー
    • PHP
  • phpの処理速度とmysqlについて

    以下のような処理をphpで実行してmicrotimeでみたところ、 6.343くらいなのですが、これって遅いでしょうか? httpリクエストをしているので、ある程度かかっても仕方ないと思っているのですが、 大体どれくらいなのか気になった次第です。後、1つのファイルで下くらいのmysql処理は別に多くないですよね? 恐れ入りますが、ご回答お願い申し上げます。 以下ソースです。 ■実行内容 mysqlから特定のキーワード取得(最後に更新した日から古い順に取得) ↓ そのキーワードを基にhttp://goodkeyword.net/へリクエストを送る。 ↓ file_get_htmlで内容を取得後、一部mysqlへ保存、更新。 ※処理はcronで実施 table構成 ■keywordsテーブル id, name(検索用キーワード) search_date(最後に処理を実行した時間) flg(defaultは1、更新や処理完了後2に変更) ■result_keywordsテーブル keyword_id(外部キー) word(取得ワード) ----------------------------------------------------------------- require_once 'conn.php'; require_once 'simple_html_dom.php'; $start = microtime( TRUE ); $req = $db->prepare('select * from keywords order by search_date asc limit 3'); $req->execute(); $words = $req->fetchAll(); foreach ($words as $word) { $url = 'http://goodkeyword.net/search.php?formquery=' .$word['name']. ''; $html = file_get_html($url); $src = $html->find('#column3-yahoo-result .result-keyword-detail tr td[!class]'); foreach($src as $element) { $rem = strip_tags($element);     if($word['flg'] == 1) { //table result_keywordsへのinsert処理(取得キーワードの挿入) } else { //table result_keywordsへのupdate処理(取得キーワードの更新) } //table keywordsへのupdate処理(search_date変更) } //table keywordsへのupdate処理(フラグ変更) } echo microtime( TRUE ) - $start; $html->clear();

    • ベストアンサー
    • PHP
  • PHP+MySQL データが無い時のみ追加したい

    PHP+MySQLで簡単なページカウンタを作っていますが、どうも正常に動いてくれません。 カウントを取りたいページに <IMG src="count.php?pagename=サンプルページ"> としてページネームを渡してあります。 count.phpの主要部分は //ページネームを取得(例:サンプルページ) $pagename = $_GET["pagename"]; とし、データベースに接続したあと // データ取り出し $sql = "SELECT name, count FROM shukei ORDER BY count;"; $rst = mysql_query($sql, $con); //データをループで読み込み while ($col = mysql_fetch_array($rst)) { $name = $col[name]; //渡されたページ名がDB内にあればカウント1増 if($name == $pagename){ $sql = "update shukei set count = count + 1 where name = '$name'"; } //渡されたページ名がDB内に無ければ新規追加 elseif($name != $pagename){ $sql = "INSERT INTO shukei(name,count) values(\"$pagename\",1)"; } } mysql_query($sql, $con); //接続解除 mysql_free_result($rst); $con = mysql_close($conn); としています、どんどん新規で追加されていってしまいます。 DB内にページ名が存在するならカウントアップをし、無い時はカウント1として新規追加をさせたいのですが…。 テーブル名はshukeiで id,name,count としております。 何か根本が間違っているのでしょうか。 どうぞ宜しくお願い致します。

    • ベストアンサー
    • PHP