サイト内検索ネタその2(3回に渡ってといいつつもうくじけそう。。。)
Google カスタム検索もあるけど、あえてGoogle AJAX Search APIを使ってサイト内検索を実現してみた。
phpで書くとおおよそ以下のようなコードになる。
<?php
$GOOGLE_API_KEY = "Your Api KEY";
$q = @$_REQUEST["q"];
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>Search</title>
<link rel="stylesheet" type="text/css" charset="utf-8" href="http://www.google.com/uds/css/gsearch.css"/>
<style type="text/css">.gsc-control { width: 100%; }</style>
</head>
<body>
<div id="searchForm">Loading...</div>
<table><tr><td>
<div id="searchContent"><div id="searchResults">Loading...</div></div>
</td></tr></table>
<script src="http://www.google.com/uds/api?file=uds.js&v=1.0&key=<?php echo $GOOGLE_API_KEY ?>" type="text/javascript"></script>
<script language="Javascript" type="text/javascript">
//<![CDATA[
function initSearchControl() {
var config = {
label: 'kwLabs',
siteRestriction: 'labs.makotokw.com',
keyword: '<?php echo htmlspecialchars($q) ?>',
applySearchFormEl: 'searchForm',
applySearchResultsEl: 'searchResults'
}
var sc = new GSearchControl();
var drawOptions = new GdrawOptions();
drawOptions.setSearchFormRoot(document.getElementById(config.applySearchFormEl));
var wsopt = new GsearcherOptions();
wsopt.setExpandMode(GSearchControl.EXPAND_MODE_OPEN);
var gs = new GwebSearch();
gs.setUserDefinedLabel(config.label);
gs.setSiteRestriction(config.siteRestriction);
sc.addSearcher(gs,wsopt);
sc.draw(document.getElementById(config.applySearchResultsEl), drawOptions);
sc.execute(config.keyword);
}
GSearch.setOnLoadCallback(initSearchControl);
//]]>
</script>
</body>
</html>
たぶん、GwebSearchを使えば普通に検索だけできると思う。が、Formや検索結果の表示などの機能もAPIで用意されていてここではGSearchControlを使ってみた。
“q”パラメータを受けてそのままjavascriptでGSearchControl.execute
を呼び出すことで、formからのPOST(GET)にも対応できる。
PHPの$GOOGLE_API_KEY
のところと、javascrptのvar config
の中を少し変えれば他のサイトでも流用できると思われる。実際PHPではたいしたことはやってないので他の言語の移植も簡単なはず。