1 <?xml version="1.0" encoding="UTF-8"?>
3 <!-- EN-Revision: 20854 -->
4 <sect1 id="zend.search.lucene.advanced">
7 <sect2 id="zend.search.lucene.advanced.format_migration">
8 <title>1.6 以降でサポートするインデックスフォーマット変換</title>
11 <classname>Zend_Search_Lucene</classname> コンポーネントは、Java Lucene 1.4-1.9、2.1 そして 2.3
12 形式のインデックスフォーマットに対応しています。
16 現在のインデックスフォーマットを知るには <code>$index->getFormatVersion()</code>
17 を使用します。これは、次のいずれかの値を返します。
21 <constant>Zend_Search_Lucene::FORMAT_PRE_2_1</constant> は
22 Java Lucene 1.4-1.9 のインデックスフォーマットを表します。
27 <constant>Zend_Search_Lucene::FORMAT_2_1</constant> は
28 Java Lucene 2.1 のインデックスフォーマット
29 (Lucene 2.2 でも使用可能) を表します。
34 <constant>Zend_Search_Lucene::FORMAT_2_3</constant> は
35 Java Lucene 2.3 のインデックスフォーマットを表します。
42 インデックスの変更は、インデックスが更新されたときに <emphasis>のみ</emphasis>
43 行います。インデックスの更新が行われるのは、
44 新しいドキュメントがインデックスに追加された場合や
45 <code>$index->optimize()</code> による最適化を手動で開始した場合です。
49 <classname>Zend_Search_Lucene</classname> が、インデックスを上位バージョンのフォーマットに変換することがあります。
50 <constant>Zend_Search_Lucene::FORMAT_PRE_2_1</constant> フォーマットの場合はこれが
51 <emphasis>常に</emphasis> 起こり、
52 自動的に 2.1 フォーマットに変換されます。
56 変換作業を管理するために、対象となるインデックスフォーマットを
57 <code>$index->setFormatVersion()</code> で指定できます。ここでは定数
58 <constant>Zend_Search_Lucene::FORMAT_2_1</constant> あるいは <constant>Zend_Search_Lucene::FORMAT_2_3</constant>
63 <constant>Zend_Search_Lucene::FORMAT_2_1</constant> は実際には何もしません。
64 2.1 より前のバージョンのインデックスは自動的に
70 <constant>Zend_Search_Lucene::FORMAT_2_3</constant>
71 は、強制的に 2.3 フォーマットへの変換を行います。
78 下位バージョンへの変換はサポートしていません。
84 一度インデックスを上位バージョンに変換してしまうと、
86 上位バージョンに変換したいけれど元に戻す可能性も残しておきたいという場合は、
87 インデックスのバックアップを取得しておきましょう。
93 <sect2 id="zend.search.lucene.advanced.static">
94 <title>静的プロパティとしてのインデックスの使用</title>
97 <classname>Zend_Search_Lucene</classname> オブジェクトは、
98 デストラクタメソッド内で変更のコミットやリソースの後始末を行います。
102 パラメータ <code>MaxBufferedDocs</code>
103 の内容に応じて、メモリ内に追加されたドキュメントを保存したり
104 新しいインデックスセグメントをディスクに書き出したりします。
108 もし <code>MaxBufferedDocs</code> の制限に達していない場合は "保存されていない"
110 これがオブジェクトのデストラクタで新しいセグメントとして保存されます。
112 <code>MaxBufferedDocs</code>、<code>MaxMergeDocs</code> および
113 <code>MergeFactor</code> の設定内容により、必要に応じて行われます。
117 静的オブジェクトプロパティ (以下を参照ください) は、
118 "スクリプトが最後まで実行された" <emphasis>後で</emphasis> 破棄されます。
120 <programlisting language="php"><![CDATA[
122 private static $_index;
124 public static function initIndex() {
125 self::$_index = Zend_Search_Lucene::open('path/to/index');
129 Searcher::initIndex();
134 にもかかわらず、静的プロパティのオブジェクトのデストラクタは正常に起動し、
135 やるべきことをすべて行う可能性があります。
139 問題が起こる可能性があるとすれば、例外処理です。
140 静的オブジェクトのデストラクタでスローされた例外は、コンテキストを保持していません。
141 というのも、"スクリプトが最後まで実行された後" に実行されるものだからです。
146 "Fatal error: Exception thrown without a stack frame in Unknown on line 0"
147 のようなエラーメッセージが表示されるでしょう。
151 <classname>Zend_Search_Lucene</classname> は、この問題を <methodname>commit()</methodname>
152 メソッドで処理できるようにしています。これは、未保存の変更内容をすべて保存し、
153 新しいセグメントを保存するために使用しているメモリを解放します。
154 コミット操作は、スクリプトの実行中にいつでも何度でも行うことができます。
155 <classname>Zend_Search_Lucene</classname> オブジェクトを使用して、
156 コミット操作の後にもドキュメントの検索や追加、削除ができます。
157 しかし <methodname>commit()</methodname> をコールすることで、
158 もしそれ以降ドキュメントの追加や削除が行われていないのなら
159 <classname>Zend_Search_Lucene</classname> のデストラクタは何もせず、
162 <programlisting language="php"><![CDATA[
164 private static $_index;
166 public static function initIndex() {
167 self::$_index = Zend_Search_Lucene::open('path/to/index');
172 public static function commit() {
173 self::$_index->commit();
177 Searcher::initIndex();