古い記事
ランダムジャンプ
新しい記事
今回の YahooHacks は、関連検索ワード API を使った、
奇をてらわない普通のハックです。
(一時的にデモを置いておきます。そのうち消えます。ご了承ください。
http://chalow.net/misc/yahoohacks-samp/hack_webunit.cgi)

使用している Web API の提供が終了となったため、現在動作しません。ご了承ください。



■■■関連検索ワードAPIで検索キーを拡張する

「Yahoo!検索 - キーワード入力補助」(http://assist.search.yahoo.co.jp/)
では、入力した検索キーと関連する検索キーワードが表示され、
検索の手助けをしてくれます。

画像

YDN には、このような関連キーワードを取り出す API もあります。
それが「関連検索ワードWebサービス」です。

- Yahoo!デベロッパーネットワーク - 関連検索ワード
  http://developer.yahoo.co.jp/search/webunit/V1/webunitSearch.html

ということで、関連検索ワードWebサービスを使って、
検索キーを拡張しながら検索できるサンプル CGI を作ってみました。

■コード

受け取った検索キーでまず関連検索ワードを API 経由で取得します。
その後、ウェブ検索 API 経由で普通に検索します。

#!/usr/bin/perl -T
use strict;
use warnings;
use Encode;
use CGI;
use LWP::Simple;
use XML::Simple;
use HTML::Template;
use URI::Escape;
binmode STDOUT, ":utf8";

my $q = new CGI;
my $key = $q->param('key') || "";

my $wu_ref = yapi_search({type => "unit", key => $key});
my @wu = map {{'String' => $_}} @$wu_ref; # for HTML::Template
my $ws_ref = yapi_search({type => "web", key => $key});

my $template = join("", <DATA>);
my $t = HTML::Template->new(scalarref => \$template,
                            die_on_bad_params => 0);
$t->param(key => decode('utf-8', $key));
$t->param(results => $ws_ref);
$t->param(webunits => \@wu);

print $q->header(-charset => 'UTF-8'), $t->output();

sub yapi_search {
    my ($args_ref) = @_;
    my $key = $args_ref->{key};
    my $num = $args_ref->{num} || 10;
    my $type = $args_ref->{type} || "web";

    return [] unless $key;
    my $ec = URI::Escape::uri_escape($key);
    my %TYPE_TABLE = 
        ("web" => "WebSearchService/V1/webSearch", 
         "image" => "ImageSearchService/V1/imageSearch", 
         "video" => "VideoSearchService/V1/videoSearch", 
         "unit" => "AssistSearchService/V1/webunitSearch");
    my $url = "http://search.yahooapis.jp/$TYPE_TABLE{$type}"
        ."?appid=YahooDemo&query=$ec&results=$num";
    my $yahoo_response = get($url);
    my $xmlsimple = XML::Simple->new(ForceArray => [ 'Result' ]);
    my $yahoo_xml = $xmlsimple->XMLin($yahoo_response);
    return $yahoo_xml->{Result};
}

__DATA__
<html lang="ja">
<head>
<title>Assist Search</title>
</head>
<body>
<h1>Assist Search</h1>
<form method="get">
<input type="text" name="key" value="<TMPL_VAR name=key>">
<input type="submit" value="search">
</form>
<TMPL_IF name=webunits>
<form method="get">
<select name="key">
<TMPL_LOOP name=webunits>
<option value="<TMPL_VAR name=String>"><TMPL_VAR name=String>
</TMPL_LOOP>
</select>
<input type="submit" value="search">
</form>
</TMPL_IF>
<h2>Search Results</h2>
<TMPL_LOOP name=results>
<h3><a href="<TMPL_VAR name=Url>"><TMPL_VAR name=Title></a></h3>
<p><TMPL_VAR name=Summary></p>
</TMPL_LOOP>
</body>
</html>

■Hack の実行

そのままWebサーバに置けば動作するはずです。
まず「ブログ」「ウェブ」などの一般的な検索キーを入力します。
すると検索結果と同時にフォームにプルダウン式で関連検索ワードが
表示されます。そこから選んでさらに検索できます。

検索実行例を下図に示します。

画像



参考ページ:
- Yahoo!デベロッパーネットワーク (YDN)
  http://developer.yahoo.co.jp/
- Yahoo!検索 - キーワード入力補助
  http://assist.search.yahoo.co.jp/

関連書籍:
- Yahoo! Hacks