なんとなくGoogleを利用したサイト内検索を変更したくなったので、MSN Searchを利用して作ってみました(タイトルと違う)。結局はタイトルの通り、Yahoo! Search Web Servicesを利用したもので作り上げたわけですが。

MSN SearchはWeb Serviceとして開発者向けに何かを公開しているわけではないのですが、検索結果のRSSフィード(RSS 2.0)を提供をしています。そのRSSフィードへのアクセスは至極単純で、format=rssを通常の検索結果のページのURLに追加するだけです(例: rss site:hail2u.net)。なので、RSSをHTMLに変換するようなCGIで比較的簡単にサイト内検索を構築できたりします。実際にLWP::SimpleXML::RSSを利用したものはものの数分で作れました。

ただ、検索結果のRSSフィードには、

Copyright © 2005 Microsoft. All rights reserved. These XML results may not be used, reproduced or transmitted in any manner or for any purpose other than rendering MSN Search results within an RSS aggregator for your personal, non-commercial use. Any other use of these results requires express written permission from Microsoft Corporation. By accessing this web page or using these results in any manner whatsoever, you agree to be bound by the foregoing restrictions.

と記述されているので、いわゆるフィード・リーダー以外で利用するには、Microsoftからきちんとした許可証を頂かなくてはならないっぽい。

てなわけでYahoo! Search Web Servicesでやってみたわけですよ。

Yahoo! Search Web Servicesは、

http://api.search.yahoo.com/{ServiceName}/{ServiceVersion}}/{ServiceMethod}

というURLにパラメータで細かい指定をし、そのURLをGETするとXMLで検索結果が返ってくるというWeb Serviceなので、作業の推移は、

  1. URLを作成
  2. URLにGETをかける
  3. 返ってきたXMLをパース
  4. 出力

と言う感じになります。つまりURI+LWP::Simple+XML::Simpleという組み合わせで扱えるもの。Amazon Web ServicesのXML over HTTPとほとんど同じ感覚で扱えるってわけですね。

実際にはYahoo! Search Web ServicesのSDKにYahoo::Searchという、上記推移だと1~3をやってくれるモジュールが含まれており、単純に作れる・・・のですが、サイト内検索などの限定した利用の場合はURI+LWP::Simple+XML::Simpleを使った方が把握しやすい気がする。リクエストが不正な場合などはステータス・コードで拾えるので、エラー時に返されるXMLは意識しなくて良いっぽい感じですし(気を付けるのは検索結果が0件の場合くらい)。

完成はしたもののあまり使い勝手の良いものにはならなかったので、まだ採用はしていません。流行りのLiveSearch系(xmlHttpRequestによるページ遷移の無い検索)で実装しようかなとかくだらないことばかり考えてたりとか。