higuchi.com blog

The means justifies the ends

探し物はなんですか その2 [検索キーワードプラグイン]

[PR] 本ブログの商品紹介リンクには広告が含まれています

以前に書いたとおり、検索サイト経由でどこかのページにたどり着いた場合、たどり着いた先のページがあるサーバー側では、どこの検索サイトからやってきたのか、また、何という文字で検索してそこにたどり着いたのか、などといった情報が分かります。
前回はそれを解析するツールをこしらえたのですが、ちょっと改造して、ブログ上に表示するためのプラグインにしてみました。新着検索キーワードのリストや、人気キーワードランキングの機能付きです。 一通りの機能が揃った“ベータ版”をここからダウンロードできます。
次の機能が使えます。
  • 直前に検索サイトで入力していた文字列をそのまま表示する。国内外のメジャーな検索サイトほとんどに対応。
  • 新着検索文字列の一覧を表示する。サイト全体での一覧と、各ページごとの一覧が可能。
  • 検索文字列の頻度のランキングを表示する。サイト全体での一覧と、各ページごとの一覧が可能。
インストールするには、ダウンロードしたファイルを解凍して、Nucleusのプラグインディレクトリにアップロードし、Nucleusの管理画面の「プラグイン」のページでインストールのボタンをクリックするだけです。
インストールできたら、ページのスキンの中に、下記の表示用タグを記入します。

<%SearchedPhrase%> 直前の検索文字列を表示します。
このサイトでは、ページ左上のGoogleサイト内検索の入力欄にこの機能を使っていて、検索サイト経由でやってきたときだけ、検索サイトで入力していた文字が入力された状態でページを表示します。

<%SearchedPhrase(highlight)%> 検索サイトで入力していた文字をハイライト表示するためのJavaScriptをページに追加します。
スキンの </head> の直前あたりにこのタグを追加してください。

<%SearchedPhrase(recent)%> 新着検索文字列の一覧を表示します。
デフォルトでは現在表示しているページへやってきたときの検索文字列だけを絞り込んで5件だけ表示しますが、<%SearchedPhrase(recent, all)%>でサイト全体の一覧を<%SearchedPhrase(recent, all, n)%>(nは数字)でn件を表示します。
新着データは過去30日分を保存してあります。それより古いものは削除します。何日分を保存するかは、プラグインのオプション設定画面で変更できます。
このサイトでは、サイトのインデックスのページに(recent, all,10)を、個別アイテムのページに(recent)を使用しています。

<%SearchedPhrase(rank)%> 検索文字列の頻度順ランキングを表示します。
デフォルトでは現在表示しているページへやってきたときの検索文字列だけを絞り込んで5件だけ表示しますが、<%SearchedPhrase(rank, all)%>でサイト全体の一覧を<%SearchedPhrase(rank, all, n)%>(nは数字)でn件を表示します。
頻度データは、今のところ新着データと違って過去のものをすべて保存するようにしてあります。
また、それぞれのキーワードをクリックすると、Googleのサイト内検索をそのキーワードで検索した結果を表示します。デフォルトではただのサイト内検索ですが、プラグインのオプションでパラメータを追加して、SiteSearchやAdSenseに対応した検索も可能です。
このサイトでは、サイトのインデックスのページに(rank, all, 20)を、個別アイテムのページに(rank, , 10)を使用しています。


どんなキーワードを探してどのページにたどり着いているのか、リアルタイムに見えて単純に面白いのですが、使い方によってはSEO的にもかなり効果がありそうな気がしています。

お試しください。

コメント

樋口 理さんのコメント:

検索していた文字をハイライト表示する機能と、キーワードランキングのそれぞれのキーワードをクリックするとサイト内検索のページが開く機能を追加して「ベータ版」にしました。
2004/7/22 22:59

樋口 理さんのコメント:

みなさんのベータテストのフィードバックのおかげで、現在、Beta 4がダウンロードできるようになっています。
ベータ版からの主な変更点は、
・マルチバイト関数エミュレータ環境での誤動作を避けるために、文字コード判別を 'auto' ではなく 'utf-8, sjis, euc-jp, jis' などと指定するようにした
・サーバーに時差があるときに表示時刻がおかしいのを修正
・register_globals = off になっている環境でも動作するように修正
などです。

フィードバックをいただいたみなさん、ありがとうございます。
引き続き、フィードバックをお待ちしております。
2004/8/12 12:07

ネケトさんのコメント:

昼に報告した、アイテムスキンで「all」を省略したときの挙動について。

どうも普遍性のない環境依存な感じなので詳しくは口頭なりメールで説明しますが、なぜか$itemidが必ず「83」になってしまうのです。ただ、DBにはそれぞれ正しいアイテムIDが記録されているので、「絶妙なタイミング」で正しいID→83に書き換わっている模様。doSkinVar()のcaseで分岐して、$itemを引数にして、
echo $item
するテストオプションを作って確認しました(「メインの目次」スキンでも83ってのはどういうこった)。init()の時点では正しくて、doSkinVar()では書き換わっているのかも。

どうもウチの環境の問題のような気がします。参考までに、ウチでも動くようにしたコードを後でお見せします。

ちなみに、Beta 4で1点だけミスを発見! getVersion()の戻り値はb4っすよね(笑)。
2004/8/12 23:27

樋口 理さんのコメント:

あー。たぶん、それはNP_MostViewedプラグインの副作用(バグ)じゃないかと思います。
http://nucleus.fel-is.info/... にも同じような現象が報告されてるんですが、NP_MostViewedプラグインが、$itemidを書き換えてしまうようなのです。
NP_MostViewedの38行目のglobal $itemid;の行をコメントアウトしてみてくださいませ。

getVersion()の戻り値は……忘れてましたっ!(笑)
2004/8/13 01:52

樋口 理さんのコメント:

> ウチでも動くようにしたコードを後でお見せします。
ってことは、動いたんですね。そうか、init()の時に$itemidを保存しておけばいいのか。それは、いい手ですねぇ。いただき!(感謝、感謝)
2004/8/13 01:57

ネケトさんのコメント:

あっ、解決の赤面報告しようと思ったら、もう返事が。そう、寝てるときに気づきました。83=MostViewedの10位だ! と。コイツを直したら、SearchedPhraseはそのままでも動くことを確認。失礼しました。

SearchedPhrase側の修正で動くようにした方法は、まさにinit()で$itemidを別変数名にコピーして、以後それを使うというもでした。これはこれで、そのままにしてあります。Nucleus全体から参照されるグローバル変数だと、いつかほかの「悪い子」が悪さするかもしれないので(笑)。

いやー、典型的な「グローバル変数のワナ」でしたね。
2004/8/13 07:43

初心さんのコメント:

インストールしようとしたら、
SqlTablePrefixと言うエラーになりました。

Plugin NP_SearchedPhrase was not loaded
(does not support SqlTablePrefix)

対応方法はありますでしょうか?
2004/11/10 12:19

樋口 理さんのコメント:

ああ。バグのようです。修正したものを上げておきました。
http://www.higuchi.com/nucl... からダウンロードしてお試しいただけますか?
2004/11/10 13:26

Andyさんのコメント:

Google.co.jpのときによく文字化けしているのですが,どうしてでしょう?
2004/11/30 14:10

樋口 理さんのコメント:

> Google.co.jpのときによく文字化けしているのですが,どうしてでしょう?
現象を見てみないと断定的なことは言えませんが、Googleの検索結果は、まれに文字コードの種類の情報が付いていないことがあって、その場合は文字化けをする可能性があります。
どういうときに文字コードの種類の情報が付いていないのか、また、情報が付いていないときに実際にはどの文字コードが使われているのかを調べたいのですが、現象をめったに捕まえることができないため困っています。
文字が化けたときのアクセスに該当するWebサーバーの生のログを集めるとなにかがわかるはずですので、もし運良く化けたところのログが手に入るようでしたらお送りいただけると助かります。
2004/11/30 23:40

Andyさんのコメント:

捕捉しました(^^)。
http://www.google.co.jp/sea...

繧?〒縺溘s
になりました。
2004/12/1 10:45

樋口 理さんのコメント:

ありがとうございます。ちょいと難題かもしれない。

文字コードはUTF-8で来ているようです。で、文字コード種類の指定がないときはUTF-8, SJIS, EUC-JP, JIS, ASCIIの順で自動判別するようにしてあるので、正しくUTF-8と判別してくれるはずなのですが、mb_convert_encoding関数が、なにかのはずみで判別ミスしてしまっているようです。
なぜこうなるのか、ちょっと調べてみます。
あ、プラグインのバージョンはいちばん新しい奴ですよね?以前はautoで指定していたので……
2004/12/2 07:26

Andyさんのコメント:

SJIS, EUC-JP, UTF-8,…の順になっていたので(バージョンは1.0b3です),変えてみました。
2004/12/2 12:12

Andyさんのコメント:

Googleはその後,大丈夫なようですがYahoo!でも文字化けでました。
http://search.yahoo.co.jp/b...

?????&#65533;&#65533;?&#65533;&#65533;?<?
なってしまっています。エンコーディングはEUC-JPになっているようですがなぜでしょう?
2004/12/6 18:23

樋口 理さんのコメント:

こんにちはー。

&#65533; って、Unicodeエンティティの未定義文字っぽいですね。

やっていることは mb_convert_encoding(stripcslashes(urldecode("%C9%CA%C3%A3%A5%E9%A1%BC%A5%E1%A5%F3", _CHARSET, 'EUC-JP') というシンプルな処理ですんで、mb_convert_encoding()がなぜか誤動作したか、cstripslashes()がなぜだか削ってはいけない“文字の一部”を削ってしまったと考えるのが自然な気がします(って、そんなバグあるのかな…)
_CHARSETはutf-8ですよね?
PHPのバージョンと、内部文字コード設定をお教えいただけますか?同じような環境で再現できるかどうか試してみます。

品達ですか……(笑)
2004/12/6 18:54

Andyさんのコメント:

PHPは4.3.9,内部コードはUTF-8です。

mbstringの設定は
mbstring.detect_order no value no value
mbstring.encoding_translation Off Off
mbstring.func_overload 0 0
mbstring.http_input pass pass
mbstring.http_output pass pass
mbstring.internal_encoding no value no value
mbstring.language neutral neutral
mbstring.substitute_character no value no value
となっています。
2004/12/6 19:48

もり2さんのコメント:

お世話になります。文字化けの件、
プラグイン等で
mb_language('ja');
を記述する、

あるいは、当プラグイン中の
mb_convert_kana() の第3引数に文字コード指定を加えると解決したりしませんでしょうか?
2004/12/7 17:17

hsurさんのコメント:

はじめまして。プラグインはサイトで便利に活用させてもらってます。バグらしきものを見つけたので報告させてください。

このプラグインではテーブルに検索されたキーワードが格納されていっていると思うのですが、これが設定してある期日で削除されないようなのです。

# 最近私のサイトのパフォーマンスが良くなくて、SQLのログを調べてみたらわかりました。

いろいろと調べてみたところ、DELETE文中の日付の指定に問題があるようです。具体的には142行目でシングルクォートが余計についてしまっています。

# mysqldate()はダブルクォートがついた文字列を出力するためです。

よろしくお願いします。
2005/1/8 19:09

樋口 理さんのコメント:

なるほど。気がつきませんでした。早速直しておきます。
デバッグ&ご報告、ありがとうございます。
2005/1/12 17:04

horusoさんのコメント:

はじめまして.nucleusを使い始めたばかりのものです.お世話になってます.さっそくですが,1.0b6にバグが2つあると思います.
1. rank出力で<li>を</dt>で閉じています.
2. search_optionで&が不正な実体参照になります.
いらないと思いますが,一応パッチを.

--- NP_SearchedPhrase.php.orig 2005-01-12 17:10:00.000000000 +0900
+++ NP_SearchedPhrase.php 2005-01-25 01:23:22.000000000 +0900
@@ -200,19 +200,19 @@
$hl = $this->getOption('SiteSearchHl');
$cof = $this->getOption('SiteSearchCof');

- $site_search_options = ($domains ? "&domains=" . urlencode($domains) : "") .
- ($sitesearch ? "&sitesearch=" . urlencode($sitesearch) : "") .
- ($client ? "&client=$client" : "") .
- ($forid ? "&forid=$forid" : "") .
- ($ie ? "&ie=$ie" : "") .
- ($oe ? "&oe=$oe" : "") .
- ($hl ? "&hl=$hl" : "") .
- ($cof ? "&cof=" . urlencode($cof) : "");
+ $site_search_options = ($domains ? "&amp;domains=" . urlencode($domains) : "") .
+ ($sitesearch ? "&amp;sitesearch=" . urlencode($sitesearch) : "") .
+ ($client ? "&amp;client=$client" : "") .
+ ($forid ? "&amp;forid=$forid" : "") .
+ ($ie ? "&amp;ie=$ie" : "") .
+ ($oe ? "&amp;oe=$oe" : "") .
+ ($hl ? "&amp;hl=$hl" : "") .
+ ($cof ? "&amp;cof=" . urlencode($cof) : "");

echo "<ol>\n";
while($row = mysql_fetch_array($res, MYSQL_ASSOC)) {
$query = $disp_length?shorten($row["query_phrase"], $disp_length, "..."):$row["query_phrase"];
- echo '<li><a href="' . $site_search_url . "?q=" . urlencode($row["query_phrase"]) . $site_search_options . '">' . htmlspecialchars($query) . "</a> (" . number_format($row["query_count"]) . ")</dt>\n";
+ echo '<li><a href="' . $site_search_url . "?q=" . urlencode($row["query_phrase"]) . $site_search_options . '">' . htmlspecialchars($query) . "</a> (" . number_format($row["query_count"]) . ")</li>\n";
}
echo "</ol>\n";
}
2005/1/25 01:35

しみずさんのコメント:

半角カナ、半角アルファベットも問題なく対応しているのでしょうか?もし既知の制限があれば教えてください。
2005/11/3 10:45

hsurさんのコメント:

便利に使わせていただいていますが、php5に移行したら、エラーを吐くようになってしまいました。どうやら$thisという変数名がいけないようです。

v1.0用のパッチを書きましたので、確認いただけると幸いです。
http://blog.cles.jp/item/2455
2008/3/5 00:15

樋口 理さんのコメント:

うへ。お恥ずかしい。そういえば以前にもご指摘をいただいていたのに、修正を忘れてました。

修正して、そのほか積年のアップデートを加えた新しいバージョン (v1.1) をリリースしました。

http://www.higuchi.com/doku...
2008/3/5 11:30

コメントを書く

関連するかもしれない記事

寄ってらっしゃい [Google Sitemaps]

このところ、Yahoo!の新検索エンジンであるYSTのクローラー(インターネット上のページをリンク伝いに読...

この記事を読む »

探してなんぼ [Google WebSearch]

グーグルの新しいサービスGoogle WebSearch(グーグル ウェブサーチ)が始まりました。 グーグルなどWe...

この記事を読む »

コンテンツサイトでのターゲティング広告 [Google Content-Targeted Adwords]

昨年末の御手洗さんを問い詰める会で冗談交じりに話していた「Blogのコンテンツに合わせて『突然ですが...

この記事を読む »

「ソーテック」で検索して訪問した数

Google様から嫌われてしまったらしい [検索結果のコントロール]

このブログ、人さまよりちょっと長いことやっているせいで、外からのリンクも多く、ずいぶんと検索結果...

この記事を読む »

探し物は何ですか [検索エンジンからのトラフィックを分析する]

ちょっと思うところがあって、@ITの記事ページに検索エンジンからたどりついた人がいったい何を検索し...

この記事を読む »

将軍様はミリタリーおたく? [金正日のジャンパー]

将軍様はミリタリーおたく? [金正日のジャンパー]

写真は本文と関係ありませんってば  とある方から...

この記事を読む »

検索エンジンとの付き合い方 [mod_rewriteの術]

blogをサイトの「上のほう」の階層に置くようになってから、Googleをはじめとする検索エンジンのロボッ...

この記事を読む »

エラー錬金術 [404]

しばらく多忙でBlogの書き込みをサボっていたら、いろんなことが起こっていました。 その1。家の留...

この記事を読む »

XRAINサービスに見る、Webサイトリニューアルのときにやってはいけないこと

XRAINサービスに見る、Webサイトリニューアルのときにやってはいけないこと

国土交通省が整備を進めている「XバンドMPレーダ」による雨量情報の観測網、XRAIN。細かい分解能で精度...

この記事を読む »

もったいない [Google Mobile Gateway を排除するサービス]

Google Mobile Gateway っていうサービス、ご存じですか? PC ブラウザ用の大きなページを、携帯電話...

この記事を読む »