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

    <para>
        Um <classname>Zend_Search_Lucene</classname>'s Mögichkeiten mit maximaler Performance
        kompett anzuwenden, muss man die interne Struktur des Index verstehen.
    </para>

    <para>
        Ein <emphasis>index</emphasis> wird als Set von Dateien in einem einzelnen Verzeichnis
        gespeichert.
    </para>

    <para>
        Ein <emphasis>index</emphasis> besteht auf einer beliebigen Anzahl von unabhängigen
        <emphasis>Segmenten</emphasis> welche Informationen über ein Subset von indizierten
        Dokumenten speichern. Jedes <emphasis>Segment</emphasis> hat sein eigenes
        <emphasis>Wörterbuch an Ausdrücken</emphasis>, Ausdrucks Wörterbuch Indezes, und Dokument
        Speicher (speichert Feld Werte)
        <footnote>
            <para>
                Beginnend mit Lucene 2.3, können Dokument Speicherdateien zwischen Segmenten geteilt
                werden; trotzdem verwendet <classname>Zend_Search_Lucene</classname> diese
                Möglichkeit nicht
            </para>
        </footnote>.
        Alle Segmentdaten werden in <filename>_xxxxx.cfs</filename> Dateien gespeichert, wobei
        <emphasis>xxxxx</emphasis> der Name des Segments ist.
    </para>

    <para>
        Sobald die Index Segment Datei erstellt wurde kann Sie nicht mehr aktualisiert werden. Neue
        Dokumente werden in neuen Segmenten hinzugefügt. Gelöschte Dokumente werden nur in einer
        optionalen <filename>&lt;segmentname&gt;.del</filename> Datei als gelöscht markiert.
    </para>

    <para>
        Die Aktualisierung von Dokumenten wird als seperate Lösch- und Hinzufüge Operation
        durchgeführt selbst wenn Sie als <acronym>API</acronym> Aufruf mit
        <methodname>update()</methodname> durchgeführt wird <footnote><para>Dieser Aufruf wird
        aktuell nur von Java Lucene unterstützt, es ist aber geplant die
        <classname>Zend_Search_Lucene</classname> <acronym>API</acronym> mit Ähnlicher
        Funktionalität zu erweitern</para></footnote>. Das vereinfacht das hinzufügen neuer
        Dokumente und erlaubt das Aktualisieren gleichzeitig mit Such Operationen.
    </para>

    <para>
        Auf der anderen Seite verlängert die Verwendung mehrerer Segmente (ein Dokument pro Segment
        als extremster Fall) die Suchzeit:
    </para>

    <itemizedlist>
        <listitem>
            <para>
                Das Empfangen von Ausdrücken von einem Verzeichnis wird für jedes Segment
                durchgeführt;
            </para>
        </listitem>

        <listitem>
            <para>
                Der Index des Ausdrucks Verzeichnisses wird für jedes Segment vorgeladen (dieser
                Prozess nimmt für einfache Abfragen die meiste Zeit in Anspruch, und er benötigt
                auch zusätzlichen Speicher).
            </para>
        </listitem>
    </itemizedlist>

    <para>
        Wenn das Ausdrucks Verzeichnis einen Wendepunkt erreicht, dann ist die Suche durch ein
        Segment <emphasis>N</emphasis> in den meisten Fällen mal schneller als die Suche durch
        <emphasis>N</emphasis> Segmente.
    </para>

    <para>
        <emphasis>Index Optimierung</emphasis> verbindet zwei oder mehr Segmente in ein einzelnes
        Segment. Ein neues Segment wird der Liste der Index Segmente hinzugefügt, und alte Segmente
        werden ausgeschlossen.
    </para>

    <para>
        Aktualisierungen von Segment Listen werden als atomsche Operation durchgeführt. Das gibt
        die Möglichkeit gleichzeitig neue Dokumente hinzuzufügen, Index Operationen durchzuführen,
        und den Index zu durchsuchen.
    </para>

    <para>
        Die automatische Optimierung des Index wird nach jeder Segment Erzeugung durchgeführt. Sie
        verbindet Sets der kleinsten Segmente in größere Segmente, und größere Segmente in noch
        größere Segmente, wenn wir genug Segmente zum verbinden haben.
    </para>

    <para>
        Die automatische Optimierung wird von drei Optionen kontrolliert:
    </para>

    <itemizedlist>
        <listitem>
            <para>
                <emphasis>MaxBufferedDocs</emphasis> (die minimale Anzahl an notwendigen Dokumenten
                bevor die im Speicher gepufferten Dokumente in ein neues Segment geschrieben
                werden);
            </para>
        </listitem>

        <listitem>
            <para>
                <emphasis>MaxMergeDocs</emphasis> (die größte Anzahl an Dokumenten die von einer
                Optimierungs Operation verbunden werden); und
            </para>
        </listitem>

        <listitem>
            <para>
                <emphasis>MergeFactor</emphasis> (welcher definiert wie oft Segment Indezes von
                automatischen Optimierungs Operationen verbunden werden).
            </para>
        </listitem>
    </itemizedlist>

    <para>
        Wenn wir pro Skript Ausführung ein Dokument hinzufügen, wird
        <emphasis>MaxBufferedDocs</emphasis> nicht verwendet (es wird nur ein neues Segmente mit nur
        einem Dokument am Ende der Skript Ausführung erstellt, zu einer Zeit zu welcher der
        automatische Optimierungs Prozess startet).
    </para>
</sect1>
