12.2. Créer des indexes

12.2.1. Créer un nouvel index

La création et la mise à jour d'index est disponible dans le module ZSearch et dans Java Lucene. Vous pouvez utilisez les capacités des deux.

Le listing de code PHP ci-dessous propose un exemple montrant comment indexer un fichier en utilisant l'API d'indexation de Zend_Search_Lucene :

        <?php
        // Définir le second paramètre à true pour créer un nouvel index
        $index = new Zend_Search_Lucene('/donnees/mon-index', true);

        $doc = new Zend_Search_Lucene_Document();

        // Stocke l'URL du document pour l'identifier dans un résultat de recherche.
        $doc->addField(Zend_Search_Lucene_Field::Text('url', $docUrl));

        // Contenu du document d'index
        $doc->addField(Zend_Search_Lucene_Field::UnStored('contents', $docContent));

        // Ajout du document à l'index
        $index->addDocument($doc);

        // Ecriture des changements dans l'index
        $index->commit();
        ?>
        

Les nouveaux documents ajoutés peuvent être récupérés depuis l'index après une opération de commit.

Zend_Search_Lucene::commit() est automatiquement appelé à la fin de l'éxecution du script et avant toute recherche.

Chaque appel à commit() génère un nouveau segment d'index. [6] Il doit être fait aussi rarement que possible. De plus, commiter une grande quantité de documents en une seule fois consomme plus de mémoire.

L'optimisation automatique de la gestion des segment est un sujet d'amélioration future pour Zend_Search_Lucene.

12.2.2. Mettre à jour l'index

Le même procédure est utilisée pour mettre à jour un index existant. La seule différence est que l'index doit être ouvert sans second paramètre :

        <?php
        // Ouverture d'un index existant
        $index = new Zend_Search_Lucene('/donnees/mon-index');

        $doc = new Zend_Search_Lucene_Document();

        // Stocke l'URL du document pour l'identifier dans un résultat de recherche.
        $doc->addField(Zend_Search_Lucene_Field::Text('url', $docUrl));

        // Contenu du document d'index
        $doc->addField(Zend_Search_Lucene_Field::UnStored('contents', $docContent));

        // Ajout du document à l'index
        $index->addDocument($doc);

        // Ecriture des changements dans l'index
        $index->commit();
        ?>
        

Chaque appel à commit() (explicite ou implicite) génère un nouveau segment d'index.

Zend_Search_Lucene ne gère pas les segments automatiquement. C'est pourquoi vous devriez être attentif à la taille du segment. D'un côté, un seul gros segment est plus efficace, mais d'un autre côté, cela nécessite plus de mémoire lors de la création.

Lucene Java et Luke (Lucene Index Toolbox - http://www.getopt.org/luke/) peuvent être utilisés pour optimiser l'index avec cette version de Zend_Search_Lucene.

12.2.3. Mise à jour de documents

Le format de fichier d'index ne supporte pas la mise à jour de document. Le document doit être effacé et ajouté de nouveau.

La méthode Zend_Search_Lucene::delete() opère avec un id de document index interne. Il peut être récupéré par une requête sur la propriété 'id' :

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


[6] Les fichiers de segment d'index Lucene ne peuvent être mis à jour. La mise à jour d'un segment nécessite la réorganisation de tous les segments. Référrez vous au format de fichier d'index pour plus de détails (http://lucene.apache.org/java/docs/fileformats.html). Augmenter le nombre de segments réduit la qualité de l'index, mais l'optimisation de l'index permet de réparer cela. L'optimisation consiste à regrouper plusieurs segments en un seul. Ce processus ne met à jour aucun segment. Il génère un nouveau gros segment, génère une nouvelle liste de segemnts (fichier 'segment.new'), qui contient le segement nouvellement optimisé au lieu du jeu de vieux segements, et renomme ensuite 'segments.new' en 'segments'.

L'optimisation est un processus itératif. Les très petits segments (par exemple ceux qui sont généré par l'ajout d'un seul document) sont regroupés dans un segment plus gros, et ainsi de suite. L'optimisation peut fonctionner sur un flux de segment et n'est pas gourmand en mémoire. Ainsi le processus d'optimisation ne prend pas beaucoup de ressources et ne verouille pas les fichiers d'index pour la recherche, la mise à jour ou le regroupement d'autres segments.