Google Custom Search EngineをCustomしてみたよ:前編

一年近く前にGoogleから発表された、
Google Custom Search
- Site search and more
っていうサービスを知っていますか*1CNETの日本語記事いわく、Google Custom Search Engine(以降Google CSE)の特徴の一つとして、

このエンジンは、キーワードや、検索インデックスに組み込みたいサイトを選択することで容易にカスタマイズできるようになっている。ユーザーはピックアップしたサイトのみを検索対象にしたり、あるいはこれらのサイトを優先的に検索したりするなどの設定を施すことができる。逆に、ピックアップしたサイトを検索の対象から外すことも可能だ。

グーグル、カスタム検索の構築サービス「Google Custom Search Engine」を発表 - CNET Japan

となっています。


要するに、目的特化型検索エンジンが作れるということです。料理のことについて知りたいなら、そういうサイトだけGoogle CSEに登録しておけば他の余計なサイトまで引っ張ってこないということ。うまい活用事例として、人力検索はてな質問・疑問に答えるQ&AサイトOKWaveに代表される質問系サイトをまとめて検索できる横断検索ドットコムがあります。


私は、livedoor Reader(LDR)で購読しているサイトを登録して、自分が読んだサイトのみ検索対象となるような検索エンジンを作っています。やっぱり、一度でも目を通したことがあるサイトのほうが、いろいろ検索しなおす際にも早く見つけることができるのでね。




さて、ここからが本題。


LDRのサイトを対象にするのはいいのですが、Google CSEとの同期機能がないんですよ。例えば、LDRに新たなサイトを登録したり逆にサイトを購読対象から外したりしたら、手動でGoogle CSEの方を修正しなおしにいかないといけなかったのですよね。さすがに、毎回これは面倒なので、どうにかならないもんかと。


で、Google CSEには検索対象となるサイトを登録する機能の一つとして、OPML形式でのインポートがあります。で、ちょうどいいことに、livedoor ReaderOPML出力に対応しているので、これを自動で「livedoor ReaderGoogle CSE」とするようなスクリプトを書いてやれば手間が減るかなと。


流れとしては、

  1. LDRからOPMLエクスポートして、一時ファイルに保存
  2. Google CSEに登録されている検索対象サイトを全消去
  3. 一時ファイルをGoogle CSEにsubmit
  4. 一時ファイル消去

という、至ってシンプルなものです。


まぁ、3,4時間あればちゃちゃっと作れるかなと。…と思ったのが間違いでした。ふたを開けてみれば、かかった時間は13:05!しかも、実際に手を動かしてる時間だけでなく、当然頭の中で検証している時間もありますが、こっちは記録してないのでトータル時間はもっと増えます。見積もりの甘さに…orz


もちろん、今まで培ってきた技術だけでやれたなら3時間程度でできたのでしょうが、新しいことにチャレンジしようとしたり今ある知識が使えなかったりで、思いのほか大変だったんですよね。


実際に今回新しくやったことは、以下。

このうち、一番最後のやつは当初は使う予定はありませんでした。と言うのは、PerlにはXML::Simpleという扱いやすいモジュールがあるのですが、これが今回の要件にマッチしなかったので仕方なくXML::LibXMLを使用することに。



長くなったので、実際のソースコードは後編に。

*1:確か、最初発表されたときはGoogle Co-opだったような?何の略称だったかも忘れましたが、いつの間にか名前も変わっているみたい。