小室
文
![]() |
自分のウェブサイトの検索用にわざわざ Namazu を導入しなくても Google の検索エンジンを使ってお手軽にサイト内全文 検索する方法を説明します。
利用するパターンがいくつかあります。 それぞれのパターンについて設定方法を紹介します。
どれを選んでも基本は HTML ファイル(もしくは PHP など) をウェブサーバに置くことで動作します。 JavaScript 版はブ ラウザさえあればどこでも動きます。
Google AJAX Search API の KEY を事前に取得しておきます。
HTML ファイルの中で Google AJAX Search API JavaScript ライブラリをロードします。
<script src="http://www.google.com/uds/api?file=uds.js&v=1.0" type="text/javascript"></script>
|
//名前空間の為に追加 google.load("search", "1.0"); //検索をするオブジェクトを作成する var searchControl = new google.search.SearchControl(); //検索準備 //子オブジェクトのサーチャーメソッドを検索コントロールに追加。 必要であればオプションも。 var options = new GsearcherOptions(); //表示オプション指定 options.setExpandMode(GSearchControl.EXPAND_MODE_OPEN);//結果一覧を開いた状態で出力する options.setExpandMode(GSearchControl.EXPAND_MODE_CLOSED);//結果を閉じた状態のまま結果出力をする options.setExpandMode(GSearchControl.EXPAND_MODE_PARTIAL);//結果がオープン拡張モード options.setRoot(document.getElementById("resultsComeHere"));//結果を指定する場所に表示するオプション //サイト制限の設定 var siteSearch = new GwebSearch(); siteSearch.setUserDefinedLabel("Aya’s Site"); siteSearch.setSiteRestriction("popowa.com");//直接 URL を指定 siteSearch.setSiteRestriction("000455696194071821846:reviews");//カ スタムエンジンの Key を指定\footnote{カスタム検索エンジンとはウィザードで 検索窓をある程度のデザインや制限を付けて作ることが出来るものです。 \\ \url{http://www.google.com/coop/cse/}} //準備終了、 セットする searchControl.addSearcher(siteSearch, options);//オプションがあれば searchControl.addSearcher(new GwebSearch());//オプションがなければ //出力準備 var result = document.getElementById("googleResults"); var drawOptions = new GdrawOptions();//オプション用に drawOptions オブジェクトを作成 drawOptions.setDrawMode(GSearchControl.DRAW_MODE_LINEAR);//1) 一列に出力 drawOptions.setDrawMode(GSearchControl.DRAW_MODE_TABBED);//2) タブに出力 drawOptions.setSearchFormRoot(document.getElementById("searchForm"));//検索結果と検索フォームを切り離す機能 searchControl.draw(result, drawOptions); //検索結果の保持 (prototype) searchControl.setOnKeepCallback(this, MyKeepHandler);//この (this) 検索状況を MyKeepHandler に持たせておく。 searchControl.setSearchCompleteCallback(this, OnSearchComplete); //検索の実行後 searchControl.setSearchStartingCallback(this, OnSearchStarting); //検索の完了前 //検索する! searchControl.execute(keyword); |
そして、 body 内に検索窓、 検索結果を出力したい場所に div を入れます。
<div id="searchForm" class="searchForm">form</div>
<div id="googleResults" class="googleResults">googleResults</div> |
|
レスポンス形式
{"responseData": {
"results": [ { "GsearchResultClass": "GwebSearch", "unescapedUrl": "http://en.wikipedia.org/wiki/Paris_Hilton", "url": "http://en.wikipedia.org/wiki/Paris_Hilton", "visibleUrl": "en.wikipedia.org", "cacheUrl": "http://www.google.com/search?q\u003dcache:TwrPfhd22hYJ:en.wikipedia.org", "title": "\u003cb\u003eParis Hilton\u003c/b\u003e - Wikipedia, the free encyclopedia", "titleNoFormatting": "Paris Hilton - Wikipedia, the free encyclopedia", "content": "\[1\] In 2006, she released her debut album..." }, ... ], "cursor": { "pages": [ { "start": "0", "label": 1 }, { "start": "4", "label": 2 }, { "start": "8", "label": 3 }, { "start": "12","label": 4 } ], "estimatedResultCount": "59600000", "currentPageIndex": 0, "moreResultsUrl": "http://www.google.com/search?oe\u003dutf8\u0026ie\u003dutf8..." } } , "responseDetails": null, "responseStatus": 200} |
レスポンスを個々のプログラムで処理する
<?php
function search($keyword, $page, $key){ $uri = ’http://ajax.googleapis.com/ajax/services/search/web’; $uri .= ’?q=’ . urlencode($keyword); $uri .= ’&key=’.$key; $uri .= ’&v=1.0&rsz=large&hl=ja&start=’ . $page; return json_decode(file_get_contents($uri)); } $keyword = "東京エリア Debian 勉強会"; $key = ’ アプリケーションのキー’; $data = search($keyword, 1, $key); var_dump($data); ?> |
Google AJAX Search API のかえしてくる「検索結果」 の総数には問題があります。
JavaScript あり: setSiteRestriction でドメインを指定して検索をしようとした場合、 検索結果の総数が検索するたびに変わ ります。
JavaScript なし: ?q=DMC\%20site:http://www.debian.or.jp/とするとドメイン検索は出来るが、 start?で引数を渡す たびに同じように結果総数が変わります。
Namazu みたいにページ分けされた検索の仕組みは構築出来ませんでした (2009/1 現時点)。
Google AJAX Search API の総数が変わる件については、 estimatedResultCount というくらいなので、 estimate なのでしょう。
*3ちなみに Yahoo
Web 検索でも同じような問題が発生します。 Yahoo!は検索リクエストがある度に検索結果を積算しているので違います、 と予め免責し
てあります。 第 48 回東京エリア Debian 勉強会 2009 年 1 月
____________________________________________________________________________________________