HOME  »  , , , ,  » 「Google Web APIs (beta)」を使ったサイト内メタ検索を設置しました。【追記有】

「Google Web APIs (beta)」を使ったサイト内メタ検索を設置しました。【追記有】

2005/03/17 | Comments & Trackbacks : 3

とりあえず試してみてください。

いつもお世話になっている「Ogawa::Memoranda」さんで以前見かけて以来、ずっとときめいていた「Google Web APIsを使ったメタサーチ」をやっと検索ページに導入しました。
実際使ってみた感じでは、MovableTypeによるサイト内検索に比べてかなり速度が速く、ヒット数もなかなか、その上結果を出力するページのカスタマイズも超楽勝。おまけに各種検索サイトへのリンク検索出力ページに追加し放題、とかなり素敵な作りとなっております。
MT使いの方なら導入する価値があると思います。

と言う訳で以下自分用の覚え書き。

参考記事 「Ogawa::Memoranda」さん: mt-search.cgiを捨てて簡単メタサーチにしてみよう

ちなみにこの方法はMovable Type 2.X以降(多分) 、PHP4以降(多分:mbstringが必要ですがPHP4の使える大抵のレンタルサーバーは大丈夫)であれば使えるそうです。

導入方法

  1. 検索結果を表示させたいページの大枠を「新しいインデックス・テンプレート」を使ってあらかじめ用意しておく(やり方が分からない場合は「小粋空間」さんのこちらの記事を参考にしてください。)。
  2. こちらのリンクをブラウザで開き「<?php」から「?>」までをコピペし、検索結果を表示させたい場所(blogbodyなど)に貼り付ける。
  3. 「出力ファイル名」を「msearch.php(任意)」とし、このテンプレートを保存・再構築する。
  4. 検索フォームを表示させたい場所に以下のように追加記入する(ソースはお使いの環境で適宜変更してください)。
    <h1 class="title">Google Web APIs (beta) で検索</h1>
    
    <form method="get" action="<$MTBlogURL$>msearch.php">
    <!--<label for="search" accesskey="4">サイト内の検索</label><br />-->
    <input id="search" name="search" size="40" /> <input type="submit" value="検索" />
    </form>
    
  5. SourceForge.net: Project Info - NuSOAP - SOAP Toolkit for PHP」からnusoap-0.69.zipをダウンロード → 解凍しておく。
  6. 解凍したフォルダから「lib/nusoap.php」だけ取り出して、msearch.phpが置かれているディレクトリと同じ場所にFTPソフトなどでアップロードする。
  7. Google Web APIs - Home」の「Create Acount」からGoogleのアカウントを作成する。メールでの承認が終わると32文字くらいのGoogle Web APIs license keyが送られてくるので、これをコピっておく。
    (このライセンスキーを既に持っている場合には改めてアカウントを作成する必要はないそうです。)
  8. msearch.phpのテンプレートを以下のように編集する。
    旧:#define('GOOGLE_SEARCH_KEY', 'Your Google Web APIs license key');
    新:define('GOOGLE_SEARCH_KEY', '[送られてきたライセンスキー]');
  9. テンプレートを保存・再構築すれば完成

※検索ページを新たに追加する方法は元記事をご覧ください。

検索結果を表示させるphp部分ですが、見出し部分のスタイルを設定する場合、タグ中のclass指定などは適用されないようです。
(「<h1 class=”title”>タイトル</h1>」と試しに設定してみたら、思いっきりエラーが出ました。)

【追記】
「$string = “…class=\”title\”…”;」などのようにHTMLに使われる「”」の前に「\」を入れればclass等の属性指定も効いてくるそうです。
よく分からなかったので、私は新たに<h5>を割り当てましたが(苦笑)。

ちなみに微妙にいじった私用のソースはこんな感じです。

<?php
define('CHARSET', '<$MTPublishCharset$>');
define('GOOGLE_SEARCH_WSDL', '<$MTCGIPath$>lib/MT/GoogleSearch.wsdl');
define('GOOGLE_SEARCH_KEY', '[送られてきたライセンスキー]');

function googleSearch($query, $start = 0, $maxResults = 10, $filter = false, $restrict = 'lang_ja', $safeSearch = false, $lr = 'lang_ja') {
require_once('nusoap.php');

$client = new soapclient(GOOGLE_SEARCH_WSDL, true);
$client->soap_defencoding = 'utf-8';
$client->decode_utf8 = false;

$query = mb_convert_encoding($query, 'utf-8', CHARSET);
$params = array('key' => GOOGLE_SEARCH_KEY,
'q' => $query,
'start' => $start,
'maxResults' => $maxResults,
'filter' => $filter,
'restrict' => $restrict,
'safeSearch' => $safeSearch,
'lr' => $lr,
'ie' => 'utf8',
'oe' => 'utf8'
);
return $client->call('doGoogleSearch', $params);
}

$site = '<$MTBlogHost>';
$search = isset($_GET['search']) ? htmlspecialchars(trim($_GET['search'])) : "";

echo <<<EOD
<form method="get" action="{$_SERVER['PHP_SELF']}">

<p><input type="text" size="30" name="search" value="{$search}" /> <input type="submit" value="検索" /></p>

</form>

EOD;
if ($search) {
## Google Search
if (defined('GOOGLE_SEARCH_KEY')) {
$results = googleSearch("$search site:$site");

echo "<h5>Googleのサイト内検索結果:</h5>\n\n";

if (is_array($results['resultElements'])) {
$cnt = $results['estimatedTotalResultsCount'];
echo ($cnt <= 10) ?
"<p>{$cnt}件見つかりました。</p>\n\n" :
"<p>約{$cnt}件見つかりました。上位10件を表示します。</p>\n\n";

echo "<ul>\n";
foreach ($results['resultElements'] as $result) {
$title = $result['title'];
$url = htmlspecialchars($result['URL']);
$snippet = str_replace('<br>', '<br />', $result['snippet']);
$snippet = $snippet ? $snippet : 'snippetが見つかりませんでした。';
$string = "<li><a href=\"$url\">$title</a>\n<blockquote><div>$snippet</div></blockquote></li>\n\n";
echo mb_convert_encoding($string, CHARSET, 'utf-8');
}
echo "</ul>\n\n";
} else {
echo "<p>見つかりませんでした。</p>\n\n";
}
echo "<p><small>[Powered by <a href=\"http://www.google.com/apis/\">Google Web APIs (beta)</a>]</small></p>\n\n";
}

## Meta Search
$enclist = array('utf-8', 'euc-jp', 'shift_jis');
foreach ($enclist as $enc) {
$qstring[$enc] = urlencode(mb_convert_encoding($search, $enc, CHARSET));
}
$cond_site = urlencode("site:$site");
$searray["<h5>「{$search}」をサーチエンジンでサイト内検索:</h5>"] =
array(
array("MSN サーチ (ベータ)",
"http://beta.search.msn.co.jp/results.aspx?q={$qstring['utf-8']}+$cond_site"),
array("MSN サーチ",
"http://search.msn.co.jp/advresults.aspx?q={$qstring['utf-8']}&adv_dom={$site}"),
array("Yahoo! Search",
"http://search.yahoo.com/search?ei=UTF-8&p={$qstring['utf-8']}+$cond_site"),
array("Yahoo!検索",
"http://search.yahoo.co.jp/bin/query?p={$qstring['euc-jp']}+$cond_site"),
array("Google",
"http://www.google.com/search?q={$qstring['utf-8']}+$cond_site")
);
$searray["<h5>「{$search}」をブログフィードサービスで検索:</h5>"] =
array(
array("Bulkfeeds",
"http://bulkfeeds.net/app/search2?q={$qstring['utf-8']}"),
array("FeedBack",
"http://naoya.dyndns.org/feedback/app/search?keyword={$qstring['euc-jp']}"),
array("未来検索 livedoor",
"http://sf.livedoor.com/search?q={$qstring['euc-jp']}")
);
$searray["<h5>「{$search}」を辞書・辞典サービスで検索:</h5>"] =
array(
array("Yahoo!辞書 (国語)",
"http://dic.yahoo.co.jp/bin/dsearch?p={$qstring['euc-jp']}&stype=0&dtype=0"),
array("Yahoo!辞書 (英和・和英)",
"http://dic.yahoo.co.jp/bin/dsearch?p={$qstring['euc-jp']}&stype=0&dtype=1"),
array("livedoor辞書 (国語・新語)",
"http://dic.livedoor.com/search?key={$qstring['euc-jp']}&type=0&kind=0"),
array("livedoor辞書 (英和・和英)",
"http://dic.livedoor.com/search?key={$qstring['euc-jp']}&type=0&kind=1"),
array("Wikipedia日本語版",
"http://ja.wikipedia.org/w/wiki.phtml?search={$qstring['utf-8']}&fulltext=%E6%A4%9C%E7%B4%A2")
);

foreach ($searray as $desc => $selist) {
echo "<h2>{$desc}</h2>\n\n<ul>\n";
foreach ($selist as $se) {
echo "<li><a href=\"{$se[1]}\" title=\"「{$search}」を{$se[0]}で検索\">{$se[0]}</a></li>\n";
}
echo "</ul>\n\n";
}
}
?>

あと理由が全く分からないのですが、「Google Web APIs」を導入しない場合(4.で終わりにするとそうなります)は「MSN Search beta」を使用して検索結果が表示されるはずが、なぜか私の場合「Google Web APIs」を導入するまで正常に動いてくれませんでした(結果が全く出力されない)。
もともと「Google Web APIs」バージョンを使おうと思っていたので一向に構わないのですが、元記事のトラバ先を観察した所、他にも同じような方がいらっしゃるらしく…。
てな訳で、設置終了後きちんとphpが動いてるかの確認をおすすめします。

追記

(o)さんのコメントで謎が解けました!
こちらの記事の通りにやれば「MSN Search beta」を使ったメタサーチ対応になるそうです。

Google Adsense

Comments & Trackbacks : 3

Response from (o)2005 年 3 月 17 日 15時01分

$string = “…”; のなかでclass=”title”とか書きたい場合には、
$string = “…class=\”title\”…”;
こんな感じにHTMLに使われる「”」の前に「\」を入れてみてください。

>「Google Web APIs」を導入しない場合(4.で終わりにするとそうなります)は「MSN Search beta」を使用して検索結果が表示されるはずが、なぜか私の場合「Google Web APIs」を導入するまで正常に動いてくれませんでした(結果が全く出力されない)。

ん? 何も表示されないはずですよ。単に検索サイトへのリンクが生成されるだけです。
MSN Search betaを使うのなら↓で説明しているような感じにする必要があります。
http://as-is.net/blog/archives/000958.html

Response from もそ2005 年 3 月 17 日 15時48分

■(o)さま
早速いろいろと疑問を解いて頂いてありがとうございました。
速攻で記事を編集させていただきました。
いつかこの記事を目に留めてくださった方がきっとこの情報を役立ててくれると思います。

Response from langsam2005 年 6 月 5 日 18時59分

検索ページの導入

 また、カスタマイズしました。    ずいぶん前に晴天さんにコメント欄で「カスタ…