日々叢書(この著者ちょこちょこ昔の文章直します。スイマセン)

あなたのサイトを Google 検索

Web サイトを運営しててしばらくたつと、
自分のサイトに検索エンジンを加えたくなってきます。
もちろん人気サイトの場合は利用者の便宜を図るためですが、
この程度のヘタレサイトでも作成者自身が必要とする局面があります。
というのは
・自分のための覚え書きで書いたことを
 後で思い出したいことがある
・思いついたままに書いてあるので、
 昔の記事を読み返さないとネタがカブることがある
からです。

ということで検索エンジンというと、
普通は Namazu エンジンを組み込んでインデックスを作って・・・
ということになりますが、
これ、レンタルサーバーがCGI に対応してるだけではだめで、
インデックスを作成するジョブをサーバー上で動かすことが必要になり、
そのためには Telnet アクセスが必要になったり、
入っていないモジュールをビルドしたりということで、
ちょっとカンタンにはいかないと思います。
(昔ちょっと調べたことがあって、ソニーさんが作った
 SonyDrive というのがフリーでよさげだったんですが、
 まだ公開してるんでしょうかね)

また、制限がキツいサーバーでは重い検索ジョブを走らせてくれないことがあります。
検索エンジンというのは用途が多いと思うんですが、
レンタルサーバーでサービスを提供してくれないのはそういう理由があるんでしょうかね。

さて、ここでは非常にハンディな方法で検索を実現してみようと思います。
これは商用検索エンジン Google の提供する機能で自分のサイトだけを検索してみよう、というものです。
本サイトのホームページにも設置してみましたが、なかなか良好に動作しています。

これには、以下のページのインストラクションに従います。

Google フリー検索

ここで注意ですが、自分のサイト内に検索をしぼりたいというとき、
上のインストラクションページのうち2番目の「ウェブ検索 + サイト検索」を使ってしまいがちですが、
これを使うと、Google のトップページで次のような検索を行ったのと同じ状態になります。

 [検索語 site:http://ajisai.sakura.ne.jp/

この site パラメーターは Google に機能を追加する特殊な検索語ですが、
これにはドメインのトップレベルしか渡せません。ウチのサイトみたいに

 [検索語 site:http://ajisai.sakura.ne.jp/~dindi

だとエラーになります。

では、サブディレクトリを入れて検索したい場合はというと、
次のように inurl という検索語を使います。

 [検索語 inurl:ajisai.sakura.ne.jp/~dindi

ここで inurl は URL の中に : 以降の文字列があるサイトにヒットするということです。
ここでスキーム名 http:// は書けないので注意してください。

(このワザは当然、
検索ボックスを設置しないでフツーに Google を使うときも使えます)

さて、この検索をボックスを使って行うためには、
上のインストラクションページの「ウェブ検索のみ」のスクリプトの中の、

 <input type=text name=q size=31 maxlength=255 value="">

の部分を変えます。value アトリビュートのところに
検索ボックスの初期値を渡せるんですが、いまは空文字列が
入っているので、これを、たとえば

 <input type=text name=q size=31 maxlength=255
  value="検索語 inurl:ajisai.sakura.ne.jp/~dindi">

のようにすれば、検索ボックスに

 [検索語 inurl:ajisai.sakura.ne.jp/~dindi

のような初期値が入ります。ここで実行ボタンを押すとGoogle 検索が走り、
・本文内に「検索語」が
・URL 内に「ajisai.sakura.ne.jp/~dindi」が入っている Web を
検索してくれます。

検索ボックスの中に inurl パラメタが入ってるのが少々ダサいですが、
ま、これでも十分使えます。

さて、これを使って自分のサイトを検索すると、たいてい、

 最も的確な結果を表示するために、上の2件と似たページは除かれています。
 検索結果をすべて表示するには、ここから再検索してください。


といわれてごく一部のページしか検索されません。
すべて自分のサイト内のページだからまあ当然です。
で、上の、ここから再検索してください。という
リンクをたどってみると、検索結果ページの URL に

 ...&filter=0&...

という文字列が入っています。
さっきの2件だけしか検索してくれないページにはこの文字列が入っていなかった。
ということで、上のパラメタを付け加えるには、フリー検索フォームに次の行を加えます。

 <input type=hidden name=filter value="0">

これで、filter という隠しパラメタが CGI 機構に渡され、
値にゼロが入ってフィルタリングを抑制します。

さて、これでまあまあ使える検索フォームができましたが、
やはり検索ボックス内の inurl というのがめざわりです。

現状の検索フォームでは

 <input type=text name=q size=31 maxlength=255 value="検索語 inurl:ajisai.sakura.ne.jp/~dindi">

のようにして、ひとつの CGI パラメタ q に検索語と inurl を渡しています。この value 値を、
インプットボックスの値(検索語)と固定の文字列(inurl)を+で連結した形にできればいいんですが、
JavaScript とか使わないと難しそうですし、Google の無料サービスの範囲を逸脱しそうです。

よく考えたら、Google も検索オプションページを使えば複数の検索語を違うボックスに渡せます。
これを使えば違う CGI パラメタ(さっきの filter のように、
URL 中の、&でつながれた、変数名=値のペア)に inurl を渡せるんじゃなかろうか。
別のパラメタに渡せば、input ボックスは検索語だけにできるのでは。

ということで上の検索オプションページで、

 検索条件
  すべてのキーワードを含む
   [検索語]
  フレーズを含む
   [inurl:ajisai.sakura.ne.jp/~dindi]

にして検索してみました。

検索結果ページの URL を見ると

 http://www.google.co.jp/search?as_q=%E6%A4%9C%E7%B4%A2%E8%AA%9E&num=10&hl=ja&ie=UTF-8&oe=UTF-8&btnG=Google+%E6%A4%9C%E7%B4%A2&as_epq=inurl%3Aajisai.sakura.ne.jp%2F%7Edindi&as_oq=&as_eq=&lr=&as_ft=i&as_filetype=&as_qdr=all&as_occt=any&as_dt=i&as_sitesearch=

のようになっています。
「すべてのキーワードを含む」の部分が as_q、
赤い部分。「検索語」という文字列がUTF-8エンコードされて1バイトずつ %hh になっている)
「すべてのフレーズを含む」の部分が as_epq に
青い部分。inurl文字列が渡っている。コロン、スラッシュ、チルダはエスケープされている)
というCGIパラメータに渡っています。

(上のように日本語はデフォルトで UTF-8 エンコーディングされますので、
 HTML 自体を UTF-8 でエンコードしないと(IE では)正しく動作しないようです。
 あるいは、隠しパラメータでエンコーディングを渡す方法もあるようです)

ということで、検索フォームにさらに

 <input type=hidden name=as_epq value="inurl:ajisai.sakura.ne.jp/~dindi">

のように加えてみます。
これで、「フレーズを含む」に「inurl:ajisai.sakura.ne.jp/~dindi」を渡したのと同じ結果になります。

URL 内では コロン : は %3A、スラッシュ / は %2E、チルダ ~ は %7E のように文字コードでエスケープされていますが、
これは CGI 機構が展開しているので、
フォームの中に "%3A" のように文字列で書くとうまく動きません。
(「%3A」のような文字列そのものを検索してしまう)

これで以下のようなフォームが完成したことになります。
(基本はインストラクションページからのコピペですが、
 上でいじった他にも table タグをやめたり、ちょっといじっています)

<!-- Google --> 注釈。Google コーナーの始まり
<form method=GET action="http://www.google.co.jp/search"、> フォームの始まり。GET メソッドで action アトリビュートの CGI スクリプトを呼び出し
<a href="http://www.google.co.jp/"> Google ロゴをクリックするとジャンプする先を・・・
<img src="http://www.google.com/logos/Logo_40wht.gif"
border="0" alt="Google" align="absmiddle"></a> ・・・Google ロゴにする
<input type=text name=q size=31 maxlength=255 value="文字コード"> 検索語を入れるテキストボックス。q パラメータを渡す
<input type=hidden name=hl value="ja"> hl パラメータ。言語設定
<input type=hidden name=filter value="0"> filter パラメータ。上記参照。似たページをフィルターしない
<input type=hidden name=as_epq value="inurl:ajisai.sakura.ne.jp/~dindi"> as_epq パラメータ。上記参照。inurl で限定サイトを渡す
<input type=submit name=btnG value="本サイト内を Google 検索"> 検索開始ボタン
</form> フォームの終わり
<!-- Google --> 注釈。Google コーナーの終わり

技術上のキモは GET メソッドで CGI を呼び出していることで、
これを使うと実行結果のページの URL の中に&つながりで

 変数名=値

の形で CGI パラメータが見えることです。
あとは検索オプションで好みの検索を繰り返し、
hidden(隠しパラメータ)でオプションを追加していけばいいのではないでしょうか。



このようにして Google を使えば無料で検索エンジンを設置できます。
Google はどうやって儲けているかというと

・このようにして Google の存在を世間に知らしめることができる
 (Google 自体の広告。Google は他の会社に検索エンジンの機構を売っている)

・Google の検索結果の横ちょに広告を出すことができる
 (フリー検索エンジンの使用者は、横ちょの広告を容認しなければならない)

ということです。

自前の検索エンジンを使わずに、Google 検索を使うメリットは、

・少ない知識、プログラム量で実装できる

・自サーバーに負荷を掛けない

一方、デメリットとしては

・クローリング(crawl 水泳の泳ぎ方でもあるがもともと「這う」という意味。
 ここでは Google のような検索エンジンの「ロボット」が
 Web サイトからページをかきあつめて索引化すること)
 によって Google が自分のページを検索インデックスに加えるのに少々時間がかかるので、
 必ずしも最新の検索結果を出すとは限らない。

・イントラネットは検索できない。
 (当たり前・・・でも Google とビジネス契約を結べば可能?)

・クローリングによって世間には隠したい、
 余計なページまで検索されてしまう。

3つめについてですが、これは検索ボックスの有無に関わらず、
誰かが検索エンジンを使ってあなたのページを覗き見している可能性が
もともとあったわけです。
このような問題を回避するにはページの削除というインストラクションを読んでください。
(ただし、すべての検索エンジンがお行儀よく norobot に従うとは限りません。
 たまたま Google はそうしているというだけで、
 どっかの悪の科学者があなたのページを検索しても文句はいえません−−−
 あなたがページを公開したからです。
 もしページをメンバー制にしたければ、何らかの認証を入れることになります。
 お手軽には .htaccess を使うとできますね)

なお、オライリーの「GOOGLE HACKS」という本には
「デベロッパーズ・キー」を取得して Google API を呼び出す
もっと高度な使い方もいろいろ書いていますが、
Google のヘルプと URL をハックするだけでも上記のようにいろいろ試せます。
Amazon もいろいろワザがあるそうです。

Last Update : 2003/12/22 17:40