TOPサーバ構築・運用> Yahoo!オークションの商品検索プログラム
JBoss EAP+Luceneによる全文検索システム
JBoss EAP+Luceneによる全文検索システム

第2回:検索プログラムを試してみよう!

著者:ロンウイット  関口 宏司   2007/11/1
1   2  3  次のページ
Yahoo!オークションの商品検索プログラム

   本連載ではJBoss Enterprise Middlewareを使った「エンタープライズレベルの検索サービス」を提供するWebアプリケーションの作成を行う。検索エンジンとしてオープンソースソフトウェア(以下、OSS)のApache Lucene(以下、Lucene:ルシーン)を使用する。

   前回「第1回:OSS検索エンジンLuceneとは」では、検索エンジンLuceneについて詳しく解説した。今回はいよいよ実際の検索プログラムを作成していく。

   ここでは簡単なサンプルプログラムとするため、JBoss Enterprise Application Platform(以下、JBoss EAP)のJBoss Application Server上で動作するJSPプログラムを作成する。JBoss EAPのインストールについては以下記事を参照していただきたい。
JBoss Enterprise Application Platformの全貌
第2回:JBoss Enterprise Application Platformを操作する

   また、検索プログラムの動作確認のために必要となるテキストデータは、「Yahoo!オークション」に出品されている商品データを使用する。なお、本連載ではプログラムのソースコードの一部を取り上げながら解説していくが、完全なプログラムは以下のWebサイトからダウンロードできる。

Yahoo!オークション検索アプリケーションのダウンロードページ
http://www.rondhuit.com/download.html

   ダウンロードしたZIPファイルには検索プログラムの動作確認ができるように、数件の商品データサンプルが含まれている。使い方はZIPファイルの中にある「readme.txt」を参照していただきたい。

   ファイルサイズの問題があるため、ZIPファイルには商品データを数件しか入れていないが、Yahoo!オークションには常時1千数百万件もの商品が出品されているようだ。

   Yahoo!オークションの商品データは、Yahoo!デベロッパーネットワークで提供されているWebサービスを使って取得することができる。時間とディスク容量に余裕のある方は、商品データを取得するクローラ(インターネットなどから情報収集するプログラムのこと。ロボットなどとも呼ばれる)を書いて大量の商品データを収集し、Luceneのインデックスに登録することもできるので、挑戦してみてもよいだろう。

Yahoo!デベロッパーネットワーク Yahoo!オークションWebサービス
http://developer.yahoo.co.jp/auctions/


Luceneの基本クラス

   Luceneのプログラムで使用される基本クラスを表1に示す。

役割 クラス名 概要
テキスト文字列の分析 Analyzer テキスト文字列から「単語」を切り出すためにLuceneフレームワークから呼び出される。
インデックスの作成 IndexWriter addDocument()メソッドでインデックスに文書を追加する。
Document 文書を表現するクラス。文書を構成するフィールドをadd()メソッドで追加する。
Field フィールド。Ducumentの構成要素。
検索 QueryParser 検索式の文字列を解析してQueryオブジェクトを生成する。
Query 検索質問を表す抽象クラス。
IndexSearcher search()メソッドにQueryを渡して検索を実行し、Hitsのオブジェクトを得る。
Hits 検索結果のオブジェクトで、Documentとそのスコアのペアのリストを保持する。

表1:基本クラス


インデックスの作成プログラム

   商品データをLuceneのインデックスに登録するプログラムは次のようになる。

final String INDEX = // インデックスへのパス
IndexWriter writer = new IndexWriter( INDEX,
new CJKAnalyzer() );

// 登録する商品の分だけループする
while( … ){
   // 1つのDocumentで1つの商品を表す
   Document doc = new Document();
   // 商品を表すフィールド分だけ以下の行を繰り返す
   doc.add( new Field( … ) );
   // 商品をインデックスに登録する
   writer.addDocument( doc );
}

writer.close();

   商品情報をインデックスに登録(索引付け)するには、最初にIndexWriterのオブジェクトを取得してインデックスを書き込みオープンにする必要がある。それには、インデックスへのパス情報と使用するAnalyzerを指定してIndexWriterのコンストラクタを呼び出せばよい。そして、検索対象となる文書(ここでは商品データ)であるDocumentオブジェクトをIndexWriterのaddDocument()メソッドでインデックスに追加する。

   この処理を商品の数だけ繰り返してインデックスに登録していくのである。なお、商品データをDocumentで表現する際に、商品データの属性(商品名、価格、説明など)は、それぞれのFieldオブジェクトを作成してDocumentにadd()メソッドで追加していく。

1   2  3  次のページ


株式会社ロンウイット 関口 宏司
著者プロフィール
株式会社ロンウイット  関口 宏司
代表取締役社長
数社のITベンダー勤務を経て、2006年5月にロンウイット社を設立。オープンソースの全文検索エンジンLuceneとSolrを企業システムに導入する支援事業を展開している。「Apache Lucene入門」(技術評論社)はじめ著書多数。

ロンウイット:http://www.rondhuit.com/
ブログ:http://lucene.jugem.jp/


INDEX
第2回:検索プログラムを試してみよう!
Yahoo!オークションの商品検索プログラム
  検索プログラム
  「次ページ」「前ページ」リンクの生成について