クエリ作成用の API文字列のクエリを自動的にパースするだけではなく、クエリを API で作成することもできます。 ユーザクエリは、API で作成したクエリを組み合わせて作成できます。 クエリパーサを使用して、文字列からクエリを作成します。 クエリパーサの例外クエリパーサは、二種類の例外を発生させます。
Zend_Search_Lucene オブジェクトの find() メソッドでも同様のテクニックを使えます。 バージョン 1.5 以降では、クエリのパース時の例外はデフォルトで抑制されるようになります。 クエリ言語に反するクエリが渡された場合は、現在のデフォルトの解析器を用いてそれをトークン化し、 トークン化された単語で検索します。 例外を有効にするには Zend_Search_Lucene_Search_QueryParser::dontSuppressQueryParsingExceptions() メソッドを使用します。 Zend_Search_Lucene_Search_QueryParser::suppressQueryParsingExceptions() メソッドおよび Zend_Search_Lucene_Search_QueryParser::queryParsingExceptionsSuppressed() メソッドも、例外処理の振る舞いを変更するためのものです。 単一の単語のクエリひとつの単語を使用した検索を行うためのものです。 文字列によるクエリ
あるいは API で作成するクエリ
単語のフィールドは任意で指定します。 指定しなかった場合は、Zend_Search_Lucene は全フィールドを対象に検索します。
複数の単語のクエリ複数の単語の組み合わせによる検索を行うためのものです。 各単語は、required (必須)・prohibited (禁止)・ neither (どちらでもない) のいずれかを指定できます。
つまり、必須単語のみのクエリに「どちらでもない (オプション)」 単語を追加しても、結果セットは変わりません。 ただ、オプションの単語にマッチした結果が結果セットの先頭に移動します。 以下の両方の方法が使用可能です。 文字列によるクエリ
あるいは API で作成するクエリ
MultiTerm クエリのコンストラクタで、単語のリストを指定することもできます。
$signs 配列に、単語の種別についての情報を含めます。
Boolean クエリBoolean クエリを使用すると、他のクエリや boolean 演算子を用いたクエリを作成できます。 セット内の各サブクエリは、required (必須) か prohibited (禁止)、あるいは optional (オプション) として定義します。
必須サブクエリを含むクエリにオプションのサブクエリを追加しても結果は変わりません。 ただ、オプションのサブクエリを使用することで、マッチしたドキュメントのスコアが変わります。 boolean クエリには、両方の方式の検索メソッドが使用可能です。 文字列によるクエリ
あるいは API で作成するクエリ
Boolean クエリのコンストラクタで、単語のリストを指定することもできます。 $signs 配列に、サブクエリの種別についての情報を含めます。
boolean 演算子を使用する各クエリは、符号記法や API を用いて書き換えることができます。たとえば
ワイルドカードクエリワイルドカードクエリは、指定したパターンに一致する複数の単語を探すためのものです。 '?' は、ひとつの文字を表すワイルドカードです。 '*' は、複数の文字を表すワイルドカードです。 文字列によるクエリ
あるいは API で作成するクエリ
フィールドの指定はオプションです。省略した場合は、 Zend_Search_Lucene は全フィールドを対象に検索を行います。
あいまいクエリあいまいクエリは、指定した単語に似た単語を含むドキュメントを探すためのものです。 文字列によるクエリ
or API で作成するクエリ
オプションの類似度は、"~" 記号の後に指定します。 文字列によるクエリ
or API で作成するクエリ
単語のフィールドはオプションです。 このフィールドを省略した場合、Zend_Search_Lucene は各ドキュメントのすべてのフィールドを検索します。
フレーズクエリ熟語による検索を行うためのものです。 フレーズクエリはとても柔軟性の高いもので、 完全な熟語だけでなく曖昧な熟語の検索も可能になります。 熟語の途中で隙間をあけたり、複数の単語を同じ位置に指定したりもできます (これは、解析器によって別の目的で作成されます。 例えば、単語の重みを増すためにある単語を重複させたり、 類義語をひとつの位置にまとめたりします)。
フレーズクエリを作成するには、コンストラクタで一気に構築してしまう方法と Zend_Search_Lucene_Search_Query_Phrase::addTerm() メソッドでひとつひとつ作成する方法に 2 通りがあります。 Zend_Search_Lucene_Search_Query_Phrase クラスのコンストラクタで、 オプションの 3 つの引数を指定できます。 $terms は文字列の配列で、 フレーズを構成する単語が含まれます。指定しなかったり null を渡したりした場合は、空のクエリが作成されます。 $offsets は整数の配列で、 フレーズ内の単語の位置を指定します。指定しなかったり null を渡したりした場合は、単語の位置はシーケンシャルであり、 すきまはないと解釈されます。 $field は文字列で、検索対象となるドキュメントのフィールドを指定します。 指定しなかったり NULL を渡したりした場合は、デフォルトのフィールドが対象となります。 したがって、
は 'zend framework' を検索します。
は 'zend ????? download' を検索し、'zend platform download' や 'zend studio download'、 'zend core download'、'zend framework download' などがマッチします
は 'title' フィールドから 'zend framework' を検索します。 Zend_Search_Lucene_Search_Query_Phrase::addTerm() メソッドは 2 つの引数をとります。Zend_Search_Lucene_Index_Term オブジェクトが必須で、position はオプションです。 $term はフレーズ内の次の単語を指定します。 前の単語と同じフィールドを指していなければなりません。 そうでない場合は例外がスローされます。 $position は単語の位置を指定します。 したがって、
は 'zend framework' を検索します。
は 'zend ????? download' を検索し、'zend platform download' や 'zend studio download'、 'zend core download'、'zend framework download' などがマッチします
は 'title' フィールドから 'zend framework' を検索します。 曖昧度は、フレーズの間に別の単語が何個まで入ることを許すのかを設定します。 ゼロの場合は、完全な熟語検索となります。大きな値を指定すると、 WITHIN 演算子や NEAR 演算子と同様な動作となります。 曖昧度とは、クエリの中で各単語の位置を何段階移動させられるかを表します。 例えば、2 つの単語の順番を入れ替えるには 2 段階の移動が必要です (最初の単語を、次の単語のもうひとつ先まで移動させます)。 そのため、語順を入れ替えることを許可したいのなら、曖昧度は少なくとも 2 以上にしなければなりません。 正確にマッチしているほうが、曖昧に (sloppy) マッチしているものより高スコアとなります。そのため、 検索結果は正確度の順に並べ替えられます。曖昧度のデフォルトはゼロで、 これは完全に一致するもののみを対象とします。 曖昧度は、クエリを作成した後で設定できます。
範囲クエリ範囲クエリ は、指定した範囲にある単語を探すためのものです。 文字列によるクエリ
あるいは API で作成するクエリ
フィールドの指定はオプションです。省略した場合は、 Zend_Search_Lucene は全フィールドを対象に検索を行います。
上限あるいは下限のどちらか一方を NULL にできます (両方を NULL にすることはできません)。この場合、Zend_Search_Lucene は「先頭から指定した値まで」あるいは「指定した値から最後まで」 という条件で検索します。
|