<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 24249 -->
<!-- Reviewed: no -->
<sect1 id="zend.search.lucene.advanced">
    <title>Avancé</title>

    <sect2 id="zend.search.lucene.advanced.format_migration">
        <title>Depuis Zend Framework 1.6, gestion des transformations de format d'index</title>

        <para>
            <classname>Zend_Search_Lucene</classname> fonctionne avec les index Lucene Java
            1.4-1.9, 2.1 et 2.3.
        </para>

        <para>
            Le format actuel de l'index peut être obtenu par
            <code>$index-&gt;getFormatVersion()</code>. Ceci retourne une de ces valeurs :
            <itemizedlist>
                    <listitem>
                    <para>
                        <classname>Zend_Search_Lucene::FORMAT_PRE_2_1</classname> pour le
                        format 1.4-1.9.
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <classname>Zend_Search_Lucene::FORMAT_2_1</classname> pour le format
                        2.1 (utilisé aussi pour 2.2).
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <classname>Zend_Search_Lucene::FORMAT_2_3</classname> pour le format
                        2.3.
                    </para>
                </listitem>
                </itemizedlist>
            </para>

        <para>
            Les modifications de l'index n'arrivent <emphasis>que</emphasis> si une mise à
            jour de l'index est faite. Ceci arrive lorsqu'un nouveau document est ajouté à l'index,
            ou lors de l'optimisation manuelle de l'index par
            <code>$index-&gt;optimize()</code>.
        </para>

        <para>
            Dans un tel cas, Zend_Search_Lucene peut convertir l'index vers une version plus
            haute. Ceci arrive <emphasis>toujours</emphasis> pour le format
            <classname>Zend_Search_Lucene::FORMAT_PRE_2_1</classname>, alors transformé en format
            2.1.
        </para>

        <para>
            Vous pouvez gérer ces conversions et notamment le format d'arrivée avec
            <code>$index-&gt;setFormatVersion()</code>, qui prend comme paramètre
            <classname>Zend_Search_Lucene::FORMAT_2_1</classname> ou
            <classname>Zend_Search_Lucene::FORMAT_2_3</classname> :<itemizedlist>
                    <listitem>
                    <para>
                        <classname>Zend_Search_Lucene::FORMAT_2_1</classname> ne fait rien
                        puisque les format pre-2.1 sont convertis vers ce format (2.1)
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <classname>Zend_Search_Lucene::FORMAT_2_3</classname> force la
                        conversion vers le format 2.3.
                    </para>
                </listitem>
                </itemizedlist>
            </para>

        <para>
            Les conversions vers des versions antérieure de formats ne sont pas
            supportées.
        </para>

        <note>
            <title>Important!</title>

            <para>
                Les formats ne peuvent pas être convertis vers des versions antérieures.
                Gardez une copie de sauvegarde si ceci s'avère nécessaire, car après une conversion
                il ne sera plus possible de faire marche arrière.
            </para>
        </note>
    </sect2>

    <sect2 id="zend.search.lucene.advanced.static">
        <title>Utiliser les propriétés statiques de l'index</title>

        <para>
            L'objet <classname>Zend_Search_Lucene</classname> utilise la méthode de
            destructeur pour valider ses changements et faire ses optimisations et
            nettoyages.
        </para>

        <para>
            Il stocke les documents ajoutés en mémoire et les vide dans un segment sur le
            disque en fonction du paramètre <code>MaxBufferedDocs</code>.
        </para>

        <para>
            Si la limite <code>MaxBufferedDocs</code> n'est pas atteinte, alors il y aura des
            documents non sauvegardés qui seront sauvés comme nouveau segment lors de la destruction
            de l'objet. La procédure d'optimisation automatique est lancée si nécessaire, cela
            dépend des paramètres <code>MaxBufferedDocs</code>, <code>MaxMergeDocs</code> et
            <code>MergeFactor</code>.
        </para>

        <para>
            Les propriétés statiques d'un objet sont détruites <emphasis>après</emphasis> la
            dernière ligne de code exécutée. <programlisting language="php"><![CDATA[
class Searcher {
    private static $_index;

    public static function initIndex() {
        self::$_index = Zend_Search_Lucene::open('path/to/index');
    }
}

Searcher::initIndex();
]]></programlisting></para>

        <para>
            Aussi, le destructeur est correctement invoqué à ce point de l'exécution du
            programme.
        </para>

        <para>
            Un problème potentiel peut être les exceptions. Celles envoyées dans un
            destructeur d'un objet statique n'ont pas de contexte, car le destructeur est appelé
            après la fin d'exécution du script.
        </para>

        <para>
            Vous pouvez alors voir une "Fatal error: Exception thrown without a stack frame in
            Unknown on line 0" au lieu de l'exception décrivant réellement le contexte.
        </para>

        <para>
            <classname>Zend_Search_Lucene</classname> propose alors un détournement de ce
            problème avec la méthode <methodname>commit()</methodname>. Elle sauvegarde les changements et
            libère la mémoire utilisée pour stocker les segments. Vous pouvez utiliser la méthode
            commit n'importe quand, même plusieurs fois, pendant l'exécution de votre script. Vous
            pouvez aussi continuer à utiliser l'objet <classname>Zend_Search_Lucene</classname> pour
            rechercher, ajouter ou supprimer des document, même après une opération de commit
            (validation). L'appel à <methodname>commit()</methodname> est simplement une sécurité pour éviter
            les problème d'exception dans le destructeur de
            <classname>Zend_Search_Lucene</classname> :<programlisting language="php"><![CDATA[
class Searcher {
    private static $_index;

    public static function initIndex() {
        self::$_index = Zend_Search_Lucene::open('path/to/index');
    }

    ...

    public static function commit() {
        self::$_index->commit();
    }
}

Searcher::initIndex();

...

// Script shutdown routine
...
Searcher::commit();
...
]]></programlisting></para>
        </sect2>
    </sect1>