上記のプログラムを実行してインデックスが作成できたら、次に商品検索を行うJSPを作成する。JSPの主要なコードを以下に示す。
<p><b>Yahoo! オークション 商品検索</b></p>
<form action="search.jsp" method="GET">
<input type="text" name="q"/><input type="submit" value="検索"/>
</form>
<%
request.setCharacterEncoding( "UTF-8" );
String q = request.getParameter( "q" );
if( q == null || q.length() == 0 ) return;
%>
検索式 = [ <b><%=q%></b> ]<br><br>
<%
QueryParser parser = new QueryParser( FIELD, analyzer );
Query query = parser.parse( q );
Hits hits = searcher.search( query );
int len = hits.length();
%>
ヒット件数 = <b><%=len%></b> 件<br><br>
<%
if( len == 0 ) return;
%>
<table border="1" cellspacing="0" cellpadding="2">
<% for( int i = 0; i < len && i < PAGE_MAX; i++ ){
Document doc = hits.doc( i );
float score = hits.score( i );
%>
<tr>
<td><%= i + 1 %></td>
<td><%= score %></td>
<td><%= doc.get( "title" ) %></td>
</tr>
<tr>
<td colspan="3"><%= getSummary( query, doc.get( FIELD ) ) %></td>
</tr>
<% } %>
</table>
HTMLのテキストボックスに入力された検索式は、GETパラメータ「q」にセットされてサーバに送られる。サーバは「q」から検索式を取得し、QueryParserクラスのparse()メソッドで検索式を解析してQueryオブジェクトを得る。
そしてそのQueryオブジェクトをIndexSearcherクラスのsearch()メソッドの引数に渡すと検索が実行され、検索結果としてHitsのオブジェクトが得られる。Hitsから検索にヒットしたDocument(商品データ)やそのスコアを取得してHTMLのテーブル要素として表示している。
なお、上記リストのgetSummary()は検索結果文書の要約文を取得するためのメソッドで、Luceneのcontribで提供されているHighlighterツールを使用して次のように実装されている。
private String getSummary( Query query, String text ) throws IOException {
Scorer scorer = new QueryScorer( query, FIELD );
Highlighter hl = new Highlighter( scorer );
String fragment = hl.getBestFragment( analyzer, FIELD, text );
return fragment == null ? "" : fragment;
}
このJSPを実行した様子を図1に示す。

図1:検索結果の表示 (画像をクリックすると別ウィンドウに拡大図を表示します)
検索結果として、商品のタイトルと検索キーワード(「扇風機」)が強調表示された商品説明の要約文がスコアと共に表示されているのがわかるだろう。
|