1 <?xml version="1.0" encoding="UTF-8"?>
3 <!-- EN-Revision: 21740 -->
4 <sect1 id="zend.search.lucene.query-language">
8 Java Lucene および <classname>Zend_Search_Lucene</classname> では、非常に強力なクエリ言語を使用できます。
12 これらの言語はほぼ同じものですが、微妙に異なる点もあります。
17 Java Lucene のクエリ言語の文法についての完全な文書は
18 <ulink url="http://lucene.apache.org/java/2_3_0/queryparsersyntax.html">ここ</ulink>
22 <sect2 id="zend.search.lucene.query-language.terms">
26 クエリは、単語と演算子から成り立ちます。単語には三種類の形式があります。
27 単一の単語、フレーズ、そしてサブクエリです。
30 単一の単語とは、"test" や "hello" のようなひとつの単語です。
33 フレーズとは、ダブルクォートで囲まれた複数の単語のグループ、たとえば
37 サブクエリとは、括弧で囲まれたクエリ、たとえば "(hello dolly)" です。
40 複数の単語を論理演算子で組み合わせることで、より複雑なクエリを作成できます
45 <sect2 id="zend.search.lucene.query-language.fields">
49 Lucene は、フィールド指定したデータをサポートしています。
50 検索を行う際には、クエリを指定することもできますし、
51 デフォルトのフィールドを使用することもできます。
52 フィールド名はインデックス化されたデータに依存します。また、
53 デフォルトのフィールドは現在の設定によって決まります。
56 Java Lucene との最初の (そしてもっとも大きな) 違いは、デフォルトでは
57 <emphasis>すべてのフィールド</emphasis> が検索の対象になるということです。
60 <classname>Zend_Search_Lucene</classname> クラスにはふたつの静的メソッドがあり、
63 <programlisting language="php"><![CDATA[
64 $defaultSearchField = Zend_Search_Lucene::getDefaultSearchField();
66 Zend_Search_Lucene::setDefaultSearchField('contents');
70 <constant>NULL</constant> 値は、すべてのフィールドを検索の対象とすることを意味します。
74 特定のフィールドを検索するには、まずフィールド名をタイプし、その後にコロン ":"
78 例を見てみましょう。Lucene インデックスにはふたつのフィールド
79 title および text があり、text がデフォルトのフィールドであるとします。
80 タイトルが "The Right Way" で本文に "don't go this way"
83 <programlisting language="querystring"><![CDATA[
84 title:"The Right Way" AND text:go
89 <programlisting language="querystring"><![CDATA[
90 title:"Do it right" AND go
93 とします。"text" はデフォルトのフィールドなので、フィールドの指定は必須ではなくなります。
97 注意: フィールドが有効なのは、その直後にある単語、
98 フレーズあるいはサブクエリだけであることに注意しましょう。つまり、クエリ
99 <programlisting language="querystring"><![CDATA[
102 は "Do" だけを title フィールドから探し、"it" や "right"
103 はデフォルトのフィールドから探します。デフォルトのフィールドが
104 <constant>NULL</constant> に設定されている場合は、"it" や "right"
109 <sect2 id="zend.search.lucene.query-language.wildcard">
110 <title>ワイルドカード</title>
112 Lucene は、単一の文字あるいは複数の文字を表すワイルドカードをサポートしています
113 これは、単語検索でのみ使用可能です (フレーズクエリでは使用できません)。
117 単一の文字を表すワイルドカードは "?" です。
121 複数の文字を表すワイルドカードは "*" です。
126 単語の中の "?" を別の一文字に置き換えたものにマッチする単語を探します。
127 たとえば、"text" あるいは "test" を探したい場合は
128 <programlisting language="querystring"><![CDATA[
135 複数文字のワイルドカードは、0 個以上の任意の数の文字に対応します。
136 たとえば test、tests あるいは tester を探したい場合は
137 <programlisting language="querystring"><![CDATA[
144 "?" や "*" は単語のどの部分でも使え、
145 また両方を同時に使うこともできます。たとえば
146 <programlisting language="querystring"><![CDATA[
149 は、"write" や "wrote"、"written"、"rewrite"、"rewrote" などに対応します。
153 ZF 1.7.7 以降、ワイルドカードパターンにはワイルドカード以外のプレフィックスが必要となりました。
154 デフォルトのプレフィックスの長さは 3 (Java Lucene と同じ) です。
155 つまり "*", "te?t", "*wr?t*" といった単語は例外を引き起こします<footnote>
156 <para>この例外は <code>Zend_Search_Lucene_Search_QueryParserException</code> ではなく
157 <code>Zend_Search_Lucene_Exception</code> となることに注意しましょう。
158 この例外がスローされるのは、クエリの書き換え (実行) 操作のときです。</para></footnote>。
161 これは、<code>Zend_Search_Lucene_Search_Query_Wildcard::getMinPrefixLength()</code> および
162 <code>Zend_Search_Lucene_Search_Query_Wildcard::setMinPrefixLength()</code>
167 <sect2 id="zend.search.lucene.query-language.modifiers">
168 <title>単語の修正子</title>
171 Lucene は、クエリの単語を修飾して幅広い検索オプションを指定することをサポートしています。
175 フレーズに対する近接検索や個別の単語に対するあいまい検索が可能となります。
179 <sect2 id="zend.search.lucene.query-language.range">
183 範囲検索は、フィールドの値の下限と上限を指定して
184 その範囲に含まれるドキュメントを探すものです。
185 最大値と最小値そのものを含めることも含めないこともできます。
187 <programlisting language="querystring"><![CDATA[
188 mod_date:[20020101 TO 20030101]
190 これは、mod_date フィールドの値が 20020101 から 20030101 (両端を含む)
192 範囲検索は、日付フィールド以外でも使えることに注意しましょう。
193 <programlisting language="querystring"><![CDATA[
194 title:{Aida TO Carmen}
196 これは、タイトルが Aida から Carmen までの間にあるドキュメントを探します。
197 ただし、Aida および Carmen は含めません。
200 両端の値を含めるには角括弧 []、含めない場合は波括弧 {}
204 フィールドを指定しなかった場合は、<classname>Zend_Search_Lucene</classname>
205 はすべてのフィールドに対して範囲検索を行います。
206 <programlisting language="querystring"><![CDATA[
212 <sect2 id="zend.search.lucene.query-language.fuzzy">
213 <title>あいまい検索</title>
215 <classname>Zend_Search_Lucene</classname> は、Java Lucene と同様にあいまい検索をサポートします。
216 これは、レーベンシュタイン距離のアルゴリズムにもとづくものです。
217 あいまい検索を行うには、チルダ記号 "~" を単語の最後に指定します。
218 たとえば、"roam" と似たスペルの単語を探すには、次のようなあいまい検索を使用します。
220 <programlisting language="querystring"><![CDATA[
224 この検索は、foam あるいは roams といった単語にマッチします。
226 (オプションの) 追加のパラメータによって、
228 このパラメータの値は 0 から 1 までの間となり、
229 1 に近づくほど、類似点が多い単語にのみマッチするようになります。
232 <programlisting language="querystring"><![CDATA[
236 このパラメータを省略した場合のデフォルトは 0.5 です。
240 <sect2 id="zend.search.lucene.query-language.matched-terms-limitations">
241 <title>マッチする単語の制限</title>
244 ワイルドカード検索や範囲検索、あいまい検索は、マッチする単語が多くなりすぎる可能性があります。
245 そんな場合は検索のパフォーマンスが大幅に低下してしまいます。
249 そこで、Zend_Search_Lucene はマッチする単語数の制限をクエリ (サブクエリ) 単位で設定します。
251 <code>Zend_Search_Lucene::getTermsPerQueryLimit()</code>/<code>Zend_Search_Lucene::setTermsPerQueryLimit($limit)</code>
255 デフォルトのマッチ数の制限は、クエリ単位で 1024 です。
259 <sect2 id="zend.search.lucene.query-language.proximity-search">
263 Lucene は、複数の単語が指定した範囲内にあらわれる状態の検索をサポートしています。
264 近接検索を行うには、チルダ記号 "~" をフレーズの最後に指定します。
265 たとえば、"Zend" と "Framework" がお互い 10 ワードの範囲内にあらわれるドキュメントを検索するには
266 <programlisting language="querystring"><![CDATA[
273 <sect2 id="zend.search.lucene.query-language.boosting">
277 Java Lucene および <classname>Zend_Search_Lucene</classname> は、
278 見つかった単語にもとづいてドキュメントの関連度を提供します。
279 ある単語の関連性を高くするには、キャレット記号 "^" に強調度 (数値)
280 をあわせたものを、検索する単語の最後につなげます。
281 強調度を高くするほど、その単語の関連性が高くなります。
284 この機能を使用すると、単語の強調度によってドキュメントの関連性を制御できるようになります。
286 <programlisting language="querystring"><![CDATA[
289 を検索しようとしており、単語 "PHP" をより重視したいとしましょう。
290 そんな場合は ^ 記号と強調度を単語の後に続けます。つまり
291 <programlisting language="querystring"><![CDATA[
294 のようにします。これにより、 <acronym>PHP</acronym> という単語を含むドキュメントがより重視されるようになります。
295 フレーズやサブクエリを強調することも可能です。たとえば
296 <programlisting language="querystring"><![CDATA[
297 "PHP framework"^4 "Zend Framework"
299 のようになります。デフォルトの強調度は 1 です。強調度には正の数値を指定しますが、
300 1 より小さくする (たとえば 0.2 など) ことも可能です。
304 <sect2 id="zend.search.lucene.query-language.boolean">
308 論理演算子によって、複数の単語を組み合わせることができます。
309 Lucene では、論理演算子として AND、"+"、OR、NOT および "-"
310 をサポートしています。Java Lucene では論理演算子をすべて大文字にする必要がありますが、
311 <classname>Zend_Search_Lucene</classname> ではその必要はありません。
315 論理クエリを作成するための方式は、大きく AND、OR および NOT の組と "+"、"-"
316 の組に分けられます。Java Lucene とは異なり、<classname>Zend_Search_Lucene</classname>
317 ではこれらの二つの組を混ぜて使うことはできません。
320 AND/OR/NOT 形式を使用する場合は、AND/OR 演算子がすべてのクエリ単語の間に存在する必要があります。
321 各単語の前には NOT 演算子をつけることができます。AND 演算子の優先順位は OR
322 より高くなります。これは Java Lucene の挙動とは異なります。
325 <sect3 id="zend.search.lucene.query-language.boolean.and">
328 AND 演算子の意味は、"AND グループ"
329 のすべての単語がドキュメントにマッチしなければならないということです。
332 "PHP framework" および "Zend Framework" を含むドキュメントを検索するには
333 <programlisting language="querystring"><![CDATA[
334 "PHP framework" AND "Zend Framework"
340 <sect3 id="zend.search.lucene.query-language.boolean.or">
343 OR 演算子は、クエリをいくつかのオプションに分割します。
346 "PHP framework" あるいは "Zend Framework" を含むドキュメントを検索するには
347 <programlisting language="querystring"><![CDATA[
348 "PHP framework" OR "Zend Framework"
354 <sect3 id="zend.search.lucene.query-language.boolean.not">
357 NOT 演算子は、NOT の後に続く単語を含むドキュメントを除外します。
358 しかし "AND グループ" が NOT 演算子つきの単語しか含まない場合は、
359 インデックス化されたドキュメント全体ではなく空の結果を返します。
362 "PHP framework" を含むが "Zend Framework" は含まないドキュメントを検索するには
363 <programlisting language="querystring"><![CDATA[
364 "PHP framework" AND NOT "Zend Framework"
370 <sect3 id="zend.search.lucene.query-language.boolean.other-form">
371 <title>&&、|| および ! 演算子</title>
373 &&、|| および ! は、それぞれ AND、OR および NOT 演算子の代わりに使用します。
377 <sect3 id="zend.search.lucene.query-language.boolean.plus">
381 "+" 記号の後の単語が必ずドキュメントにマッチしなければならないことを意味します。
384 "Zend" を必ず含み、"Framework" を含んでも含まなくてもかまわないドキュメントを検索するには
385 <programlisting language="querystring"><![CDATA[
392 <sect3 id="zend.search.lucene.query-language.boolean.minus">
396 "-" 記号の後の単語を含むドキュメントを検索結果から除外します。
399 "PHP framework" は含むが "Zend Framework" は含まないドキュメントを検索するには
400 <programlisting language="querystring"><![CDATA[
401 "PHP framework" -"Zend Framework"
407 <sect3 id="zend.search.lucene.query-language.boolean.no-operator">
411 その挙動は "デフォルトの boolean 演算子" として定義されます。
414 これは、デフォルトでは <code>OR</code> となります。
417 つまり、その単語は任意となるということです。
418 その単語はドキュメント中に存在するかもしれないし、しないかもしれません。
419 ただ、その単語を含むドキュメントのほうが高いスコアとなります。
422 "PHP framework" は必須で "Zend Framework" は含んでも含まなくてもかまわないドキュメントを検索するには
423 <programlisting language="querystring"><![CDATA[
424 +"PHP framework" "Zend Framework"
430 デフォルトの boolean 演算子を設定したり取得したりするには、それぞれ
431 <classname>Zend_Search_Lucene_Search_QueryParser::setDefaultOperator($operator)</classname> および
432 <classname>Zend_Search_Lucene_Search_QueryParser::getDefaultOperator()</classname> を使用します。
436 <classname>Zend_Search_Lucene_Search_QueryParser::B_AND</classname> および
437 <classname>Zend_Search_Lucene_Search_QueryParser::B_OR</classname> です。
442 <sect2 id="zend.search.lucene.query-language.grouping">
446 Java Lucene および <classname>Zend_Search_Lucene</classname> では、
447 括弧を使用して条件をグループ化することによるサブクエリの作成をサポートしています。
448 これは、クエリのロジックを制御したい場合や異なるスタイルの論理クエリを共用したい場合などに便利です。
449 <programlisting language="querystring"><![CDATA[
450 +(framework OR library) +php
452 <classname>Zend_Search_Lucene</classname> は、あらゆるレベルのサブクエリをサポートしています。
456 <sect2 id="zend.search.lucene.query-language.field-grouping">
457 <title>フィールドのグループ化</title>
460 Lucene では、括弧を使用して複数の条件をひとつのフィールドに適用できます。
463 タイトルに単語 "return" とフレーズ "pink panther" の両方を含むドキュメントを検索するには
464 <programlisting language="querystring"><![CDATA[
465 title:(+return +"pink panther")
467 を使用します。Zend_Search_Lucene は、あらゆるレベルのサブクエリをサポートしています。
471 <sect2 id="zend.search.lucene.query-language.escaping">
472 <title>特殊文字のエスケープ</title>
475 Lucene は、クエリの文法に含まれる特殊文字のエスケープをサポートしています。
476 特殊文字に含まれるの文字は次のとおりです。
479 + - && || ! ( ) { } [ ] ^ " ~ * ? : \
482 + および - が単一の単語の中に含まれる場合は、通常の文字として扱われます。
485 これらの文字をエスケープするには、その文字の前に \ をつけます。
487 <programlisting language="querystring"><![CDATA[