検索の行い方
次に検索の行い方について説明します。検索はZend_Search_Luceneのfind
メソッドで行いますが、ここではどのような形で検索クエリを渡し、得られた結果の中身をどのように見るのかについて説明します。
クエリの作成
リスト1ではクエリは文字列で渡していましたが、実はこれは多少省略した形になっています。Zend_Search_Luceneのfind
メソッドは、文字列を与えられたら内部でZend_Search_Lucene_Search_QueryParserの静的メソッドparseを呼び出して、そこで得られるクエリを実行しています。省略していない形をリスト7に示します。
//リスト1での書き方 $hits = $index->find('Test'); //上は、実は下の処理と同じ $query = Zend_Search_Lucene_Search_QueryParser::parse('Test'); $hits = $index->find($query);
このように、Zend_Search_Luceneのfind
メソッドは、文字列以外にZend_Search_Lucene_Search_Queryのインスタンスも受け付けます。プログラム的にクエリを作成する場合には文字列ではなく、このZend_Search_Lucene_Search_QueryParserのインスタンスの形でクエリを作成するのが良いでしょうが、今回はとりあえず文字列としてクエリを作成する際の基本的な書き方について説明します。
(1)単語を探す
単語を探す場合には、単純にその単語をクエリとして渡します。例えば「CodeZine」という単語を含む文書を探したい場合には次のようにします。
$index->find('CodeZine');
(2)フィールドを指定
フィールドを指定して探す場合には、「フィールド名:」という修飾をします。例えばフィールド「location」に「Here」という単語を含む文書を探したい場合には次のようにします。
$index->find('location:Here');
(3)複数の条件
複数の条件を列挙して演算子でつなげることができます。使える演算子は「AND」「OR」「NOT」です。例えば「Here」と「CodeZine」を含む文章を探したい場合には次のようにします。
$index->find('Here AND CodeZine');
(4)ワイルドカード
「?」や「*」のようなワイルドカードも利用できます。「?」は任意の一文字に「*」は任意の文字列に対応します。次の例は、例えば「CodeZine」「Cider」「Cade0000」などに合致します。
$index->find('C?de*');
(5)範囲
範囲を表現したい場合には「[(ここから) TO (ここまで)]」 や「{(ここより上) TO (ここ未満)}」のように表現します(「[]」は端を含みますが「{}」は端を含みません)。この比較は辞書順に行われるので注意してください。例えば 2009-01-01 から 2009-12-31の間の文字列を含む文書を調べたい場合には次のようにします:
$index->find('[2009-01-01 TO 2009-12-31]');
これらを合わせることもできます。
$index->find('date:([2009-01-01 TO 2009-12-31]) AND location:Here OR Code*');
検索の結果の取得
検索を実行すると、結果はZend_Search_Lucene_Search_QueryHitの配列として返ってきます。それぞれのZend_Search_Lucene_Seach_QueryHitには検索に合致した文書のスコアや索引内でのIDなどが返されます。
分類 | メンバ名 | 引数 | 説明 |
プロパティ | $id | (なし) | 索引内でのID。 |
$score | (なし) | 検索のスコア。 | |
インスタンスメソッド | __get | $offset | $(QueryHitのインスタンス)->(フィールド名)という形式で合致した文書のフィールドにアクセスできる。 |
getDocument | (なし) | 合致した文書を返す。 | |
getIndex | (なし) | 索引内でのIDを返す。 |
おわりに
今回はテキスト検索エンジンのZend_Search_Luceneモジュールの基本的な紹介をしました。索引の作成も検索の実行も手軽にできることが理解いただければ嬉しいです。
次回は、Zend_Search_Luceneについて、もう少し詳細に紹介します。具体的には細かいクエリの作成方法やZend_Search_Luceneの内部でどのようにテキストを解析しているのか、などについて扱う予定です。
また、Apache Luceneとの連携についても説明する予定です。Apache LuceneではOffice 2003以前のファイルや、日本語を含むファイルから索引を作成することができるため、Apache Luceneで索引を作成し、Zend_Search_Luceneから検索を行うといった利用方法も考えられます。