[GENERIC] Zend_Translate:
[zend.git] / documentation / manual / ja / module_specs / Zend_Search_Lucene-QueryLanguage.xml
bloba29154b2dc3fd25e1f82469dc4265030beba22fe
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!-- Reviewed: no -->
3 <!-- EN-Revision: 21740 -->
4 <sect1 id="zend.search.lucene.query-language">
5     <title>クエリ言語</title>
7     <para>
8         Java Lucene および <classname>Zend_Search_Lucene</classname> では、非常に強力なクエリ言語を使用できます。
9     </para>
11     <para>
12         これらの言語はほぼ同じものですが、微妙に異なる点もあります。
13         異なる点については以下で説明します。
14     </para>
16     <para>
17         Java Lucene のクエリ言語の文法についての完全な文書は
18         <ulink url="http://lucene.apache.org/java/2_3_0/queryparsersyntax.html">ここ</ulink>
19         にあります。
20     </para>
22     <sect2 id="zend.search.lucene.query-language.terms">
23         <title>用語</title>
25         <para>
26             クエリは、単語と演算子から成り立ちます。単語には三種類の形式があります。
27             単一の単語、フレーズ、そしてサブクエリです。
28         </para>
29         <para>
30             単一の単語とは、"test" や "hello" のようなひとつの単語です。
31         </para>
32         <para>
33             フレーズとは、ダブルクォートで囲まれた複数の単語のグループ、たとえば
34             "hello dolly" です。
35         </para>
36         <para>
37             サブクエリとは、括弧で囲まれたクエリ、たとえば "(hello dolly)" です。
38         </para>
39         <para>
40             複数の単語を論理演算子で組み合わせることで、より複雑なクエリを作成できます
41             (以下を参照ください)。
42         </para>
43     </sect2>
45     <sect2 id="zend.search.lucene.query-language.fields">
46         <title>フィールド</title>
48         <para>
49             Lucene は、フィールド指定したデータをサポートしています。
50             検索を行う際には、クエリを指定することもできますし、
51             デフォルトのフィールドを使用することもできます。
52             フィールド名はインデックス化されたデータに依存します。また、
53             デフォルトのフィールドは現在の設定によって決まります。
54         </para>
55         <para>
56             Java Lucene との最初の (そしてもっとも大きな) 違いは、デフォルトでは
57             <emphasis>すべてのフィールド</emphasis> が検索の対象になるということです。
58         </para>
59         <para>
60             <classname>Zend_Search_Lucene</classname> クラスにはふたつの静的メソッドがあり、
61             この設定を操作できます。
62         </para>
63         <programlisting language="php"><![CDATA[
64 $defaultSearchField = Zend_Search_Lucene::getDefaultSearchField();
65 ...
66 Zend_Search_Lucene::setDefaultSearchField('contents');
67 ]]></programlisting>
69         <para>
70             <constant>NULL</constant> 値は、すべてのフィールドを検索の対象とすることを意味します。
71             これがデフォルトの設定です。
72         </para>
73         <para>
74             特定のフィールドを検索するには、まずフィールド名をタイプし、その後にコロン ":"
75             を続け、探したい単語を指定します。
76         </para>
77         <para>
78             例を見てみましょう。Lucene インデックスにはふたつのフィールド
79             title および text があり、text がデフォルトのフィールドであるとします。
80             タイトルが "The Right Way" で本文に "don't go this way"
81             が含まれるドキュメントを探したいなら、
82         </para>
83         <programlisting language="querystring"><![CDATA[
84 title:"The Right Way" AND text:go
85 ]]></programlisting>
86         <para>
87             あるいは
88         </para>
89         <programlisting language="querystring"><![CDATA[
90 title:"Do it right" AND go
91 ]]></programlisting>
92         <para>
93             とします。"text" はデフォルトのフィールドなので、フィールドの指定は必須ではなくなります。
94         </para>
96         <para>
97             注意: フィールドが有効なのは、その直後にある単語、
98             フレーズあるいはサブクエリだけであることに注意しましょう。つまり、クエリ
99             <programlisting language="querystring"><![CDATA[
100 title:Do it right
101 ]]></programlisting>
102             は "Do" だけを title フィールドから探し、"it" や "right"
103             はデフォルトのフィールドから探します。デフォルトのフィールドが
104             <constant>NULL</constant> に設定されている場合は、"it" や "right"
105             はすべてのフィールドから探します。
106         </para>
107     </sect2>
109     <sect2 id="zend.search.lucene.query-language.wildcard">
110         <title>ワイルドカード</title>
111         <para>
112             Lucene は、単一の文字あるいは複数の文字を表すワイルドカードをサポートしています
113             これは、単語検索でのみ使用可能です (フレーズクエリでは使用できません)。
114         </para>
116         <para>
117             単一の文字を表すワイルドカードは "?" です。
118         </para>
120         <para>
121             複数の文字を表すワイルドカードは "*" です。
122         </para>
124         <para>
125             単一文字のワイルドカードは、
126             単語の中の "?" を別の一文字に置き換えたものにマッチする単語を探します。
127             たとえば、"text" あるいは "test" を探したい場合は
128             <programlisting language="querystring"><![CDATA[
129 te?t
130 ]]></programlisting>
131             とします。
132         </para>
134         <para>
135             複数文字のワイルドカードは、0 個以上の任意の数の文字に対応します。
136             たとえば test、tests あるいは tester を探したい場合は
137             <programlisting language="querystring"><![CDATA[
138 test*
139 ]]></programlisting>
140             とします。
141         </para>
143         <para>
144             "?" や "*" は単語のどの部分でも使え、
145             また両方を同時に使うこともできます。たとえば
146             <programlisting language="querystring"><![CDATA[
147 *wr?t*
148 ]]></programlisting>
149             は、"write" や "wrote"、"written"、"rewrite"、"rewrote" などに対応します。
150         </para>
152         <para>
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>。
159         </para>
160         <para>
161             これは、<code>Zend_Search_Lucene_Search_Query_Wildcard::getMinPrefixLength()</code> および
162             <code>Zend_Search_Lucene_Search_Query_Wildcard::setMinPrefixLength()</code>
163             メソッドで変更できます。
164         </para>
165     </sect2>
167     <sect2 id="zend.search.lucene.query-language.modifiers">
168         <title>単語の修正子</title>
170         <para>
171             Lucene は、クエリの単語を修飾して幅広い検索オプションを指定することをサポートしています。
172         </para>
173         <para>
174             "~" 修正子を使用すると、
175             フレーズに対する近接検索や個別の単語に対するあいまい検索が可能となります。
176         </para>
177     </sect2>
179     <sect2 id="zend.search.lucene.query-language.range">
180         <title>範囲検索</title>
182         <para>
183             範囲検索は、フィールドの値の下限と上限を指定して
184             その範囲に含まれるドキュメントを探すものです。
185             最大値と最小値そのものを含めることも含めないこともできます。
186             並べ替えは、辞書順で行われます。
187             <programlisting language="querystring"><![CDATA[
188 mod_date:[20020101 TO 20030101]
189 ]]></programlisting>
190             これは、mod_date フィールドの値が 20020101 から 20030101 (両端を含む)
191             であるドキュメントを探します。
192             範囲検索は、日付フィールド以外でも使えることに注意しましょう。
193             <programlisting language="querystring"><![CDATA[
194 title:{Aida TO Carmen}
195 ]]></programlisting>
196             これは、タイトルが Aida から Carmen までの間にあるドキュメントを探します。
197             ただし、Aida および Carmen は含めません。
198         </para>
199         <para>
200             両端の値を含めるには角括弧 []、含めない場合は波括弧 {}
201             でクエリを指定します。
202         </para>
203         <para>
204             フィールドを指定しなかった場合は、<classname>Zend_Search_Lucene</classname>
205             はすべてのフィールドに対して範囲検索を行います。
206             <programlisting language="querystring"><![CDATA[
207 {Aida TO Carmen}
208 ]]></programlisting>
209         </para>
210     </sect2>
212     <sect2 id="zend.search.lucene.query-language.fuzzy">
213         <title>あいまい検索</title>
214         <para>
215             <classname>Zend_Search_Lucene</classname> は、Java Lucene と同様にあいまい検索をサポートします。
216             これは、レーベンシュタイン距離のアルゴリズムにもとづくものです。
217             あいまい検索を行うには、チルダ記号 "~" を単語の最後に指定します。
218             たとえば、"roam" と似たスペルの単語を探すには、次のようなあいまい検索を使用します。
220             <programlisting language="querystring"><![CDATA[
221 roam~
222 ]]></programlisting>
224             この検索は、foam あるいは roams といった単語にマッチします。
226             (オプションの) 追加のパラメータによって、
227             あいまい検索の程度を指定できます。
228             このパラメータの値は 0 から 1 までの間となり、
229             1 に近づくほど、類似点が多い単語にのみマッチするようになります。
230             たとえば次のように使用します。
232             <programlisting language="querystring"><![CDATA[
233 roam~0.8
234 ]]></programlisting>
236             このパラメータを省略した場合のデフォルトは 0.5 です。
237         </para>
238     </sect2>
240     <sect2 id="zend.search.lucene.query-language.matched-terms-limitations">
241         <title>マッチする単語の制限</title>
243         <para>
244             ワイルドカード検索や範囲検索、あいまい検索は、マッチする単語が多くなりすぎる可能性があります。
245             そんな場合は検索のパフォーマンスが大幅に低下してしまいます。
246         </para>
248         <para>
249             そこで、Zend_Search_Lucene はマッチする単語数の制限をクエリ (サブクエリ) 単位で設定します。
250             この制限を取得したり設定したりするには
251             <code>Zend_Search_Lucene::getTermsPerQueryLimit()</code>/<code>Zend_Search_Lucene::setTermsPerQueryLimit($limit)</code>
252             メソッドを使用します。
253         </para>
254         <para>
255             デフォルトのマッチ数の制限は、クエリ単位で 1024 です。
256         </para>
257     </sect2>
259     <sect2 id="zend.search.lucene.query-language.proximity-search">
260         <title>近接検索</title>
262         <para>
263             Lucene は、複数の単語が指定した範囲内にあらわれる状態の検索をサポートしています。
264             近接検索を行うには、チルダ記号 "~" をフレーズの最後に指定します。
265             たとえば、"Zend" と "Framework" がお互い 10 ワードの範囲内にあらわれるドキュメントを検索するには
266             <programlisting language="querystring"><![CDATA[
267 "Zend Framework"~10
268 ]]></programlisting>
269             とします。
270         </para>
271     </sect2>
273     <sect2 id="zend.search.lucene.query-language.boosting">
274         <title>単語の強調</title>
276         <para>
277             Java Lucene および <classname>Zend_Search_Lucene</classname> は、
278             見つかった単語にもとづいてドキュメントの関連度を提供します。
279             ある単語の関連性を高くするには、キャレット記号 "^" に強調度 (数値)
280             をあわせたものを、検索する単語の最後につなげます。
281             強調度を高くするほど、その単語の関連性が高くなります。
282         </para>
283         <para>
284             この機能を使用すると、単語の強調度によってドキュメントの関連性を制御できるようになります。
285             たとえば
286             <programlisting language="querystring"><![CDATA[
287 PHP framework
288 ]]></programlisting>
289             を検索しようとしており、単語 "PHP" をより重視したいとしましょう。
290             そんな場合は ^ 記号と強調度を単語の後に続けます。つまり
291             <programlisting language="querystring"><![CDATA[
292 PHP^4 framework
293 ]]></programlisting>
294             のようにします。これにより、 <acronym>PHP</acronym> という単語を含むドキュメントがより重視されるようになります。
295             フレーズやサブクエリを強調することも可能です。たとえば
296             <programlisting language="querystring"><![CDATA[
297 "PHP framework"^4 "Zend Framework"
298 ]]></programlisting>
299             のようになります。デフォルトの強調度は 1 です。強調度には正の数値を指定しますが、
300             1 より小さくする (たとえば 0.2 など) ことも可能です。
301         </para>
302     </sect2>
304     <sect2 id="zend.search.lucene.query-language.boolean">
305         <title>論理演算子</title>
307         <para>
308             論理演算子によって、複数の単語を組み合わせることができます。
309             Lucene では、論理演算子として AND、"+"、OR、NOT および "-"
310             をサポートしています。Java Lucene では論理演算子をすべて大文字にする必要がありますが、
311             <classname>Zend_Search_Lucene</classname> ではその必要はありません。
312         </para>
314         <para>
315             論理クエリを作成するための方式は、大きく AND、OR および NOT の組と "+"、"-"
316             の組に分けられます。Java Lucene とは異なり、<classname>Zend_Search_Lucene</classname>
317             ではこれらの二つの組を混ぜて使うことはできません。
318         </para>
319         <para>
320             AND/OR/NOT 形式を使用する場合は、AND/OR 演算子がすべてのクエリ単語の間に存在する必要があります。
321             各単語の前には NOT 演算子をつけることができます。AND 演算子の優先順位は OR
322             より高くなります。これは Java Lucene の挙動とは異なります。
323         </para>
325         <sect3 id="zend.search.lucene.query-language.boolean.and">
326             <title>AND</title>
327             <para>
328                 AND 演算子の意味は、"AND グループ"
329                 のすべての単語がドキュメントにマッチしなければならないということです。
330             </para>
331             <para>
332                 "PHP framework" および "Zend Framework" を含むドキュメントを検索するには
333                 <programlisting language="querystring"><![CDATA[
334 "PHP framework" AND "Zend Framework"
335 ]]></programlisting>
336                 を使用します。
337             </para>
338         </sect3>
340         <sect3 id="zend.search.lucene.query-language.boolean.or">
341             <title>OR</title>
342             <para>
343                 OR 演算子は、クエリをいくつかのオプションに分割します。
344             </para>
345             <para>
346                 "PHP framework" あるいは "Zend Framework" を含むドキュメントを検索するには
347                 <programlisting language="querystring"><![CDATA[
348 "PHP framework" OR "Zend Framework"
349 ]]></programlisting>
350                 を使用します。
351             </para>
352         </sect3>
354         <sect3 id="zend.search.lucene.query-language.boolean.not">
355             <title>NOT</title>
356             <para>
357                 NOT 演算子は、NOT の後に続く単語を含むドキュメントを除外します。
358                 しかし "AND グループ" が NOT 演算子つきの単語しか含まない場合は、
359                 インデックス化されたドキュメント全体ではなく空の結果を返します。
360             </para>
361             <para>
362                 "PHP framework" を含むが "Zend Framework" は含まないドキュメントを検索するには
363                 <programlisting language="querystring"><![CDATA[
364 "PHP framework" AND NOT "Zend Framework"
365 ]]></programlisting>
366                 を使用します。
367             </para>
368         </sect3>
370         <sect3 id="zend.search.lucene.query-language.boolean.other-form">
371             <title>&amp;&amp;、|| および ! 演算子</title>
372             <para>
373                 &amp;&amp;、|| および ! は、それぞれ AND、OR および NOT 演算子の代わりに使用します。
374             </para>
375         </sect3>
377         <sect3 id="zend.search.lucene.query-language.boolean.plus">
378             <title>+</title>
379             <para>
380                 "+" 演算子 (必須演算子) は、
381                 "+" 記号の後の単語が必ずドキュメントにマッチしなければならないことを意味します。
382             </para>
383             <para>
384                 "Zend" を必ず含み、"Framework" を含んでも含まなくてもかまわないドキュメントを検索するには
385                 <programlisting language="querystring"><![CDATA[
386 +Zend Framework
387 ]]></programlisting>
388                 を使用します。
389             </para>
390         </sect3>
392         <sect3 id="zend.search.lucene.query-language.boolean.minus">
393             <title>-</title>
394             <para>
395                 "-" 演算子 (禁止演算子) は、
396                 "-" 記号の後の単語を含むドキュメントを検索結果から除外します。
397             </para>
398             <para>
399                 "PHP framework" は含むが "Zend Framework" は含まないドキュメントを検索するには
400                 <programlisting language="querystring"><![CDATA[
401 "PHP framework" -"Zend Framework"
402 ]]></programlisting>
403                 を使用します。
404             </para>
405         </sect3>
407         <sect3 id="zend.search.lucene.query-language.boolean.no-operator">
408             <title>演算子なし</title>
409             <para>
410                 演算子を使用しなかった場合は、
411                 その挙動は "デフォルトの boolean 演算子" として定義されます。
412             </para>
413             <para>
414                 これは、デフォルトでは <code>OR</code> となります。
415             </para>
416             <para>
417                 つまり、その単語は任意となるということです。
418                 その単語はドキュメント中に存在するかもしれないし、しないかもしれません。
419                 ただ、その単語を含むドキュメントのほうが高いスコアとなります。
420             </para>
421             <para>
422                 "PHP framework" は必須で "Zend Framework" は含んでも含まなくてもかまわないドキュメントを検索するには
423                 <programlisting language="querystring"><![CDATA[
424 +"PHP framework" "Zend Framework"
425 ]]></programlisting>
426                 を使用します。
427             </para>
429             <para>
430                 デフォルトの boolean 演算子を設定したり取得したりするには、それぞれ
431                 <classname>Zend_Search_Lucene_Search_QueryParser::setDefaultOperator($operator)</classname> および
432                 <classname>Zend_Search_Lucene_Search_QueryParser::getDefaultOperator()</classname> を使用します。
433             </para>
434             <para>
435                 これらのメソッドで使用する定数は、
436                 <classname>Zend_Search_Lucene_Search_QueryParser::B_AND</classname> および
437                 <classname>Zend_Search_Lucene_Search_QueryParser::B_OR</classname> です。
438             </para>
439         </sect3>
440     </sect2>
442     <sect2 id="zend.search.lucene.query-language.grouping">
443         <title>グループ化</title>
445         <para>
446             Java Lucene および <classname>Zend_Search_Lucene</classname> では、
447             括弧を使用して条件をグループ化することによるサブクエリの作成をサポートしています。
448             これは、クエリのロジックを制御したい場合や異なるスタイルの論理クエリを共用したい場合などに便利です。
449             <programlisting language="querystring"><![CDATA[
450 +(framework OR library) +php
451 ]]></programlisting>
452             <classname>Zend_Search_Lucene</classname> は、あらゆるレベルのサブクエリをサポートしています。
453         </para>
454     </sect2>
456     <sect2 id="zend.search.lucene.query-language.field-grouping">
457         <title>フィールドのグループ化</title>
459         <para>
460             Lucene では、括弧を使用して複数の条件をひとつのフィールドに適用できます。
461         </para>
462         <para>
463             タイトルに単語 "return" とフレーズ "pink panther" の両方を含むドキュメントを検索するには
464             <programlisting language="querystring"><![CDATA[
465 title:(+return +"pink panther")
466 ]]></programlisting>
467             を使用します。Zend_Search_Lucene は、あらゆるレベルのサブクエリをサポートしています。
468         </para>
469     </sect2>
471     <sect2 id="zend.search.lucene.query-language.escaping">
472         <title>特殊文字のエスケープ</title>
474         <para>
475             Lucene は、クエリの文法に含まれる特殊文字のエスケープをサポートしています。
476             特殊文字に含まれるの文字は次のとおりです。
477         </para>
478         <para>
479             + - &amp;&amp; || ! ( ) { } [ ] ^ " ~ * ? : \
480         </para>
481         <para>
482             + および - が単一の単語の中に含まれる場合は、通常の文字として扱われます。
483         </para>
484         <para>
485             これらの文字をエスケープするには、その文字の前に \ をつけます。
486             たとえば、(1+1):2 を検索するには
487             <programlisting language="querystring"><![CDATA[
488 \(1\+1\)\:2
489 ]]></programlisting>
490             を使用します。
491         </para>
492     </sect2>
494 </sect1>