インデックスを検索するには 2 通りの方法があります。 クエリパーサを使用して文字列からクエリを作成する方法と、 Zend_search_Lucene API を使用して独自のクエリを作成する方法です。
提供されているクエリパーサを使用する前に、以下の点を考慮してください。
どちらの方法を使用したとしても、インデックスを検索する API メソッドは同じです。
<?php require_once('Zend/Search/Lucene.php'); $index = new Zend_Search_Lucene('/data/my_index'); $index->find($query); ?>
Zend_Search_Lucene::find()
メソッドは、
入力の型を自動的に判別し、クエリパーサを使用して文字列から
Zend_Search_Lucene_Search_Query オブジェクトを作成します。
重要な点として注意すべきなのは、find()
が大文字小文字を区別するということです。デフォルトでは、
LuceneIndexCreation.jar はすべてのドキュメントを小文字に変換します。
コマンドライン引数により、この機能を無効にすることができます
(何も引数を指定せずに LuceneIndexCreation.jar とタイプすれば、
ヘルプが得られます)。find()
に渡すテキストは、
インデックスに一致しなければなりません。
インデックスが小文字に変換されているのなら、
find()
に指定するテキストは strtolower()
しておかなければいけません。そうしないと条件にマッチしません。
検索結果は Zend_Search_Lucene_Search_QueryHit オブジェクトの配列となります。
各オブジェクトは、2 つのプロパティを保持しています。
$hit->document
がインデックス内のドキュメント番号、
$hit->score
が検索結果のスコアを表します。
結果はスコア順に並べられます (スコアの高い結果が最初になります)。
Zend_Search_Lucene_Search_QueryHit オブジェクトでは、 検索結果としてヒットした Zend_Search_Lucene_Document の各フィールドも公開しています。 この例で、ヒットしたドキュメントには title と author の 2 つのフィールドが含まれています。
<?php require_once('Zend/Search/Lucene.php'); $index = new Zend_Search_Lucene('/data/my_index'); $hits = $index->find($query); foreach ($hits as $hit) { echo $hit->score; echo $hit->title; echo $hit->author; } ?>
オプションで、
Zend_Search_Lucene_Search_QueryHit から元の Zend_Search_Lucene_Document
を取得することができます。
インデックス化されているドキュメントを取得するには、
インデックスオブジェクトの getDocument()
メソッドを使用し、その getFieldValue()
メソッドでフィールドの値を取得します。
<?php require_once('Zend/Search/Lucene.php'); $index = new Zend_Search_Lucene('/data/my_index'); $hits = $index->find($query); foreach ($hits as $hit) { // ヒットした結果の Zend_Search_Lucene_Document オブジェクトを返します echo $document = $hit->getDocument(); // Zend_Search_Lucene_Document から // Zend_Search_Lucene_Field オブジェクトを返します echo $document->getField('title'); // Zend_Search_Lucene_Field オブジェクトを値を文字列で返します echo $document->getFieldValue('title'); // getFieldValue() と同じです echo $document->title; } ?>
Zend_Search_Lucene_Document オブジェクトで使用可能なフィールドは、 インデックス化の際に決まります。ドキュメントのフィールドは、 インデックス化用アプリケーション (例えば LuceneIndexCreation.jar) によってインデックス化、あるいはインデックス化して保存されます。
ドキュメントを識別するフィールド (例では 'path') もインデックス化して取得できるようにしなければならないことに注意しましょう。
Zend_Search_Lucene は、Java Lucene と同じ重み付けアルゴリズムを使用します。 検索結果は重み順に並べ替えられます。スコアの高いものが先頭となり、 スコアの高いもののほうが低いものよりクエリにマッチするようになります。
大雑把に言うと、文書の中に検索語句が頻繁に登場するほどスコアが高くなります。
検索結果のスコアを取得するには score
プロパティを使用します。
<?php $hits = $index->find($query); foreach ($hits as $hit) { echo $hit->id; echo $hit->score; } ?>
重みを計算するために使用されるのが Zend_Search_Lucene_Search_Similarity クラスです。詳細は 拡張性 - 重み付けのアルゴリズム を参照ください。