<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 24249 -->
<!-- Reviewed: no -->
<sect1 id="learning.lucene.index-structure">
    <title>Structure d'index Lucene</title>

    <para>
        Afin d'utiliser l'intégralité des fonctionnalités de
        <classname>Zend_Search_Lucene</classname> avec un maximum de performances, il est
        nécessaire que vous compreniez la structure interne d'un index.
    </para>

    <para>
        Un <emphasis>index</emphasis> est stocké dans un ensemble de fichier au sein d'un
        seul répertoire.
    </para>

    <para>
        Un <emphasis>index</emphasis> est un ensemble indépendant de
        <emphasis>segments</emphasis> dans lesquels sont stockées des informations au sujet d'un
        sous-ensemble de documents indexés. Chaque <emphasis>segment</emphasis> a son propre
        <emphasis>dictionnaire de terme</emphasis>, son propre index de dictionnaire de terme, et
        son propre stockage de document (valeur de champ stocké)
        <footnote>
            <para>Depuis Lucene 2.3, les fichiers de stockage de document peuvent être partagés
            entre les segments; cependant, <classname>Zend_Search_Lucene</classname> n'utilise pas
            cette possibilité</para>
        </footnote>.
        Toutes les informations de segments sont stockées dans un fichier
        <filename>_xxxxx.cfs</filename>, où <emphasis>xxxxx</emphasis> est le nom d'un
        segment.
    </para>

    <para>
        Dès qu'un fichier de segment d'index est créé, il ne peut être mis à jour. De
        nouveaux documents sont ajoutés à de nouveaux segments. Les documents supprimés sont
        seulement marqués comme supprimés dans un fichier facultatif
        <filename>&lt;segmentname&gt;.del</filename>.
    </para>

    <para>
        La mise à jour de document est effectuée en tant qu'opérations distincts de
        suppression et d'ajout, même si elle est effectuée en utilisant un appel à
        l'<acronym>API</acronym> <methodname>update()</methodname>
        <footnote>
            <para>Cet appel est fourni uniquement par Java Lucene pour le moment, mais il est prévu
            d'étendre l'<acronym>API</acronym> <classname>Zend_Search_Lucene</classname> avec une
            fonctionnalité similaire</para>
        </footnote>.
        Ceci simplifie l'ajout de nouveaux documents, et permet de mettre à jour
        simultanément à l'aide des opérations de recherche.
    </para>

    <para>
        D'un autre coté, utiliser plusieurs segments (avoir un document par segment est un
        cas exceptionnel) augmente le temps de recherche&#160;:
    </para>

    <itemizedlist>
        <listitem>
            <para>
                La récupération d'un terme depuis le dictionnaire est effectué pour chaque
                segment&#160;;
            </para>
        </listitem>

        <listitem>
            <para>
                Le dictionnaire de terme de l'index est préchargé pour chaque segment (ce
                processus occupe la plupart du temps de recherche pour de simples requêtes et
                nécessite aussi de la mémoire supplémentaire).
            </para>
        </listitem>
    </itemizedlist>

    <para>
        Si les termes du dictionnaires de recherche atteignent un point de saturation, la
        recherche à travers un segment est <emphasis>N</emphasis> fois plus rapide que la recherche
        à travers <emphasis>N</emphasis> segments dans la plupart des cas.
    </para>

    <para>
        <emphasis>L'optimisation d'index</emphasis> fusionne deux segments ou plus en un
        segment unique. Un nouveau segment est ajouté à la liste des segments de l'index, et les
        anciens segments sont exclus.
    </para>

    <para>
        La mise à jour de la liste de segments s'effectue de manière atomique. Ceci donne la
        capacité d'ajouter de nouveaux documents simultanément, d'effectuer des optimisations
        d'index, et de chercher à travers l'index.
    </para>

    <para>
        L'auto-optimisation d'index s'effectue après chaque génération de segment. Elle
        fusionne l'ensemble des plus petits segments en des segments plus grands, et les segments
        plus grands en des segments encore plus grands, si nous avons suffisamment de segments à
        fusionner.
    </para>

    <para>L'auto optimisation d'index est contrôlé par trois options&#160;:</para>

    <itemizedlist>
        <listitem>
            <para>
                <emphasis>MaxBufferedDocs</emphasis> (Le nombre minimal de documents requis
                avant que les documents mis en mémoire tampon soit écrits dans un nouveau
                segment)&#160;;
            </para>
        </listitem>

        <listitem>
            <para>
                <emphasis>MaxMergeDocs</emphasis> (Le plus grand nombre de documents
                fusionnés par une opération d'optimisation)&#160;; et
            </para>
        </listitem>

        <listitem>
            <para>
                <emphasis>MergeFactor</emphasis> (qui détermine la fréquence à laquelle les
                indices de segments sont fusionnés par les opérations d'auto-optimisation).
            </para>
        </listitem>
    </itemizedlist>

    <para>
        Si nous ajoutons un documents par exécution de script,
        <emphasis>MaxBufferedDocs</emphasis> n'est finalement pas utilisé (seul un segment avec un
        seul document est créé à la fin de l'exécution du script, moment auquel démarre le
        processus d'auto-optimisation).
    </para>
</sect1>
