Zend_Search_Lucene-Advanced.xml 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!-- EN-Revision: 14448 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.search.lucene.advanced">
  5. <title>Avancé</title>
  6. <sect2 id="zend.search.lucene.advanced.format_migration">
  7. <title>Depuis Zend Framework 1.6, gestion des transformations de format d'index.</title>
  8. <para><classname>Zend_Search_Lucene</classname> fonctionne avec les index Lucene Java 1.4-1.9, 2.1 et 2.3.</para>
  9. <para>Le format actuel de l'index peut être obtenu par <code>$index-&gt;getFormatVersion()</code>. Ceci retourne
  10. une de ces valeurs : <itemizedlist>
  11. <listitem>
  12. <para><classname>Zend_Search_Lucene::FORMAT_PRE_2_1</classname> pour le format 1.4-1.9.</para>
  13. </listitem>
  14. <listitem>
  15. <para><classname>Zend_Search_Lucene::FORMAT_2_1</classname> pour le format 2.1 (utilisé aussi pour
  16. 2.2).</para>
  17. </listitem>
  18. <listitem>
  19. <para><classname>Zend_Search_Lucene::FORMAT_2_3</classname> pour le format 2.3.</para>
  20. </listitem>
  21. </itemizedlist></para>
  22. <para>Les modifications de l'index n'arrivent <emphasis role="strong">que</emphasis> si une mise à jour de
  23. l'index est faite. Ceci arrive lorsqu'un nouveau document est ajouté à l'index, ou lors de l'optimisation
  24. manuelle de l'index par <code>$index-&gt;optimize()</code>.</para>
  25. <para>Dans un tel cas, Zend_Search_Lucene peut convertir l'index vers une version plus haute. Ceci arrive
  26. <emphasis role="strong">toujours</emphasis> pour le format <classname>Zend_Search_Lucene::FORMAT_PRE_2_1</classname>,
  27. alors transformé en format 2.1.</para>
  28. <para>Vous pouvez gérer ces conversions et notamment le format d'arrivée avec
  29. <code>$index-&gt;setFormatVersion()</code>, qui prend comme paramètre
  30. <classname>Zend_Search_Lucene::FORMAT_2_1</classname> ou <classname>Zend_Search_Lucene::FORMAT_2_3</classname> :<itemizedlist>
  31. <listitem>
  32. <para><classname>Zend_Search_Lucene::FORMAT_2_1</classname> ne fait rien puisque les format pre-2.1 sont
  33. convertis vers ce format (2.1)</para>
  34. </listitem>
  35. <listitem>
  36. <para><classname>Zend_Search_Lucene::FORMAT_2_3</classname> force la conversion vers le format 2.3.</para>
  37. </listitem>
  38. </itemizedlist></para>
  39. <para>Les conversions vers des versions antérieure de formats ne sont pas supportées.</para>
  40. <note>
  41. <title>Important!</title>
  42. <para>Les formats ne peuvent pas être convertis vers des versions antérieures. Gardez une copie de
  43. sauvegarde si ceci s'avère nécessaire, car après une conversion il ne sera plus possible de faire marche
  44. arrière.</para>
  45. </note>
  46. </sect2>
  47. <sect2 id="zend.search.lucene.advanced.static">
  48. <title>Utiliser les propriétés statiques de l'index</title>
  49. <para>L'objet <classname>Zend_Search_Lucene</classname> utilise la méthode de destructeur pour valider ses changements et
  50. faire ses optimisations et nettoyages.</para>
  51. <para>Il stocke les documents ajoutés en mémoire et les vide dans un segment sur le disque en fonction du
  52. paramètre <code>MaxBufferedDocs</code>.</para>
  53. <para>Si la limite <code>MaxBufferedDocs</code> n'est pas atteinte, alors il y aura des documents non
  54. sauvegardés qui seront sauvés comme nouveau segment lors de la destruction de l'objet. La procédure
  55. d'optimisation automatique est lancée si nécessaire, cela dépend des paramètres <code>MaxBufferedDocs</code>,
  56. <code>MaxMergeDocs</code> et <code>MergeFactor</code>.</para>
  57. <para>Les propriétés statiques d'un objet sont détruites <emphasis>après</emphasis> la dernière ligne de code
  58. exécutée. <programlisting role="php"><![CDATA[
  59. class Searcher {
  60. private static $_index;
  61. public static function initIndex() {
  62. self::$_index = Zend_Search_Lucene::open('path/to/index');
  63. }
  64. }
  65. Searcher::initIndex();
  66. ]]></programlisting></para>
  67. <para>Aussi, le destructeur est correctement invoqué à ce point de l'exécution du programme.</para>
  68. <para>Un problème potentiel peut être les exceptions. Celles envoyées dans un destructeur d'un objet statique
  69. n'ont pas de contexte, car le destructeur est appelé après la fin d'exécution du script.</para>
  70. <para>Vous pouvez alors voir une "Fatal error: Exception thrown without a stack frame in Unknown on line 0" au
  71. lieu de l'exception décrivant réellement le contexte.</para>
  72. <para><classname>Zend_Search_Lucene</classname> propose alors un détournement de ce problème avec la méthode
  73. <code>commit()</code>. Elle sauvegarde les changements et libère la mémoire utilisée pour stocker les segments.
  74. Vous pouvez utiliser la méthode commit n'importe quand, même plusieurs fois, pendant l'exécution de votre
  75. script. Vous pouvez aussi continuer à utiliser l'objet <classname>Zend_Search_Lucene</classname> pour rechercher, ajouter
  76. ou supprimer des document, même après une opération de commit (validation). L'appel à <code>commit()</code> est
  77. simplement une sécurité pour éviter les problème d'exception dans le destructeur de
  78. <classname>Zend_Search_Lucene</classname> :<programlisting role="php"><![CDATA[
  79. class Searcher {
  80. private static $_index;
  81. public static function initIndex() {
  82. self::$_index = Zend_Search_Lucene::open('path/to/index');
  83. }
  84. ...
  85. public static function commit() {
  86. self::$_index->commit();
  87. }
  88. }
  89. Searcher::initIndex();
  90. ...
  91. // Script shutdown routine
  92. ...
  93. Searcher::commit();
  94. ...
  95. ]]></programlisting></para>
  96. </sect2>
  97. </sect1>