Zend_Search_Lucene-Advanced.xml 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.search.lucene.advanced">
  5. <title>Erweitert</title>
  6. <sect2 id="zend.search.lucene.advanced.format_migration">
  7. <title>Beginnend mit 1.6, Behandlung von Index Format Veränderungen</title>
  8. <para>
  9. Die <classname>Zend_Search_Lucene</classname> Komponente arbeitet mit den Index Formaten
  10. der Java Lucene Version 1.4-1.9, 2.1 und 2.3.
  11. </para>
  12. <para>
  13. Das aktuelle Indexformat kann durch den Aufruf von
  14. <code>$index->getFormatVersion()</code> abgefragt werden. Er gibt eine der folgenden
  15. Werte zurück:
  16. <itemizedlist>
  17. <listitem>
  18. <para>
  19. <constant>Zend_Search_Lucene::FORMAT_PRE_2_1</constant> für das Java
  20. Lucene Index Format 1.4-1.9.
  21. </para>
  22. </listitem>
  23. <listitem>
  24. <para>
  25. <constant>Zend_Search_Lucene::FORMAT_2_1</constant> für das Java Lucene
  26. Index Format 2.1 (es wird auch in Lucene 2.2 verwendet).
  27. </para>
  28. </listitem>
  29. <listitem>
  30. <para>
  31. <constant>Zend_Search_Lucene::FORMAT_2_3</constant> für das Java Lucene
  32. Index Format 2.3.
  33. </para>
  34. </listitem>
  35. </itemizedlist>
  36. </para>
  37. <para>
  38. Indexveränderungen werden <emphasis>nur</emphasis> durchgeführt wenn irgendein
  39. Update des Index durchgeführt wird. Das passiert wenn ein neues Dokument zu einem Index
  40. hinzugefügt wird, oder wenn manuell eine Indexoptimierung durch den Aufruf von
  41. <code>$index->optimize()</code> gestartet wird.
  42. </para>
  43. <para>
  44. In solch einem Fall kann <classname>Zend_Search_Lucene</classname> den Index in eine
  45. höhere Formatversion konvertieren. Das geschieht <emphasis>immer</emphasis> für Indezes
  46. welche im <constant>Zend_Search_Lucene::FORMAT_PRE_2_1</constant> sind. Diese werden
  47. automatisch ins Format 2.1 konvertiert.
  48. </para>
  49. <para>
  50. Man kann den Konvertierungsprozess managen und Ziel-Indexformate durch
  51. <code>$index->setFormatVersion()</code> zuweisen welches entweder die
  52. <constant>Zend_Search_Lucene::FORMAT_2_1</constant> oder
  53. <constant>Zend_Search_Lucene::FORMAT_2_3</constant> Konstante entgegennimmt:
  54. <itemizedlist>
  55. <listitem>
  56. <para>
  57. <constant>Zend_Search_Lucene::FORMAT_2_1</constant> macht eigentlich gar
  58. nichts da pre-2.1 Indezes automatisch in das 2.1 Format konvertiert werden.
  59. </para>
  60. </listitem>
  61. <listitem>
  62. <para>
  63. <constant>Zend_Search_Lucene::FORMAT_2_3</constant> erzwingt die
  64. Konvertierung ins 2.3 Format.
  65. </para>
  66. </listitem>
  67. </itemizedlist>
  68. </para>
  69. <para>
  70. Rückwärts Konvertierungen werden nicht unterstützt.
  71. </para>
  72. <note>
  73. <title>Wichtig!</title>
  74. <para>
  75. Sobald Indezes in eine höhere Version konvertiert wurden können Sie nicht zurück
  76. konvertiert werden. Deswegen sollte man ein Backup der Indezes machen wenn man plant
  77. zu einer höheren Version zu migrieren, man aber die Möglichkeit haben will wieder
  78. zurückzugehen.
  79. </para>
  80. </note>
  81. </sect2>
  82. <sect2 id="zend.search.lucene.advanced.static">
  83. <title>Den Index als statische Eigenschaft verwenden</title>
  84. <para>
  85. Das <classname>Zend_Search_Lucene</classname> Objekt verwendet einen Objekt Destruktor
  86. um Änderungen mitzuteilen und um Ressourcen zu löschen.
  87. </para>
  88. <para>
  89. Es speichert hinzugefügte Dokumente im Speicher und speichert neu indizierte Segmente
  90. auf die Platte abhängig vom <code>MaxBufferedDocs</code> Parameter.
  91. </para>
  92. <para>
  93. Wenn das <code>MaxBufferedDocs</code> Limit nicht erreicht wird, gibt es einige
  94. "ungespeicherte" Dokumente welche als neue Segmente in der Destruktor Methode des
  95. Objektes gespeichert werden. Die automatische Optimierungsprozedur des Index wird
  96. aufgerufen wenn das notwendig wird, abhängig von den <code>MaxBufferedDocs</code>,
  97. <code>MaxMergeDocs</code> und <code>MergeFactor</code> Parametern.
  98. </para>
  99. <para>
  100. Statische Objekteigenschaften (siehe anbei) werden <emphasis>nach</emphasis> der letzten
  101. Zeile des ausgeführten Skripts vernichtet.
  102. </para>
  103. <programlisting language="php"><![CDATA[
  104. class Searcher {
  105. private static $_index;
  106. public static function initIndex() {
  107. self::$_index = Zend_Search_Lucene::open('path/to/index');
  108. }
  109. }
  110. Searcher::initIndex();
  111. ]]></programlisting>
  112. <para>
  113. Auf die gleiche Art und Weise wird der Objektdestruktor für statische Eigenschaften an
  114. dieser Stelle des Programablaufes korrekt aufgerufen.
  115. </para>
  116. <para>
  117. Ein potentielles Problem ist die Behandlung von Ausnahmen. Ausnahmen die vom Destruktor
  118. eines statischen Objekts geworfen werden haben keinen Inhalt, weil der Destruktor
  119. ausgeführt wird nachdem das Skript bereits beendet wurde.
  120. </para>
  121. <para>
  122. Man kann in solchen Fällen eine "Fatal error: Exception thrown without a stack frame in
  123. Unknown on line 0" Fehlermeldung statt der Beschreibung einer Ausnahme sehen.
  124. </para>
  125. <para>
  126. <classname>Zend_Search_Lucene</classname> bietet einen Workaround zu diesem Problem, mit
  127. der <methodname>commit()</methodname> Methode, an. Diese speichert alle ungespeicherten
  128. Änderungen und leert den Speicher der für das Speichern der neuen Segmente verwendet
  129. wird. Man kann die commit Operation jederzeit oder auch mehrmals während der Ausführung
  130. des Skripts anwenden. Man kann das <classname>Zend_Search_Lucene</classname> Objekt
  131. trotzdem für das suchen, hinzufügen oder löschen von Dokumenten nach der commit
  132. Operation verwenden. Aber der Aufruf von <methodname>commit()</methodname> garantiert,
  133. das wenn nach dem Aufruf von <methodname>commit()</methodname> keine Dokumente
  134. hinzugefügt oder gelöscht werden, der Destruktor von
  135. <classname>Zend_Search_Lucene</classname> nichts zu tun hat, und er deswegen keine
  136. Ausnahme wirft:
  137. </para>
  138. <programlisting language="php"><![CDATA[
  139. class Searcher {
  140. private static $_index;
  141. public static function initIndex() {
  142. self::$_index = Zend_Search_Lucene::open('path/to/index');
  143. }
  144. ...
  145. public static function commit() {
  146. self::$_index->commit();
  147. }
  148. }
  149. Searcher::initIndex();
  150. ...
  151. // Sktipt Shutdorn Routine
  152. ...
  153. Searcher::commit();
  154. ...
  155. ]]></programlisting>
  156. </sect2>
  157. </sect1>