Home > memo > Google Analyticsの勉強メモ(7) サイト内検索の実装

Google Analyticsの勉強メモ(7) サイト内検索の実装

  • 2009-03-28 (土) 8:33
  • memo
  • |
Google Adsense

ga07

今回から実践編、今まで調べた内容を踏まえて結局何をしたか、やった事の話になる。
まずはGoogle Analyticsコンテンツサイト内検索を利用出来るようにしてみる。

自サイトの検索をAnalyticsで解析する3つの方法

レポートのコンテンツ項目サイト内検索がある。
これはサイト内の検索で使われたキーワード等をAnalyticsで解析できる項目だ。
この機能をまだ利用していない場合は以下のように、サイト内検索を既に導入しているかで選択肢が出されている。
サイト内検索未使用時

ここでじゃ検索設置しよっかな~なんて感じで気軽にリンク先の説明を読もうとすると、Google Site Searchのページへ飛んだりする。

Google Site Search

既にどこかのサイトで検索フォームがGoogleのものになっているのを見た事がある人ならそれを期待したかもしれないが、実はこれ別物で有料のサービスなのだ。
まるでこの有料サービスを利用しないとサイト内検索の解析は不可能な気になってしまうが、そうでもないようだ。
有料でもいいよ!という懐の広くて暖かい御仁はこのまま設定してもらっていいが、出来れば無料がいいなというナイスガイは以下を利用するのがいい。

Google カスタム検索エンジン – サイト検索

ちなみに無料で使用できるカスタム検索エンジンのほうへのリンクはAnalyticsのどこにもないが、実際の設定方法は以下で説明されている。

Analytics 日本版 公式ブログ: Google カスタム検索エンジンと「サイト内検索」レポート

実際にカスタム検索エンジンの設定をすると分かるのだが、最初の登録設定で検索エンジンのエディションの選択項目があり、そこで有料版か無料版かを選択出来るのだが、有料版のほうにはGoogle Site Searchの文字が。
なるほど全く別のサービスな訳じゃなくカスタム検索エンジンの有料版がGoogle Site Searchなのか。
ここで見られる主な違いは有料版のほうは広告が無い、詳細なカスタマイズが可能、サポート保証がある、といった点のようだ。

ちなみにGoogleの上記サービス以外でも、例えば自前の検索システムやCMSで元から付いている検索でもAnalyticsで解析可能、要はクエリを判別でき設定さえすればその値を検索キーワードとして統計を取ってくれるのだ。

つまり主に

  1. Google Site Search(有料)
  2. カスタム検索エンジン
  3. 他検索システム

の三種類の方法で検索キーワードをAnalyticsで解析する手段があるという事になる。1

有料版を使う気はないので、とりあえずはカスタム検索エンジンを試して見る事に。

カスタム検索エンジン

やり方は上記公式Analytics 日本版 公式ブログにて説明されているので、それどおりにやっていけばOK。
以下はちょっと気をつけたほうがいい点。

wordpressに設置する方法

wordpressは検索結果をphpで処理して出力するので、検索結果を表示するためのhtmlというものが存在しないので作らないといけない。
これは簡単で、blogの他の部分と差異が出ないようにヘッダーやフッダー部分を活用しつつhtmlを作り(見た目変えたい場合はやらなくていいが)、コンテンツ部分にGoogleカスタム検索の管理画面で書き出されるコードを埋め込む、このhtmlをアップロードし同様に検索窓のコードもサイドバーとかに埋め込めばOK。
検索すると上記htmlに検索結果が挿入されたhtmlが、検索結果として表示されるスンポー。

ただこれ、あくまでhtmlなのでphpを利用したwordpressのテンプレートタグ等は当然使えない
なのでblogのテーマからフッター等をそのまんま流用すると、最新記事○件、だとかタグやカテゴリーリストなんかが含まれていると更新されないので注意。
また検索結果は上記htmlに埋め込んだソース部分にiframeとして挿入される、なので検索結果を自分のサーバーにあるcssで見た目を変えようとかいうのは難しい2
見た目の調整は色や基本的なものなら管理画面からある程度手を加える事は出来る。

また今回は試さなかったが、恐らくphpにGoogleの検索結果を表示するのもそんなに難しくないんじゃないかなぁと思ってる。
どうしてもテンプレと同じヘッダーや動的なコンテンツを差し込みたい人はやってみるといいかも。

気になった点

その他気になった所など。

カスタム検索エンジントップページ

  • サブドメインの登録だと検索結果が出なかった
  • カスタム検索の管理画面へGoogleのアカウントからたどり着けない
  • 管理画面へはカスタム検索のトップにあるカスタム検索エンジンを作成ボタンの下にあるまたは既存の検索エンジンを管理という小さいテキストリンクから行ける(右図参照)。ひどい><

Google AdSenseと連携

無料版のカスタム検索エンジンだと広告が表示されるが、AdSenseアカウントがあると自分の広告を表示する事が可能な模様。
折角なのでやってみた流れをメモ。

特に何の気なくカスタム検索エンジンの管理画面メニューの“広告設定”から必要項目を記入し送信してみると、以下のような文言が表示された。

アカウントに SearchAds がありません。コンテンツ向け AdSense や紹介プログラムだけでなく、検索向け AdSense に申し込んでいることを確認してください。

あーAdSenseのほうでも何かしないといけないんだった、と思いAdSenseの管理画面にログイン。
するとこんな文言が。

お客様はパートナー ウェブサイトでの AdSense の使用をリクエストされました。これらのサイトで収益を得るには、該当サイトに AdSense アカウントへのアクセスを許可していただく必要がございます。アカウント アクセスを確認するには、こちらをご覧ください。

次いでにご丁寧にもメールまで来てた、AdSenseにリクエストあったんで設定してあげるといいよ、って事みたいなんで上記の“こちら”に張られていたリンク先からリクエストの許可をする。

…あれ?これでもう終了なのかな。
もう一度カスタム検索エンジンの管理画面の広告設定を見ると…何も変わってない?
まぁAdSenseでリクエスト許可したんだからもう出来るだろう、ともう一度入力し送信するとうまく関連付けが成功!またメールもきた。

これで終了かなと思ったら、カスタムチャネルの設定をしろとか言ってる。
なんだこれと思い読み進めたところ、これはAdSenseでいうチャネルの事だった、今回は別にいいや。

結果やった事は以下の手順。

  1. カスタム検索エンジンの管理画面メニューの“広告設定”から、自分のAdSenseのデータを入力
  2. AdSense管理画面でリクエストを許可する
  3. カスタム検索エンジンの管理画面メニューの“広告設定”から、自分のAdSenseのデータをもう一度入力

きっともう少しスマートな方法があると思うんだけど…、先にAdSenseから設定すりゃよかったのかな?
他のサイトではAdSenseから設定してる解説が多いので、きっとそっちのほうがスムーズにいきそう。

Google Analyticsと連携

さてやっと本題、Google Analyticsに検索キーワード等のデータを管理させるべくあれこれ。

アカウントのプロファイルの設定

まずAnalyticsでメインで使っているプロファイルの設定から。
サイト プロファイル情報の編集からサイト内検索レポートを有効にするにチェック。
すると幾つかの入力フォームが現れるので、必要事項を埋めていけばOK。

なんだけど…クエリ パラメータは何入れるんだろう??
と思い試しに設置した検索窓から検索してみると、

あどれす/Search.html?cx=値&cof=値&ie=UTF-8&q=wordpress&sa=値

みたいな感じ。
それぞれの意味する所はよくわからないが、とりあえず五つ確認できたので

cx,cof,ie,q,sa

と入力してみる。
これでAnalyticsのコンテンツ>サイト内検索のメニュー項目がアクティブになるが、Analyticsはデータ取得に時間かかるんで暫らく本当に取得出来ているのかよくわからない。動作確認のために普段使ってないブラウザで自サイトの検索を利用して、昼寝でもしてみよう。

~~一晩待つ~~

さて結果を見てみると、データは取得できているもののなぜか文字化け。
文字化け
色々調べるとさらに、パラメータは検索語句を渡しているものだけでいいようだ、この場合だと“q”のみでいい事に。(後から考えるとそりゃそーだろと言う…)
ひょっとして余計なパラメータが含まれてたから文字化けしたのかなと思い、パラメータを“q”のみにし、テストで検索してまた結果を待つ事に。

文字化けとの戦い

~~一晩待つ~~

あれー治ってない。
しょうがないので文字化けについて調べると、“カスタム検索エンジン”の検索結果文字化け解消法の話ばかり出てくる、それかga.jsへの移行時の文字化け、それは問題ないんだよなぁ。

UTF-8のせいではない?

なんとか扱ってくれているサイトを見つける。
Google Analyticsで「サイト内検索」の文字化け解決方 | Wazap! Blog – ワザップ!ブログ

ここによると文字化けについて以下のような内容が書かれている。

サイト自体のエンコーディングをUTF-8にする事です。そうするとURLのクエリストリングもUTF-8エンコーディングになりますので、GAで検索キーワードが正常に表示されます。

あるぇー、UTF-8なんだけどなぁ、ととりあえず何度も記事を見直すと、検索クエリがUTF-8で渡されているかが問題らしい。
試しにとGoogleのカスタム検索と、元々wordpressにある検索フォーム両方で日本語検索してみると、後者だけURLに日本語が、Googleのほうはエンコードされちゃってる。(そもそもこれを“エンコードされる”と言っていのかすらわからない)
これのせいかなぁと思い両方のURLをテキストエディタにコピペし、よく見比べてみようかと思うと…あれ?wordpressの検索URLの日本語がエンコードされた???

つまりブラウザが日本語に変換してくれてたって事なんだろうか、うーん俺この辺さっぱりわからないんだよなぁ。

コードの不備でもない?

掲示板/JavaScript質問板/google analyticsの文字コード – TAG index Webサイト(現在リンク切れ、dat落ちぽい?)

ここを参考に書き出されるscriptタグにcharsetを付与してみる。

~~一晩待つ~~

変わってない…。
いっくら調べてもわからない!><
泣く泣く今度はGoogleから読み込んでるjavascriptを解析する事に。

読み込むjavascriptのせいでもない?

検索結果を表示するために用意したhtmlに挿入するコードの中にjavascriptを呼んでる部分がある、恐らくこれがクエリを受け取ってiframeを生成挿入しているとふんで、これの処理を追って見る。
さすがGoogle様、華麗に圧縮かかってるんで手作業でコードを戻しインデントを入れて見やすくしていく。
変数や関数名が単純な文字に置き換えてあるのは面倒なんでそのままで、インデントの入れ方もノリと勢いでやったんで不整合あるかもしれないけど、処理には問題ないはず。

show_afs_search.js(読むために改行/インデント入れあるもの)
(
  function(){
    var e=null,
      a=window,
      n="q",
      k="sitesearch",
      s=a.googleSearchResizeIframe || a.googleSearchPath && a.googleSearchPath == "/cse" && typeof a.googleSearchResizeIframe == "undefined",
      q,
      p,
      l;

    function t(c,b,i,m){
      var f={},
        g=c.split(i),
        d=0;
      for(;d<g.length;d++){
        var h=g[d],
        o=h.indexOf(b);
        if(o>0){
          var j = h.substring(0,o);
          j = m?j.toUpperCase():j.toLowerCase();
          var v = h.substring(o+1,h.length);
          f[j] = v
        }
      }
      return f
    }

    function w(){
      var c=document.location.search;
      if (c.length<1) return"";
      c=c.substring(1,c.length);
      var b=t(c,"=","&",false);
      if(a.googleSearchQueryString != n && b[a.googleSearchQueryString]){
        b[n] = b[a.googleSearchQueryString];
        delete b[a.googleSearchQueryString]
      }
      if(b.cof){
        var i = t(decodeURIComponent(b.cof),":",";",true),
          m=i.FORID;
        if(m)q=parseInt(m,10)
      }
      var f = document.getElementById(a.googleSearchFormName);
      if(f){
        if( f[n] && b[n] && (!b.ie || b.ie.toLowerCase() == "utf-8") ) {
          f[n].value=decodeURIComponent(b[n].replace(/\+/g," "));
        }
        if(f[k]){
          var g=0;
          for(;g<f[k].length;g++)f[k][g].checked=b[k]==e&&f[k][g].value==""?true:f[k][g].value==b[k]?true:false
        }
      }
      var d="";
      for(var h in b)d+="&"+h+"="+b[h];
      return d.substring(1,d.length)
    }

    function r(c,b){
      return b?"&"+c+"="+encodeURIComponent(b):""
    }

    function u(c,b){
      return c?Math.max(c,b):b
    }

    function x(){
      var c="http://";
      c+=a.googleSearchDomain?a.googleSearchDomain:"www.google.com";
      c+=a.googleSearchPath?a.googleSearchPath:"/custom";
      c+="?";
      if(a.googleSearchQueryString)a.googleSearchQueryString=a.googleSearchQueryString.toLowerCase();
      c+=w();
      c+=r("ad","w"+p);
      c+=r("num",l);
      c+=r("adtest",a.googleAdtest);
      if(s){
        var b=a.location.href,
          i=b.indexOf("#");
        if(i!=-1)b=b.substring(0,i);
        c+=r("rurl",b)
      }
      return c
    }

    function y(){
      (p=a.googleSearchNumAds)||(p=9);
      l=(l=a.googleNumSearchResults)?Math.min(l,20):10;

      var c={};
      c[9]=795;
      c[10]=795;
      c[11]=500;

      var b={};
      b[9]=300+90*l;
      b[10]=300+50*Math.min(p,4)+90*l;
      b[11]=300+50*p+90*l;

      var i=x();

      if(!a.googleSearchFrameborder)a.googleSearchFrameborder="0";
      var m=document.getElementById(a.googleSearchIframeName);
      if(m&&c[q]){
        var f=u(a.googleSearchFrameWidth,c[q]),
          g=u(a.googleSearchFrameHeight,b[q]),
          d=document.createElement("iframe"),
          h={
            name:"googleSearchFrame",
            src:i,
            frameBorder:a.googleSearchFrameborder,
            width:f,
            height:g,
            marginWidth:"0",
            marginHeight:"0",
            hspace:"0",
            vspace:"0",
            allowTransparency:"true",
            scrolling:"no"
          };
        for(var o in h)d.setAttribute(o,h[o]);
        m.appendChild(d);
        d.attachEvent?d.attachEvent("onload",function(){
            window.scrollTo(0,0)
          }):d.addEventListener("load",function(){
            window.scrollTo(0,0)
          },false);
        s && a.setInterval(function(){
          if(a.location.hash&&a.location.hash!="#"){
            var j=a.location.hash.substring(1)+"px";
            if(d.height!=j&&j!="0px")d.height=j
          }
        },10)

      }
      a.googleSearchIframeName=e;
      a.googleSearchFormName=e;
      a.googleSearchResizeIframe=e;
      a.googleSearchQueryString=e;
      a.googleSearchDomain=e;
      a.googleSearchPath=e;
      a.googleSearchFrameborder=e;
      a.googleSearchFrameWidth=e;
      a.googleSearchFrameHeight=e;
      a.googleSearchNumAds=e;
      a.googleNumSearchResults=e;
      a.googleAdtest=e
    }
    y()
  }
)();

…なげーよw
とはいえ既に解決の手立てを失っている俺は、しぶしぶ動きを追っていくことに。
以下は処理を追っていった際の俺のメモ、単語の用法が間違ってるかもしれなかったり、そもそも勘違いや無理晒してそうだけど、大まかな流れは追えてると思う。

上のソースを見ながら書いたメモ
1. スコープが無名関数に移る
2. 各関数が読み込まれる
3. 最初の変数初期化が行われる(3~10行目)
4. 最初に呼び出される関数内にある関数呼び出し(t()とw())をスタックする(ほんと?自信無し
5. 関数yが呼び出される
	1. (関数y
	2. ローカル変数が設定される(l=10 p=9 s=true k=sitesearch n=q a=window)
	3. オブジェクトcとbが出来る
	4. 関数xが呼び出される
		1. (関数x
		2. ローカル変数cに文字列”http://”が格納される
		3. 変数cにグローバル変数googleSearchDomainとgoogleSearchPathがあればそれ、無けりゃデフォ値を連結
		4. 変数cに”?”を連結
		5. グローバル変数googleSearchQueryStringがあれば小文字に変換(ここでは無いのでスルー)
		6. 関数wが呼び出される
			1. (関数w
			2. ローカル変数cが設定される(アドレスの?以降の文字列全部)(30行目)
			3. ローカル変数cのlengthが1以上なのでif文はスルーされる(31行目)
			4. ローカル変数cに代入されるlocation.searchの値の頭一文字(?)を削って代入しなおす(32行目)
			5. 関数tが呼び出される
				1. (関数t 引数はc=c,b=”=”,i=”&”,m=false
				2. 各初期化処理(空オブジェクトf生成、gに引数cを引数iでスプリットした配列を格納、ローカル変数d=0)
					この時、配列qは
					[
						cx:googleに保存されてる設定の参照コード
						cof:FORID%3A9
						ie:utf-8
						q:検索クエリ
						sa:Search
					]
				3. ループ開始 配列gがなくなるまでまわす(16行目)
					1. ローカル変数hにg[d]を格納
					2. ローカル変数oにhの値で”=”文字のある位置を格納
					3. 条件式 条件:”=”文字があった場合
						1. ローカル変数jにhの値の頭から”=”の位置までを格納
						2. 引数mがfalseなので、jの値を小文字に変換して格納しなおし
						3. ローカル変数vにhの値の”=”より後ろの部分を格納
						4. オブジェクトfのプロパティ名に変数jを使い、その値にvを代入
					ループ処理内容ここまで
				4. オブジェクトfを返す
					この関数tはアドレスの後ろのパラメータをオブジェクトしているぽい
				関数tここまで)
			6. ローカル変数bに関数tの返り値が渡される
			7. グローバル変数googleSearchQueryStringが無いのでif式がスルーされる(34行目)
			8. オブジェクトbにプロパティcofはあるので条件式処理(38行目)
				1. 関数tが呼び出される
					(関数t 引数はc=デコードしたb.cof(この場合”FORID:9″),b=”:”,i=”;”,m=true
						オブジェクトfを返す({FORID:9})
					関数tここまで)
				2. ローカル変数iに関数tの返り値が渡される
				3. ローカル変数mにオブジェクトiのFORIDプロパティの値が代入される(ここでは9)
				4. mが9なのでif文処理、(上?のスコープの)変数qに”9″が代入(41行目)
				条件式終了(42行目)
			9. ローカル変数fにグローバル変数googleSearchFormNameと同じ文字列のIDのhtml要素を渡す(何故かnull)
			10. fがtrueなら条件式処理、nullはfalseなのでスルー
			11. オブジェクトbのプロパティ分ループ
				変数dに”&プロパティ名=値”の形の文字列を連結追加
			12. 変数dの最初の”&”のみ取り除いて返す

			関数wここまで)
		7. 変数cに関数wの返り値を連結
		8. 関数rが呼び出される
			(関数r(c=”ad”,b=”w9″)
				bがtrueなので、bをURIエンコードし文字列”&ad=w9″を返す
			関数rここまで)
		9. 変数cに関数rの返り値を連結
		10. 関数rが呼び出される
			(関数r(c=”num”,b=10)
				bがtrueなので、bをURIエンコードし文字列”&num=10″を返す
			関数rここまで)
		11. 変数cに関数rの返り値を連結
		12. 関数rが呼び出される
			関数r(c=”adtest”,b=グローバル変数googleAdtest、つまり未定義)
				bがfalseなので”"(空文字列)を返す
			関数rここまで)
		13. 変数cに関数rの返り値を連結
		14. 条件式 条件:変数sがtureなら、なので条件式処理
			1. ローカル変数bにlocation.href格納
			2. ローカル変数iに変数bの文字列内の”#”の位置を格納
			3. location.hrefに”#”が含まれていた場合、変数bにハッシュを取り除いて格納しなおし
			4. 関数rが呼び出される
				(関数r (c=”rurl”,b=変数b(ハッシュ抜きのlocation.href))
					bがtrueなので、bをURIエンコードし文字列”&rurl=ハッシュ抜きのlocation.href”を返す
				関数rここまで)
			5. 変数cに関数rの返り値を連結
			条件式ここまで
		15. 変数cを返す
		関数xここまで)
	5. ローカル変数iに関数xの返り値を格納
	6. グローバル変数googleSearchFrameborderが無い場合、googleSearchFrameborderに”0″を格納
	7. ローカル変数mにグローバル変数googleSearchIframeNameの名前のidのhtml要素を格納(検索結果表示用htmlに予め準備してある空要素)
	8. 条件式 条件:mがtureでかつc[q]がture(qは関数wの途中で”9″に上書きされているので条件式処理)
		1. ローカル変数・オブジェクト初期化、iframeのパラメータ各種(103~118行目)
		2. 変数dにiframeエレメントを作って格納(105行目)
		3. オブジェクトhのパラメータ分ループをまわし、変数dのiframeエレメントに属性セットしていく(119行目)
		4. 変数mの検索結果表示用の空要素に変数dのiframeを子要素として挿入
		5. 変数dのiframeに座標0,0へスクロールするイベントを追加(イベントの追加方法を三項演算子で二種用意)
		6. sがtrueならsetIntervalに関数セット Intervalは10/1000秒
			論理演算子は左から順に評価し、falseだったら時点で結果をfalse扱いにするような気がしたんで
			“s && a.setInterval(~~)”の形はsがfalseの場合右のsetIntervalは処理されないので、ちょっとした条件式扱いになるんだと思う
				(setIntervalに追加する関数内容
					URLにlocation.hashがあり、かつlocation.hashが”#”のみじゃない場合のみ処理するif文(falseなら関数終了)
						ローカル変数jにlocation.hashから”#”だけ取り除き、さらに文字列”px”を連結し格納
						変数dのiframeのheightが変数jと等しくなく、かつ変数jが”0px”でない場合は、変数dのiframeのheightに変数jを代入
					条件式終わり
					これは定期的にiframeの高さを設定しなおす事で、ウィンドウのサイズ変更や文字の大きさ変更に対応してるんだと思う
				関数終わり)
			条件式終わり
	9. 各種グローバル変数に変数e(null)を代入し初期化
	関数yここまで)

…さすがに恥ずかしいな、何を理解してないかがありありとバレてしまった。
そもそも“デキル人は”こんな必死こいて読み込まなくても、さっとデコード・エンコード処理する周辺だけ見て把握しそうだけど。
ともあれ、何とか読みきったけど…さっぱり原因がわからない!
javascriptの文字コード周りでトラブルが起きる話はググればわんさか出てくるけど・・・どうも問題無いように見えるなぁ。
するとコードのせいじゃないのかな?

Analitycsのほうではタイトル別のコンテンツレポートは勿論の事、上位のコンテンツとかその辺のレポートに表示されるURLに含まれる日本語すら表示される。(勿論クエリで渡してる検索キーワードも、つーか除外しろと言う話だが)
つまりAnalitycsのほうの文字受け渡しに問題はなく、カスタム検索側のほうに問題あると思うんだけどなー。

~~完全に行き詰まり一週間ほど遊ぶ~~

これは記事に「無理でした><」と書くしかないなと諦めつつAnalyticsを覗いてみると…あれ!?ちゃんと表示されてる!!
何故!?
(検索語句は日本語テストのために投げやりに入力されたものです)

結局何だったのだろう

あれから各種ブラウザで色んな検索パターンを試したが、全て文字化けせずひろわれていた。
あれこれ細かい方法を試していたがそれらが要因だったとは言いがたく、ハッキリとうまくいった要因をつかむ事は出来なかった。
単に時間が経ちAnalyticsが正確に言語を取得反映する事が出来たのだろうか。

ただ原因を特定する材料の1つとして、今回カスタム検索と同時にwordpressのデフォルト検索システムのデータ取得も試してみていた。
こちらも同時に文字化けしていて、同時になおった…と言う事は今回の件はカスタム検索の問題ではなくAnalitycs側の問題だったのだ。

…ここまで読んでくれている奇特な方はお察しの通り、こんな事は同時にテストしてる時点で気付いていたのに、俺はカスタム検索のjavasctipを必死に読み込んでいた…関係ないのに。

そう、それだけどうしていいか分からなくて混乱してたんですね^^
つまり以下の事が言える。(これしか言えない)

検索キーワードの文字化けは、時間が経てば解決する場合がある。

こういうのよくないんだけどなぁ…。

自サイトの検索との連携

少し前の項目でも触れたが、別にGoogleの提供する検索エンジンを利用しなくてもAnalyticsでデータを収集する事はできる
これは単純に検索クエリ文字を指定すれば検索キーワードとして拾ってくれるだけの仕組みなので、wordpressだったら上のカスタム検索エンジン設置の際に入力した検索クエリ文字“q”の代わりに、wordpressで検索する際使用する検索クエリ文字“s”に変更すればいい。
今回はテストで両方設置した状態でいたが、その場合は“q,s”と両方指定してやると検索キーワードを両方拾ってくれる。
一応区別付ける方法もあると思うが、面倒なので今回はテストで検索する場合はどちらで検索したか分かる語句を利用し判別した。

“Google カスタム検索エンジン”導入のメリット・デメリット

今回はAnalyticsよりカスタム検索エンジンの導入や、文字化けへの対処に大半の時間を費やすハメになったので、折角なんでテストとはいえ使ってみたので感じたメリット・デメリットをあげてみる。

メリット

  • 検索精度がGoogleのエンジンを利用するので何かいい気がする
  • 検索の負荷がGoogle持ち
  • AnalyticsやAdSense等の、他のGoogleサービスと連携しやすく、それらのメリットを享受出来る
  • CMSを使っていなかったりhtmlメインのサイト等、検索システムを0から作らないといけないサイトでは導入コスト爆安

デメリット

  • 広告が入る(有料サービスに移行すれば解決?また自分のAdSenseで表示も出来るため必ずデメリットにはならない)
  • Googleにインデックスされていないページは検索結果に出ない(たぶん)
  • GoogleのインデックスやSitemapの反映が遅い場合がある
  • デザインのカスタムやAjaxとの連携が難しい。
  • iframeを使う事になる(使わない表示方法も一応ある)
  • 検索が網羅的なのでblogだと記事単体だけでなく、その記事が属するカテゴリー・タグ、果ては日別月別アーカイブまで片っ端から含まれる

雑感

あくまで個人サイトでの利用という視点で言えば、最も強みであるAd系のサービスとの連携はそれほど重要じゃなくなるだろう。
blogやCMSを利用していないサイトで、さらに検索機能が必要な程度の内容量があるサイトの場合、これは非常に素晴らしいサービスだ。。
データベースでコンテンツを管理していなくても、プログラムの知識がほぼ無くても自サイトに検索フォームを設置できるのは楽でいい。

反面CMSを利用し、元々検索機能を付加できる環境のサイトは、よほどその検索機能がダメじゃない限りそちらを使うべきだと感じた。
既に述べたようにGoogleのサービスじゃないサイト内検索でもAnalyticsでデータは取得できる。
カスタマイズの幅の狭さ・難易度の高さからいって、自前のシステムのを利用したほうが楽だろう。

あとただの感想だけど、今回文字化けですんげー苦労したけど、Analyticsはデータ反映までかなり時間がかかるんで、修正や試した事の結果が出るまでに半日~一日待つハメになる。
面倒だし、モチベーションを保つのが非常に難しかった…、何度もほうりだそうと思ったけど、結果的に半分放り出しているようなもだったり。

  1. 実はこの他にもエンタープライズ向けサービスGoogle Miniなんてのもある。Miniとか言うくせに完全に個人向けとかけ離れている規模と価格(40万円以上)なので除外したが。 [戻る]
  2. javascriptでDOMからiframeを取得し、予め用意しておいたcssへのリンクをaddすれば…と思ったけど別ドメインじゃ出来ないか。無理じゃないと思うんだけどこれが出きちゃうとAdSenseの内容まで書き換え出きちゃうんでだいぶ危ないにおい [戻る]

Comments (Close):10

ロエベ 公式 13-11-25 (月) 19:35

<a href="http://www.needlelady.net/category-80/チャンルーレディース新作 人気絶頂!http://www.needlelady.net/category-80/
ロエベ 公式
[url=http://www.batpighk.com/]ロエベ 公式[/url]

deiwzgvflt 13-11-25 (月) 19:44

Google Analyticsの勉強メモ(7) サイト内検索の実装 – atl*weblog
[url=http://www.g5u2y561e9hs84o12cjyfr1184ivi6v7s.org/]udeiwzgvflt[/url]
deiwzgvflt http://www.g5u2y561e9hs84o12cjyfr1184ivi6v7s.org/
adeiwzgvflt

north face jacket 14-01-08 (水) 15:22

Hey there, I think your website might be having browser compatibility issues. When I look at your website in Opera, it looks fine but when opening in Internet Explorer, it has some overlapping. I just wanted to give you a quick heads up! Other then that, terrific blog!
north face jacket

red bottom shoes nude color heels 14-01-15 (水) 12:36

S E A T S, V I L L A G E S, a mile plus a fifty percent South of your church-town is Pendarves, the family seat of John Stackhouse, Esq. Within the gap of 50 % a mile North are the residences of William Harris, Esq. Josiah Cocke, Esq..
red bottom shoes nude color heels

Chanel Clearance Online 14-01-20 (月) 17:52

Caribbean Prawn Salsa was a wonderful balance of fresh mango, bursty prawns, red chilli and mint. So delicious, seasonal and fresh, it complimented our plate of rich food.
Chanel Clearance Online

burberry scarpe 14-02-19 (水) 4:37

Thanks for any other informative blog. Where else may just I get that type of information written in such a perfect way? I have a project that I am just now working on, and I’ve been on the glance out for such information.
burberry scarpe

silver rings 14-03-27 (木) 21:03

And after you’ve heard about the incredible benefits that you stand to gain by using free energy generator, I’m sure you’ll change your mind.
silver rings

bath mate 14-04-17 (木) 7:27

Its like you go through my mind! You appear to know so significantly about this, like you wrote the book in it or a thing. I believe which you could do with some pics to drive the message household a little, but as an alternative of that, this can be excellent weblog. A excellent go through. I’ll unquestionably be back.
bath mate

akdlkqpop.meopost.com/2014/06/10/falcons-build-stadium-south-site/ 14-06-13 (金) 20:17

An awesome story. Thanks a lot!
akdlkqpop.meopost.com/2014/06/10/falcons-build-stadium-south-site/

vbfgbvff.meopost.com/2014/06/10/ravens-resuscitate-playoff-hopes/ 14-06-13 (金) 20:18

This really is among certainly the best story.
vbfgbvff.meopost.com/2014/06/10/ravens-resuscitate-playoff-hopes/

Trackbacks (Close):1

pingback from Google Analytics、サイト内検索の文字化けは直せるのか | カグア!Google Analytics 活用塾:事例や使い方 09-06-22 (月) 13:48

[...] ブログ  (サイト内検索をGoogleを使って実装する方法)  Google Analyticsの勉強メモ(7) サイト内検索の実装 – atl*weblog  Google Analyticsで「サイト内検索」の文字化け解決方 | Wazap! Blog – [...]

Home > memo > Google Analyticsの勉強メモ(7) サイト内検索の実装

Calendar
« 2017 年 6月 »
M T W T F S S
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30    
Search
ABM | AnotherBookmark™
heteml
heteml
amadana
amadana(アマダナ)
feed
Meta

Return to page top