# Indexes Bouwen

## Een Nieuwe Index Maken

De mogelijkheid om nieuwe Indexes te maken en ze up te daten is geïmplementeerd in de Zend_Search_Lucene module en Java Lucene. Je kan beide mogelijkheden gebruiken.

Het volgende PHP code voorbeeld geeft een voorbeeld van hoe een bestand kan worden geïndexeerd door de Zend_Search_Lucene indexing API te gebruiken:

    <?php

    // Het tweede argument naar TRUE zetten maakt een nieuwe index
    $index = new Zend_Search_Lucene('/data/mijn-index', true);

    $doc = new Zend_Search_Lucene_Document();

    // De document URL opslaan om het in het zoekresultaat te identificeren.
    $doc->addField(Zend_Search_Lucene_Field::Text('url', $docUrl));

    // Documentinhoud indexeren
    $doc->addField(Zend_Search_Lucene_Field::UnStored('inhoud', $docContent));

    // Een document aan de index toevoegen.
    $index->addDocument($doc);

    // De veranderingen naar de index schrijven.
    $index->commit();
    ?>

Nieuw toegevoegde documenten kunnen na de commit operatie van de index worden verkregen.

`Zend_Search_Lucene::commit()` wordt automatisch opgeroepen aan het einde van de script uitvoering en vòòr elke zoekopdracht.

Elke oproep van commit() genereert een nieuw index segment. Lucene index segment bestanden zijn niet updatebaar. Segment update noodzaakt een volledige segment reorganisatie. Zie de Lucene index bestandsformaten voor details (http://lucene.apache.org/java/docs/fileformats.html). Het aantal segmenten opvoeren verlaagt de kwaliteit van de index, maar index optimalisatie herstelt dit. Optimalisatie beperkt zich tot het bijeen voegen van verscheidene segmenten in één enkel segment. Dit proces doet geen update van de segmenten. Het genereert een nieuw groot segment, een nieuwe segmentenlijst ('segments.new' bestand) dat het nieuwe segment bevat in plaats van de lijst van oude segmenten, en hernoemt dan het bestand 'segments.new' naar 'segments'. Optimalisatie is een iteratief proces. Vele kleine segmenten (die bijvoorbeeld werden gegenereerd door het toevoegen van een document) worden in een groter samengevoegd en zo verder. Optimalisatie kan met een segment stream werken en verbruikt niet veel geheugen. Samengevat: optimalisatie verbruikt weinig middelen, doet geen lock op de index voor het zoeken, updaten of samenvoegen van andere segmenten. Het moet dus zo weinig mogelijk worden gebruikt. Aan de andere hand, het comitten van een groot aantal documenten in één keer verbruikt meer geheugen.

Automatisch segment management optimalisatie is onderdeel van de toekomstige Zend_Search_Lucene verbeteringen.

## Index Updaten

Dezelfde procedure wordt gebruikt om een bestaande index up te daten. Het enige verschil is dat de index zou moeten worden geopend zonder tweede parameter:

    <?php

    // Een bestaande index openen
    $index = new Zend_Search_Lucene('/data/mijn-index');

    $doc = new Zend_Search_Lucene_Document();

    // Het document URL opslaan om het in het zoekresultaat te identificeren.
    $doc->addField(Zend_Search_Lucene_Field::Text('url', $docUrl));

    // Documentinhoud indexeren
    $doc->addField(Zend_Search_Lucene_Field::UnStored('inhoud', $docContent));

    // Een document aan de index toevoegen.
    $index->addDocument($doc);

    // De veranderingen naar de index schrijven.
    $index->commit();
    ?>

Elke oproep (impliciet of expliciet) aan commit() genereert een nieuw index segment.

Zend_Search_Lucene beheert segmenten niet automatisch. Je moet dus rekening houden met segmentgroottes. Een groot segment is meer optimaal, maar heeft meer geheugen nodig tijdens zijn creatie.

Lucene Java en Luke (Lucene Index Toolbox - http://www.getopt.org/luke/) kunnen worden geraadpleegd om indexes te optimaliseren met deze versie van Zend_Search_Lucene.

## Documenten updaten

Het Lucene index bestandformaat ondersteund het updaten van documenten niet. Documenten zouden moeten worden verwijderd en opnieuw toegevoegd worden om de index up te daten.

De `Zend_Search_Lucene::delete()` methode werkt met een intern document id index. Deze kan worden bekomen via een query hit per 'id' eigenschap:

    <?php
    $removePath = ...;
    $hits = $index->find('path:' . $removePath);
    foreach ($hits as $hit) {
        $index->delete($hit->id);
    }
    $index->commit();
    ?>