Zend_Search_Lucene-Advanced.xml 7.2 KB

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