インデックスの検索クエリの作成インデックスを検索するには二通りの方法があります。 クエリパーサを使用して文字列からクエリを作成する方法と、 Zend_search_Lucene API を使用して独自のクエリを作成する方法です。 提供されているクエリパーサを使用する前に、以下の点を考慮してください。
どちらの方法を使用したとしても、インデックスを検索する API メソッドは同じです。
You can also search multiple indexes simultaneously using MultiSearcher, which operates using the same API as searching on a single index:
Zend_Search_Lucene::find() メソッドは、 入力の型を自動的に判別し、クエリパーサを使用して文字列から Zend_Search_Lucene_Search_Query オブジェクトを作成します。 重要なのは、クエリパーサは標準の解析器を使用してクエリ文字列をトークン化するということです。 インデックス化されたテキストに対するすべての変換は、クエリ文字列エントリに対しても行われます。 小文字変換を行うことで大文字小文字を区別しない検索を行えるようにしたり、 ストップワードを取り除いたりといったさまざまなことを行います。 それに対して、API メソッドは単語の変換やフィルタリングを行いません。これは、 コンピュータが生成したフィールドやトークン化されていないフィールドに適しています。 クエリのパースZend_Search_Lucene_Search_QueryParser::parse() メソッドを使用してクエリ文字列をパースし、 クエリオブジェクトに格納します。 このオブジェクトをクエリ作成 API メソッドで使用し、 ユーザが入力したクエリと機械が生成したクエリを結合します。 実際のところ、これが トークン化されたいないフィールドを検索する唯一の方法となることもあります。
Zend_Search_Lucene_Search_QueryParser::parse() メソッドはオプションのパラメータでエンコーディングを受け取ることができます。 ここで、クエリ文字列のエンコーディングを指定します。
エンコーディングを省略した場合は、現在のロケールを使用します。 デフォルトのクエリ文字列エンコーディングを Zend_Search_Lucene_Search_QueryParser::setDefaultEncoding() メソッドで指定することもできます。
Zend_Search_Lucene_Search_QueryParser::getDefaultEncoding() は、デフォルトのクエリ文字列エンコーディングを返します (空文字列は "現在のロケール" を表します)。 検索結果
検索結果は Zend_Search_Lucene_Search_QueryHit オブジェクトの配列となります。
各オブジェクトは、2 つのプロパティを保持しています。
Zend_Search_Lucene_Search_QueryHit オブジェクトでは、 検索結果としてヒットした Zend_Search_Lucene_Document の各フィールドも公開しています。 この例で、ヒットしたドキュメントには title と author の 2 つのフィールドが含まれています。
保存されたフィールドは、常に UTF-8 エンコーディングで返されます。
オプションで、
Zend_Search_Lucene_Search_QueryHit から元の Zend_Search_Lucene_Document
を取得できます。
保存されたドキュメントを取得するには、
インデックスオブジェクトの
Zend_Search_Lucene_Document オブジェクトで使用可能なフィールドは、 インデックス化の際に決まります。ドキュメントのフィールドは、 インデックス化用アプリケーション (例えば LuceneIndexCreation.jar) によってインデックス化、あるいはインデックス化して保存されます。 ドキュメントを識別するフィールド (例では 'path') もインデックス化して取得できるようにしなければならないことに注意しましょう。 結果の制限検索処理の中でいちばん時間がかかるのが、スコアの計算です。 検索結果の数が多い (数万件程度) 場合、これには数秒程度かかることもあります。
Zend_Search_Lucene では、結果セットの件数を制限するためのメソッドとして
0 (デフォルト値) は、'制限しない' という意味です。 このメソッドが返す結果は、'スコアの高いほうから N 件' ではなく あくまで '最初の N 件' [1] です。 結果の重み付けZend_Search_Lucene は、Java Lucene と同じ重み付けアルゴリズムを使用します。 検索結果に一致したものが、デフォルトで重み順に並べ替えられます。スコアの高いものが先頭となり、 スコアの高いもののほうが低いものよりクエリにマッチするようになります。 大雑把に言うと、文書の中に検索語句が頻繁に登場するほどスコアが高くなります。
検索結果のスコアを取得するには 重みを計算するために使用されるのが Zend_Search_Lucene_Search_Similarity クラスです。詳細は 拡張性 - 重み付けのアルゴリズム を参照ください。 検索結果の並べ替え検索結果は、デフォルトではスコアで並べ替えられます。 これを変更するには、並べ替え用の (ひとつあるいは複数の) フィールドと並べ替えの形式、そして並べ替えの方向をパラメータで指定します。
例を以下に示します。
デフォルト以外の並び順を使用する際には注意しましょう。 並べ替えのためにはドキュメント全体をインデックスから読み込む必要があり、 検索のパフォーマンスが著しく低下してしまいます。 検索結果の強調Zend_Search_Lucene では、2 とおりの方法で検索結果を強調させることができます。 まず最初の方法が、Zend_Search_Lucene_Document_Html クラス (詳細は HTML ドキュメントの節 を参照ください) を用いて次のようにすることです。
強調方法をカスタマイズするには ビューヘルパー も、ビュースクリプトのコンテキストでコールバックとして使えます。
強調した結果を取得するには
もうひとつの方法は、
オプションの 2 番目のパラメータは、 デフォルトの HTML ドキュメントエンコーディングです。 省略した場合は、Content-type HTTP-EQUIV meta タグを使用します。 オプションの 3 番目のパラメータは、 Zend_Search_Lucene_Search_Highlighter_Interface インターフェイスを実装したオブジェクトです。
ここでの Zend_Search_Lucene_Document_Html オブジェクトは、 Zend_Search_Lucene_Search_Query->highlightMatches() メソッドに渡された HTML から作成されるオブジェクトです。
実際のところ、デフォルトの処理は定義済みの色テーブルを使用しているだけです。 自前の強調処理を実装することもできますし、デフォルトの処理を継承して色テーブルだけを再定義することもできます。
[1]
しかし、返される結果はスコア順 (あるいはその他指定した順)
で並べ替えられています。
[2]最初のパラメータは強調対象の 片、
そしてその他のパラメータはコールバックの振る舞いによって変わります。
返り値は、強調済みの 片となります。
[3]
どちらの場合についても、返される は自動的に正しい 形式に変換されます。
|