全文検索システム:Fess 検索フォーム作成
前回CentOSにてFessのインストールを行いました。
そこでデフォルトの検索フォームを利用できるのですが、自身のサイトに検索フォームだけ追加したい場合の説明を行います。
参考にしたサイトは本家のここです。
http://fess.codelibs.org/ja/articles/article-4.html
必要になるのは、検索フォームを構成するhtml(今回はそのままindex.htmlとします)とJSONで検索結果を表示するjsファイル(今回はfess.js)です。
index.htmlの内容
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <title>検索サイト</title> </head> <body> <div id="header"> <form id="searchForm"> <input id="searchQuery" type="text" name="query" size="30"/> <input id="searchButton" type="submit" value="検索"/> <input id="searchStart" type="hidden" name="start" value="0"/> <input id="searchNum" type="hidden" name="num" value="20"/> </form> </div> <div id="subheader"></div> <div id="result"></div> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script> <script type="text/javascript" src="fess.js"></script> </body> </html>
fess.jsの内容
$(function(){ // (1) Fess の URL var baseUrl = "http://search.n2sm.co.jp/json?callback=?&query="; // (2) 検索ボタンのjQueryオブジェクト var $searchButton = $('#searchButton'); // (3) 検索処理関数 var doSearch = function(event){ // (4) 表示開始位置、表示件数の取得 var start = parseInt($('#searchStart').val()), num = parseInt($('#searchNum').val()); // 表示開始位置のチェック if(start < 0) { start = 0; } // 表示件数のチェック if(num < 1 || num > 100) { num = 20; } // (5) 表示ページ情報の取得 switch(event.data.navi) { case -1: // 前のページの場合 start -= num; break; case 1: // 次のページの場合 start += num; break; default: case 0: start = 0; break; } // 検索フィールドの値をトリムして格納 var searchQuery = $.trim($('#searchQuery').val()); // (6) 検索フォームが空文字チェック if(searchQuery.length != 0) { var urlBuf = []; // (7) 検索ボタンを無効にする $searchButton.attr('disabled', true); // (8) URL の構築 urlBuf.push(baseUrl, encodeURIComponent(searchQuery), '&start=', start, '&num=', num); // (9) 検索リクエスト送信 $.ajax({ url: urlBuf.join(""), dataType: 'jsonp', success: function(data) { // 検索結果処理 var dataResponse = data.response; // (10) ステータスチェック if(dataResponse.status != 0) { alert("検索中に問題が発生しました。管理者にご相談ください。"); return; } var $subheader = $('#subheader'), $result = $('#result'), recordCount = dataResponse.recordCount, offset = 0, buf = []; if(recordCount == 0) { // (11) 検索結果がない場合 // サブヘッダー領域に出力 $subheader[0].innerHTML = ""; // 結果領域に出力 buf.push("<b>", dataResponse.query, "</b>に一致する情報は見つかりませんでした。"); $result[0].innerHTML = buf.join(""); } else { // (12) 検索にヒットした場合 var pageNumber = dataResponse.pageNumber, pageSize = dataResponse.pageSize, pageCount = dataResponse.pageCount, startRange = (pageNumber - 1) * pageSize + 1, endRange = pageNumber * pageSize, i = 0, max; offset = startRange - 1; // (13) サブヘッダーに出力 buf.push("<b>", dataResponse.query, "</b> の検索結果 ", recordCount, " 件中 ", startRange, " - ", endRange, " 件目 (", dataResponse.execTime, " 秒)"); $subheader[0].innerHTML = buf.join(""); // 検索結果領域のクリア $result.empty(); // (14) 検索結果の出力 var $resultBody = $("<ol/>"); var results = dataResponse.result; for(i = 0, max = results.length; i < max; i++) { buf = []; buf.push('<li><h3 class="title">', '<a href="', results[i].urlLink, '">', results[i].contentTitle, '</a></h3><div class="body">', results[i].contentDescription, '<br/><cite>', results[i].site, '</cite></div></li>'); $(buf.join("")).appendTo($resultBody); } $resultBody.appendTo($result); // (15) ページ番号情報の出力 buf = []; buf.push('<div id="pageInfo">', pageNumber, 'ページ目<br/>'); if(pageNumber > 1) { // 前のページへのリンク buf.push('<a id="prevPageLink" href="#"><<前ページへ</a> '); } if(pageNumber < pageCount) { // 次のページへのリンク buf.push('<a id="nextPageLink" href="#">次ページへ>></a>'); } buf.push('</div>'); $(buf.join("")).appendTo($result); } // (16) ページ情報の更新 $('#searchStart').val(offset); $('#searchNum').val(num); // (17) ページ表示を上部に移動 $(document).scrollTop(0); }, complete: function() { // (18) 検索ボタンを有効にする $searchButton.attr('disabled', false); } }); } // (19) サブミットしないので false を返す return false; }; // (20) 検索入力欄でEnterキーが押されたときの処理 $('#searchForm').submit({navi:0}, doSearch); // (21) 前ページリンクが押されたときの処理 $('#result').delegate("#prevPageLink", "click", {navi:-1}, doSearch) // (22) 次ページリンクが押されたときの処理 .delegate("#nextPageLink", "click", {navi:1}, doSearch); });
Fessはjavaで動作し、デフォルトはhttp://example.com:8080/fess/というアドレスになりますので、fess.js内に記述されているURLを変更します。
var baseUrl = "http://example.com:8080/fess/json?callback=?&query=";
本家サイトには以下の様に、JSONで利用する場合は、callback=?は指定しなくとも良いらしいので、省いても構いません。
外部サーバーから検索結果のJSONデータを取得するため、JSONPを利用しています。 JSONPでなく、JSONを利用する場合は、callback=?は指定する必要はありません。
検索結果の表示を変更したい場合は、検索結果の出力部分を変更します。
buf.push('<li><h3 class="title">', '<a href="', results[i].urlLink, '">', results[i].contentTitle, '</a></h3><div class="body">', results[i].contentDescription, '<br/><cite>', results[i].site, '</cite></div></li>');
細かい説明は本家サイトを確認していただきたいのですが、検索結果の表示内容を変更したい場合は、以下のページを参考にしてください。
最終更新日時などを検索結果などに追加することが可能です。
ちなみに、今回設置した際、contentTitleが正常に反応してくれなかったので、titleに変更し、ついでに最終更新日時を追加しました。
以下の様な記述です。
buf.push('<li><h3 class="title">', '<a href="', results[i].urlLink, '" >', results[i].title, '</a></h3><div class="body">', results[i].contentDescription, '<br/><cite>', results[i].site, '</cite></div>最終更新日時:', results[i].lastModified, '</li>');
このままでも検索結果は出ますが、何も装飾されていないので、cssなどで調整してみてください。
ディスカッション
コメント一覧
まだ、コメントがありません