mt-search.cgiを捨てて簡単メタサーチにしてみよう
言うまでもなく標準のmt-search.cgiは無茶苦茶遅いです。CGI起動のオーバーヘッドもありますが、検索をPerlのパターンマッチだけでやっているから遅いのです。パターンマッチと言ってもmt-search.cgiは大した機能を持っているわけではないのですから、素直に「SELECT * FROM mt_entry WHERE entry_text LIKE 'hoge%'」とか何とか適当にやってくれた方が100倍以上速いでしょう。これはもう、mod_perlだとどうこうというレベルではないです。
MT 3.1のPHP APIを使って(多分かなり頑張って拡張して)mt-search.cgiをPHPで書き直してみるというチャレンジもあり得ますが、所詮MySQLでしか使えませんし、たかがサイト内検索ですから労力に見合うリターンが期待できるとは思えません。
そういうわけでか、Google Site Searchを貼り付けている人も多いのですが、私とGoogle Searchの相性が必ずしも良くないのでわざわざ検索窓を設けても、できるのはサイト内検索で(それも万全とは言えず)、むしろページ内のアクセスの良い場所を体よく宣伝に利用されてしまっているのが現実ではないでしょうか。
そういうわけで実際の検索は止めて簡単メタサーチポータルにしてやれ、というのがこのエントリの主旨です。Google Web APIsを使ってホントにメタサーチすればいいじゃんと思ったユーは正しいです。lolipopのPEARにSOAPとSOAP_Googleが入ってからとも思いましたが、Google Web APIsを使いたい場合のことも考慮しています。
以下はレシピです。
用意する材料
- Movable Type 2.X以降(多分)
- PHP4以降(多分)、mbstringが必要ですがPHP4の使える大抵のレンタルサーバーは大丈夫でしょう。
- msearch.phps
- SourceForge.net: Project Info - NuSOAP - SOAP Toolkit for PHP (お好みで)
作り方
- まず、msearch.phpsをブラウザで開いておきます(ファイルに保存するとマークアップされたHTMLファイルとして保存されてしまします)。
- 次にインデックス・テンプレートを一つ作ります。テンプレートの名前はお好みで、出力ファイル名はmsearch.php(拡張子はphpsではなくphp)としてください。別に他の名前でも構いません。
- 1. を「テンプレートの中身」にコピペした後、保存と再構築をしてください。
- 検索フォームのあるテンプレート(例えばメインページのテンプレート)の該当部分を以下のように編集します。
<h2>検索</h2> <div class="link-note">
<form method="get" action="<$MTCGIPath$><$MTSearchScript$>"><form method="get" action="<$MTBlogURL$>msearch.php"><input type="hidden" name="IncludeBlogs" value="<$MTBlogID$>" /><label for="search" accesskey="4">サイト内の検索</label><br /> <input id="search" name="search" size="20" /><br /> <input type="submit" value="検索" /> </form> </div> - 保存後、再構築すれば完成です。このページの一番上に完成品の見本があります。
また、お好みでGoogle Web APIsを使った検索結果を表示に含めることができます。今私のサイトはグルグル様に嫌われていてインデックスに入っていないみたいなので、真価のほどがよく分かりません。
- まず、SourceForge.net: Project Info - NuSOAP - SOAP Toolkit for PHPからnusoap-0.67.zipをダウンロードしてください。
- ダウンロードしたZIPファイルを展開するとたくさんファイルが作られますが、libの中のnusoap.phpというファイルだけ、msearch.phpが作られるディレクトリにFTPなどを使ってアップロードしてください。
- 次にGoogle Web APIs - Homeの「Create Acount」でアカウントを作成します。メールでの承認が終わると32文字くらいのGoogle Web APIs license keyが送られてきます。このライセンスキーを既に持っている場合には改めてアカウントを作成する必要はありません。
- msearch.phpのテンプレートを編集してライセンスキーを設定します。28行目あたりを以下のように変更します。
#define('GOOGLE_SEARCH_KEY', 'Your Google Web APIs license key');define('GOOGLE_SEARCH_KEY', '[送られてきたライセンスキー]'); - 保存後、再構築すれば完成です。きっとうまく行きます。祈りましょう。
よりおいしい作り方
通常のテンプレートとほとんど同じですから、Movable Typeのタグを使って自由にカスタマイズすることができます。どのように変更しても「<?php」から「?>」までを変更しない限り正常に動作するはずです。
検索サイトを追加したい場合には、「<?php」から「?>」の中で定義している$searrayという配列を変更する必要があります。例えば「その他」というカテゴリーを作って、All AboutとYahoo!知恵袋の検索機能を使いたい場合、以下のような配列を定義することになります。まあ、見よう見まねでいろいろ試してみると分かってくると思います。
$searray["その他:"] =
array(
array("All About",
"http://allabout.co.jp/sitesearch.htm?qs={$qstring['shift_jis']}"),
array("Yahoo!知恵袋",
"http://ksearch.yahoo.co.jp/search/searchresultlist.php?str={$qstring['euc-jp']}")
);
このエントリーのトラックバックURL: http://as-is.net/mt/mt-tb.cgi/204
こちらの記事を参考にして検索窓を設置させて頂きました。
簡単でわかりやすかったので助かりました。ありがとうございます。
で、一つ質問なのですが、デフォルトで10件出力される件数を変えるには、どこを書き替えればいいのでしょうか?
それらしき所をいじってみたのですがエラーが出てしまって…。
素人なので、どこがダメなのかも分からないので、よろしければ教えて頂けるとうれしいです。
Google Web APIsでは一度に10件までしか取得できません。プログラムを変更すれば10件ずつ複数回に分けて取得することはできると思うのですが、それだと時間がかかってしまうかな。
ほー、なるほどなるほど。
そう言う理由だったんですね。
早速教えて頂いてありがとうございました