2011年5月31日火曜日

google site search(googleカスタム検索の有料版)をやってみた

google site search(googleカスタム検索の有料版)をやってみた:

①まず必要のはgoogle account
②APIを使うならapi-keyも申請しといた方がいい、無料なら一日100query使える、ちなみにpriceはこれ:


Search query limit (annual) Pricing (annual)
クエリー上限(年間) 値段(年間)
20,000 $100
50,000 $250
150,000 $750
500,000 $2,000
500,000+ Contact sales
※有料でも10,000query/dayは上限  
※ちなみに年間2万クエリー超えた場合、自動的に50,000に切り替えるか、api使えなくなるかは不明。(ヘルプセンターに質問を投げた人も居たが、回答がない)ちなみに、一日で1万を超えた場合はapiが使えなくなるらしい。
※支払いが開通している場合、100クエリ/日の無料APIがそのまま使える(広告ありなし選択可能)。100を超えた場合、$5/1000クエリが請求される、しかし上限を10,000クエリは変わらない。ここ参照



こちらは無料版と有料版の機能の比較、有料版は検索結果をxmlやjsonで返せて、自由にアレンジできるという最大のメリットがある。
http://www.google.com/cse/compare?hl=ja

あるサイトの 「ブラジル」 というキーワードですべての 「PDFファイル」 「作成日順の降順」 を検索したプログラムです。
jsonで検索結果をもらって、検索結果画面をjavascriptで作りました。
<!-- ▼ここからサイトサーチ▼ -->
    <!-- 日本語を検索する場合、ソースコード自体は必ずUTF-8に保存すること -->
    <div id="content"></div>
    <div id="pager"></div>
    <script type="text/javascript">
    
      var innerhtml;
      var pager;
      var pagecount;
      var startnum = 1;
      var param;
      var url;
      param = window.location.search.substring(1);
      url = window.location.href;
      var tmp = url.split('?');
      url = tmp[0];
      if(param.length > 6){
        if(param.substr(0,6)=='start='){
          startnum = param.substr((param.indexOf('=')+1),(param.length-param.indexOf('=')));
        }
      }
      //alert(startnum);
      pager = '<div width=\"735\">';
      innerhtml = '<table><tr><th>日付</th><th>レポート名</th></tr>';
      function hndlr(response) {
        for (var i = 0; i < response.items.length; i++) {
          var item = response.items[i];
          // in production code, item.htmlTitle should have the HTML entities escaped.
          var datestr = item.pagemap.metatags[0].creationdate.substr(2,4)+'年'+item.pagemap.metatags[0].creationdate.substr(6,2)+'月'+item.pagemap.metatags[0].creationdate.substr(8,2)+'日';
          innerhtml += '<tr><td>'+datestr+'</td>';//日付
          innerhtml += '<td><a href=\"'+item.link+'\" target=\"_blank\">'+item.htmlTitle+'</a></td></tr>';//レポート名
       }
        document.getElementById("content").innerHTML = innerhtml;
        pagecount = Math.ceil(response.queries.request[0].totalResults / response.queries.request[0].count);
        pagecount = 10;//googleのbug,10ページ以上はerrorしか帰ってこない
        for (var i = 1; i <= pagecount; i++) {
          pager += '<a href=\"'+url+'?start='+(((i-1)*response.queries.request[0].count)+1)+'\">'+i+'</a>&nbsp;&nbsp;';
        }
        pager += '</div>';
        document.getElementById("pager").innerHTML = pager;
        //alert(pagecount);
        //alert(pager);
        //alert(window.location.search.substring(1));
      }
      document.write('<script src=\"https://www.googleapis.com/customsearch/v1?key=YOUR-KEYXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&cx=000000000000000000000:45abcdefghi&lr=lang_ja&q=ブラジル+filetype:pdf&callback=hndlr&sort=date:metatags-creationdate&start='+startnum+'\">');</script>
    </script>
<!-- ▲ここまでサイトサーチ▲ -->

一部パラメータ説明

パラメータ説明
key goolgeから発行されるapi key,google api consoleでsaite searchを「on」にする必要がある。https://code.google.com/apis/console/
ここでCustom Search APIを「On」にすれば、無料で100クエリー/日のでapi keyを利用できるよ、API keyはAPI Accessメニューから確認できる
cx 管理画面で設定した検索エンジンのID、googleカスタム検索のマイ検索エンジンのコントロール パネルで確認できる
lr 言語、ここでは日本語を設定
q 検索キーワード、ここではブラジルを設定。+filetype:pdfはPDFのみ検索。注意!ソースコードはutf-8で保存すること
callback これは、検索結果がjsonオブジェクト(デフォルト,xmlもOK)で戻ったら、どのメソッドに渡すかの設定
sort date:metatags-creationdate、これはオブジェクトのある属性でソートするという書き方、PDFの結果だと、pageMapの中にmetatagsというオブジェクトがあります、その中のcreationdate日付型で降順(デフォルト)ソート、必ずpageMapの中のプロパティじゃないといけないみたい、しかも数字か日付じゃないと行けない。

書き方は  sort=データ型:オブジェクト名-プロパティ名[:ソート順:強弱]
start 検索結果開始位置、1ページ最大10個検索結果表示できる(1から10で調整可)、例えばstart=11は第二ページを意味する、ページングを作るとき用です。ちなみに、totalResultは100以上あっても、start=101を設定すると400エラーしか帰ってこない、googleのバグかなぁ

0 件のコメント:

コメントを投稿