[GENERIC] Zend_Translate:
[zend.git] / documentation / manual / ja / module_specs / Zend_Search_Lucene-Searching.xml
blob114a16e7b6fe56503d18a2ff5c3b6505f58f46f7
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!-- Reviewed: no -->
3 <!-- EN-Revision: 20854 -->
4 <sect1 id="zend.search.lucene.searching">
5     <title>インデックスの検索</title>
7     <sect2 id="zend.search.lucene.searching.query_building">
8         <title>クエリの作成</title>
10         <para>
11             インデックスを検索するには二通りの方法があります。
12             クエリパーサを使用して文字列からクエリを作成する方法と、
13             <classname>Zend_search_Lucene</classname> <acronym>API</acronym> を使用して独自のクエリを作成する方法です。
14         </para>
16         <para>
17         提供されているクエリパーサを使用する前に、以下の点を考慮してください。
19             <orderedlist>
20                 <listitem>
21                     <para>
22                         プログラムで生成したクエリ文字列をクエリパーサに渡そうとしているなら、
23                         クエリ <acronym>API</acronym> を使用してクエリを直接作成すべきです。言い換えると、
24                         クエリパーサというのは人間が入力したテキストのために設計されたものであり、
25                         プログラムが生成したテキストのためのものではないのです。
26                     </para>
27                 </listitem>
28                 <listitem>
29                     <para>
30                         トークン化されていないフィールドについては、
31                         クエリパーサを使用するよりも直接クエリに追加するほうが適しています。
32                         フィールドの値がアプリケーションによって生成されるのなら、
33                         フィールドのクエリ条件についても自動処理で作成すべきです。
34                         クエリパーサが使用している解析器は、人間が入力したテキストを
35                         単語に分解するために設計されています。
36                         日付やキーワードなどのプログラムが生成した値は、
37                         クエリ <acronym>API</acronym> で追加しなければなりません。
38                     </para>
39                 </listitem>
40                 <listitem>
41                     <para>
42                         検索フォームにおいては、
43                         テキストで入力された内容はクエリパーサを使用すべきでしょう。
44                         その他のフィールド、例えば範囲指定やキーワードなどについては、
45                         クエリ <acronym>API</acronym> に直接渡すようにしましょう。
46                         限られた内容、例えばプルダウンメニューで選択するフィールドは、
47                         クエリ文字列に追加すべきではありません。
48                         その代わりに、TermQuery 条件として使用します。
49                     </para>
50                 </listitem>
51                 <listitem>
52                     <para>
53                         論理クエリにより、複数のクエリをひとつにまとめることができます。
54                         これは、クエリ文字列で定義されるユーザ検索に条件を追加するための最良な方法です。
55                     </para>
56                 </listitem>
57             </orderedlist>
59         </para>
61         <para>
62             どちらの方法を使用したとしても、インデックスを検索する <acronym>API</acronym> メソッドは同じです。
63         </para>
65         <programlisting language="php"><![CDATA[
66 $index = Zend_Search_Lucene::open('/data/my_index');
68 $index->find($query);
69 ]]></programlisting>
70         <para>
71             <methodname>Zend_Search_Lucene::find()</methodname> メソッドは、
72             入力の型を自動的に判別し、クエリパーサを使用して文字列から
73             <classname>Zend_Search_Lucene_Search_Query</classname> オブジェクトを作成します。
74         </para>
76         <para>
77             重要なのは、クエリパーサは標準の解析器を使用してクエリ文字列をトークン化するということです。
78             インデックス化されたテキストに対するすべての変換は、クエリ文字列エントリに対しても行われます。
79         </para>
80         <para>
81             小文字変換を行うことで大文字小文字を区別しない検索を行えるようにしたり、
82             ストップワードを取り除いたりといったさまざまなことを行います。
83         </para>
84         <para>
85             それに対して、<acronym>API</acronym> メソッドは単語の変換やフィルタリングを行いません。これは、
86             コンピュータが生成したフィールドやトークン化されていないフィールドに適しています。
87         </para>
89         <sect3 id="zend.search.lucene.searching.query_building.parsing">
90             <title>クエリのパース</title>
91             <para>
92                 <methodname>Zend_Search_Lucene_Search_QueryParser::parse()</methodname>
93                 メソッドを使用してクエリ文字列をパースし、
94                 クエリオブジェクトに格納します。
95             </para>
97             <para>
98                 このオブジェクトをクエリ作成 <acronym>API</acronym> メソッドで使用し、
99                 ユーザが入力したクエリと機械が生成したクエリを結合します。
100             </para>
102             <para>
103                 実際のところ、これが
104                 トークン化されたいないフィールドを検索する唯一の方法となることもあります。
106                 <programlisting language="php"><![CDATA[
107 $userQuery = Zend_Search_Lucene_Search_QueryParser::parse($queryStr);
109 $pathTerm  = new Zend_Search_Lucene_Index_Term(
110                      '/data/doc_dir/' . $filename, 'path'
111                  );
112 $pathQuery = new Zend_Search_Lucene_Search_Query_Term($pathTerm);
114 $query = new Zend_Search_Lucene_Search_Query_Boolean();
115 $query->addSubquery($userQuery, true /* required */);
116 $query->addSubquery($pathQuery, true /* required */);
118 $hits = $index->find($query);
119 ]]></programlisting>
120             </para>
122             <para>
123                 <methodname>Zend_Search_Lucene_Search_QueryParser::parse()</methodname>
124                 メソッドはオプションのパラメータでエンコーディングを受け取ることができます。
125                 ここで、クエリ文字列のエンコーディングを指定します。
126             <programlisting language="php"><![CDATA[
127 $userQuery = Zend_Search_Lucene_Search_QueryParser::parse($queryStr,
128                                                           'iso-8859-5');
129 ]]></programlisting>
130             </para>
132             <para>
133                 エンコーディングを省略した場合は、現在のロケールを使用します。
134             </para>
136             <para>
137                 デフォルトのクエリ文字列エンコーディングを
138                 <methodname>Zend_Search_Lucene_Search_QueryParser::setDefaultEncoding()</methodname>
139                 メソッドで指定することもできます。
140                 <programlisting language="php"><![CDATA[
141 Zend_Search_Lucene_Search_QueryParser::setDefaultEncoding('iso-8859-5');
143 $userQuery = Zend_Search_Lucene_Search_QueryParser::parse($queryStr);
144 ]]></programlisting>
145             </para>
147             <para>
148                 <methodname>Zend_Search_Lucene_Search_QueryParser::getDefaultEncoding()</methodname>
149                 は、デフォルトのクエリ文字列エンコーディングを返します
150                 (空文字列は "現在のロケール" を表します)。
151             </para>
152         </sect3>
153     </sect2>
155     <sect2 id="zend.search.lucene.searching.results">
156         <title>検索結果</title>
157         <para>
158             検索結果は <classname>Zend_Search_Lucene_Search_QueryHit</classname> オブジェクトの配列となります。
159             各オブジェクトは、2 つのプロパティを保持しています。
160             <code>$hit->id</code> がインデックス内のドキュメント番号、
161             <code>$hit->score</code> が検索結果のスコアを表します。
162             結果はスコア順に並べられます (スコアの高い結果が最初になります)。
163         </para>
165         <para>
166             <classname>Zend_Search_Lucene_Search_QueryHit</classname> オブジェクトでは、
167             検索結果としてヒットした <classname>Zend_Search_Lucene_Document</classname>
168             の各フィールドも公開しています。
169             この例で、ヒットしたドキュメントには
170             title と author の 2 つのフィールドが含まれています。
171         </para>
172         <programlisting language="php"><![CDATA[
173 $index = Zend_Search_Lucene::open('/data/my_index');
175 $hits = $index->find($query);
177 foreach ($hits as $hit) {
178     echo $hit->score;
179     echo $hit->title;
180     echo $hit->author;
182 ]]></programlisting>
184         <para>
185             保存されたフィールドは、常に UTF-8 エンコーディングで返されます。
186         </para>
188         <para>
189             オプションで、
190             <classname>Zend_Search_Lucene_Search_QueryHit</classname> から元の <classname>Zend_Search_Lucene_Document</classname>
191             を取得できます。
193             保存されたドキュメントを取得するには、
194             インデックスオブジェクトの <code>getDocument()</code>
195             メソッドを使用し、その <code>getFieldValue()</code>
196             メソッドでフィールドの値を取得します。
197         </para>
198         <programlisting language="php"><![CDATA[
199 $index = Zend_Search_Lucene::open('/data/my_index');
201 $hits = $index->find($query);
202 foreach ($hits as $hit) {
203     // ヒットした結果の Zend_Search_Lucene_Document オブジェクトを返します
204     echo $document = $hit->getDocument();
206     // Zend_Search_Lucene_Document から
207     // Zend_Search_Lucene_Field オブジェクトを返します
208     echo $document->getField('title');
210     // Zend_Search_Lucene_Field オブジェクトを値を文字列で返します
211     echo $document->getFieldValue('title');
213     // getFieldValue() と同じです
214     echo $document->title;
216 ]]></programlisting>
217         <para>
218         <classname>Zend_Search_Lucene_Document</classname> オブジェクトで使用可能なフィールドは、
219         インデックス化の際に決まります。ドキュメントのフィールドは、
220         インデックス化用アプリケーション (例えば LuceneIndexCreation.jar)
221         によってインデックス化、あるいはインデックス化して保存されます。
222         </para>
224         <para>
225         ドキュメントを識別するフィールド (例では 'path')
226         もインデックス化して取得できるようにしなければならないことに注意しましょう。
227         </para>
228     </sect2>
230     <sect2 id="zend.search.lucene.searching.results-limiting">
231         <title>結果の制限</title>
233         <para>
234             検索処理の中でいちばん時間がかかるのが、スコアの計算です。
235             検索結果の数が多い (数万件程度) 場合、これには数秒程度かかることもあります。
236         </para>
238         <para>
239             <classname>Zend_Search_Lucene</classname> では、結果セットの件数を制限するためのメソッドとして
240             <code>getResultSetLimit()</code> と
241             <code>setResultSetLimit()</code> を用意しています。
242             <programlisting language="php"><![CDATA[
243 $currentResultSetLimit = Zend_Search_Lucene::getResultSetLimit();
245 Zend_Search_Lucene::setResultSetLimit($newLimit);
246 ]]></programlisting>
247             0 (デフォルト値) は、'制限しない' という意味です。
248         </para>
250         <para>
251             このメソッドが返す結果は、'スコアの高いほうから N 件' ではなく
252             あくまで '最初の N 件'
253             <footnote><para>
254                 しかし、返される結果はスコア順 (あるいはその他指定した順)
255                 で並べ替えられています。
256             </para></footnote>
257             です。
258         </para>
259     </sect2>
261     <sect2 id="zend.search.lucene.searching.results-scoring">
262         <title>結果の重み付け</title>
263         <para>
264             <classname>Zend_Search_Lucene</classname> は、Java Lucene と同じ重み付けアルゴリズムを使用します。
265             検索結果に一致したものが、デフォルトで重み順に並べ替えられます。スコアの高いものが先頭となり、
266             スコアの高いもののほうが低いものよりクエリにマッチするようになります。
267         </para>
269         <para>
270             大雑把に言うと、文書の中に検索語句が頻繁に登場するほどスコアが高くなります。
271         </para>
273         <para>
274             検索結果のスコアを取得するには <code>score</code> プロパティを使用します。
275         </para>
276         <programlisting language="php"><![CDATA[
277 $hits = $index->find($query);
279 foreach ($hits as $hit) {
280     echo $hit->id;
281     echo $hit->score;
283 ]]></programlisting>
285         <para>
286             重みを計算するために使用されるのが
287             <classname>Zend_Search_Lucene_Search_Similarity</classname> クラスです。詳細は
288             <link linkend="zend.search.lucene.extending.scoring">拡張性
289             - 重み付けのアルゴリズム</link> を参照ください。
290         </para>
292     </sect2>
294     <sect2 id="zend.search.lucene.searching.sorting">
295         <title>検索結果の並べ替え</title>
296         <para>
297             検索結果は、デフォルトではスコアで並べ替えられます。
298             これを変更するには、並べ替え用の (ひとつあるいは複数の)
299             フィールドと並べ替えの形式、そして並べ替えの方向をパラメータで指定します。
300         </para>
302         <para>
303             <code>$index->find()</code> のコール時に、オプションのパラメータを指定できます。
304             <programlisting language="php"><![CDATA[
305 $index->find($query [, $sortField [, $sortType [, $sortOrder]]]
306                     [, $sortField2 [, $sortType [, $sortOrder]]]
307              ...);
308 ]]></programlisting>
309         </para>
311         <para>
312             <code>$sortField</code> は、結果の並べ替えを行う保存されたフィールドの名前です。
313         </para>
315         <para>
316             <code>$sortType</code> は省略可能です。
317             <code>SORT_REGULAR</code> (通常の並べ替え。デフォルト)、
318             <code>SORT_NUMERIC</code> (数値として並べ替え)、
319             <code>SORT_STRING</code> (文字列として並べ替え) のいずれかとなります。
320         </para>
322         <para>
323             <code>$sortOrder</code> は省略可能です。
324             <code>SORT_ASC</code> (昇順で並べ替え。デフォルト)、
325             <code>SORT_DESC</code> (降順で並べ替え) のいずれかとなります。
326         </para>
328         <para>
329             例を以下に示します。
330             <programlisting language="php"><![CDATA[
331 $index->find($query, 'quantity', SORT_NUMERIC, SORT_DESC);
332 ]]></programlisting>
333             <programlisting language="php"><![CDATA[
334 $index->find($query, 'fname', SORT_STRING, 'lname', SORT_STRING);
335 ]]></programlisting>
336             <programlisting language="php"><![CDATA[
337 $index->find($query, 'name', SORT_STRING, 'quantity', SORT_NUMERIC, SORT_DESC);
338 ]]></programlisting>
339         </para>
341         <para>
342             デフォルト以外の並び順を使用する際には注意しましょう。
343             並べ替えのためにはドキュメント全体をインデックスから読み込む必要があり、
344             検索のパフォーマンスが著しく低下してしまいます。
345         </para>
346     </sect2>
348     <sect2 id="zend.search.lucene.searching.highlighting">
349         <title>検索結果の強調</title>
350         <para>
351             <classname>Zend_Search_Lucene</classname> では、2 とおりの方法で検索結果を強調させることができます。
352         </para>
353         <para>
354             まず最初の方法が、<classname>Zend_Search_Lucene_Document_Html</classname> クラス
355             (詳細は <link linkend="zend.search.lucene.index-creation.html-documents">HTML ドキュメントの節</link>
356             を参照ください) を用いて次のようにすることです。
357             <programlisting language="php"><![CDATA[
359  * テキストを指定した色で強調する
361  * @param string|array $words
362  * @param string $colour
363  * @return string
364  */
365 public function highlight($words, $colour = '#66ffff');
366 ]]></programlisting>
367             <programlisting language="php"><![CDATA[
369  * テキストを、指定したビューヘルパーあるいはコールバック関数で強調する
371  * @param string|array $words  強調したい単語。配列あるいは文字列で指定します
372  * @param callback $callback   コールバックメソッド。テキストの変換 (強調) に使用します
373  * @param array    $params     コールバックのパラメータとして渡す配列
374  *                             (最初の必須パラメータは、強調させる HTML 片となります)
375  * @return string
376  * @throws Zend_Search_Lucene_Exception
377  */
378 public function highlightExtended($words, $callback, $params = array())
379 ]]></programlisting>
380         </para>
381         <para>
382             強調方法をカスタマイズするには <code>highlightExtended()</code>
383             メソッドにコールバックを指定して使用します。このコールバックは、ひとつ以上のパラメータを受け取ります
384             <footnote><para>最初のパラメータは強調対象の HTML 片、
385             そしてその他のパラメータはコールバックの振る舞いによって変わります。
386             返り値は、強調済みの HTML 片となります。</para></footnote>。
387             あるいは、<classname>Zend_Search_Lucene_Document_Html</classname> クラスを継承して
388             <code>applyColour($stringToHighlight, $colour)</code> メソッドを再定義することもできます。
389             このメソッドは、デフォルトの強調コールバックとして用いられるものです。
390             <footnote>
391                 <para>
392                     どちらの場合についても、返される HTML は自動的に正しい <acronym>XHTML</acronym> 形式に変換されます。
393                 </para>
394             </footnote>
395         </para>
396         <para>
397             <link linkend="zend.view.helpers">ビューヘルパー</link> も、ビュースクリプトのコンテキストでコールバックとして使えます。
398             <programlisting language="php"><![CDATA[
399 $doc->highlightExtended('word1 word2 word3...', array($this, 'myViewHelper'));
400 ]]></programlisting>
401         </para>
402         <para>
403             強調した結果を取得するには <code>Zend_Search_Lucene_Document_Html->getHTML()</code> メソッドを使用します。
404         </para>
406         <note>
407             <para>
408                 強調処理は、現在の解析器を使って行われます。つまり、解析器が理解するすべての形式の単語が強調されます。
409             </para>
410             <para>
411                 たとえば、大文字小文字を区別しない解析器を使っている場合に 'text' を強調するよう指定すると、
412                 'text' や 'Text' そして 'TEXT' といった単語も強調されます。
413             </para>
414             <para>
415                 同様に、語幹抽出機能を持つ解析器を使っている場合に 'indexed' を強調するよう指定すると、
416                 'index' や 'indexing' そして 'indices' といった単語も強調されます。
417             </para>
418             <para>
419                 一方、現在の解析器が処理をスキップするような単語
420                 (短い単語に対するフィルタが解析器に適用されている場合など)
421                 は、なにも強調されません。
422             </para>
423         </note>
425         <para>
426             もうひとつの方法は、
427             <code>Zend_Search_Lucene_Search_Query->highlightMatches(string $inputHTML[, Zend_Search_Lucene_Search_Highlighter_Interface $highlighter])</code>
428             メソッドを使うことです。
429             <programlisting language="php"><![CDATA[
430 $query = Zend_Search_Lucene_Search_QueryParser::parse($queryStr);
431 $highlightedHTML = $query->highlightMatches($sourceHTML);
432 ]]></programlisting>
433         </para>
434         <para>
435             オプションの 2 番目のパラメータは、
436             デフォルトの HTML ドキュメントエンコーディングです。
437             省略した場合は、Content-type HTTP-EQUIV meta タグを使用します。
438         </para>
439         <para>
440             オプションの 3 番目のパラメータは、
441             <classname>Zend_Search_Lucene_Search_Highlighter_Interface</classname>
442             インターフェイスを実装したオブジェクトです。
443             <programlisting language="php"><![CDATA[
444 interface Zend_Search_Lucene_Search_Highlighter_Interface
446     /**
447      * 強調対象の文書を設定します
448      *
449      * @param Zend_Search_Lucene_Document_Html $document
450      */
451     public function setDocument(Zend_Search_Lucene_Document_Html $document);
453     /**
454      * 強調対象の文書を取得します
455      *
456      * @return Zend_Search_Lucene_Document_Html $document
457      */
458     public function getDocument();
460     /**
461      * 指定した単語を強調します (サブクエリ単位でこのメソッドが起動されます)
462      *
463      * @param string|array $words  強調したい単語。配列あるいは文字列で指定します
464      */
465     public function highlight($words);
467 ]]></programlisting>
468             ここでの <classname>Zend_Search_Lucene_Document_Html</classname> オブジェクトは、
469             <classname>Zend_Search_Lucene_Search_Query->highlightMatches()</classname> メソッドに渡された
470             HTML から作成されるオブジェクトです。
471         </para>
472         <para>
473             <code>$highlighter</code> パラメータを省略すると、
474             <classname>Zend_Search_Lucene_Search_Highlighter_Default</classname>
475             オブジェクトのインスタンスを作成してそれを使用します。
476         </para>
477         <para>
478             <code>highlight()</code> メソッドはサブクエリ単位で起動されるので、
479             サブクエリ単位で異なる強調処理を行うことができます。
480         </para>
481         <para>
482             実際のところ、デフォルトの処理は定義済みの色テーブルを使用しているだけです。
483             自前の強調処理を実装することもできますし、デフォルトの処理を継承して色テーブルだけを再定義することもできます。
484         </para>
485         <para>
486             <code>Zend_Search_Lucene_Search_Query->htmlFragmentHighlightMatches()</code>
487             も同じような動きをします。唯一の違いは、入力を受け取って、
488             &lt;>HTML>, &lt;HEAD>, &lt;BODY> tags タグを含まない HTML 片を返すことです。
489             それでも、返される HTML 片は自動的に正しい <acronym>XHTML</acronym> に変換されます.
490         </para>
491     </sect2>
492 </sect1>