Chapitre 12. Zend_Search

Table des matières

12.1. Vue d'ensemble
12.1.1. Introduction
12.1.2. Objets document et champ
12.1.3. Comprendre les types de champs
12.2. Créer des indexes
12.2.1. Créer un nouvel index
12.2.2. Mettre à jour l'index
12.2.3. Mise à jour de documents
12.3. Rechercher dans l'index
12.3.1. Créer des requêtes
12.3.2. Résultats de recherche
12.3.3. Score de résultats
12.4. Types de requêtes
12.4.1. Recherche avec un seul terme
12.4.2. Recherche avec plusieurs termes
12.4.3. Requêtes de phrases
12.5. Jeux de caractères.
12.5.1. Support d'UTF-8 et de jeux de caractères sur un octet.
12.6. Extensibilité
12.6.1. Analyse textuelle
12.6.2. Algorithme de scoring
12.6.3. API de Stockage
12.7. Interopération avec Java Lucene
12.7.1. Formats de fichier
12.7.2. Répertoire d'index
12.7.3. Code source Java
12.7.4. Utiliser LuceneIndexCreation.jar

12.1. Vue d'ensemble

12.1.1. Introduction

Zend_Search_Lucene est un moteur de recherche textuel général totalement écrit en PHP 5. Bien qu'il stocke ses index dans le système de fichiers, et ne nécessite pas de base de données, il peut ajouter des capacités de recherche sur presque tous les sites PHP utilisant une base de données. Zend_Search_Lucene supporte les fonctionnalités suivantes :

  • Recherche par pertinence - les meilleurs résultats sont retournés en premier

  • Beaucoup de type de puissantes recherche : recherche sur des phrases, recherche joker, recherche de proximité, recherche par intervalle et bien plus [5]

  • Recherche par champs spécifiques (e.i., titre, auteur, contenu)

Zend_Search_Lucene est dérivé du projet Apache Lucene. Pour plus d'informations vous pouvez visiter http://lucene.apache.org/java/docs/.

12.1.2. Objets document et champ

ZSearch considère les documents comme des sujets atomiques pour l'indexation. Un document est divisé en champs nommés, et les champs ont du contenu dans lequel on peut rechercher.

Un document est representé par l'objet Zend_Search_Lucene_Document, et cet objet contient des objets Zend_Search_Lucene_Field qui représentent les champs.

Il est important de noter qu'aucune sorte d'information peut être ajoutée à l'index. Les informations spécifiques à l'application, ou les métadonnées peuvent être stockées dans les champs du document, et retrouvées ensuite pendant la recherche.

Il est de votre responsabilité de contrôler l'indexeur. Cela signifie que les données peuvent-être indexées à partir de n'importe quelle source accessible par votre application. Cela peut-être aussi bien le système de fichiers, qu'une base de données, qu'un formulaire HTML, etc.

La classe Zend_Search_Lucene_Field fournit plusieurs méthodes statiques pour créer des champs de différentes caractéristiques :

            <?php
            $doc = new Zend_Search_Lucene_Document();
            
            // Field is not tokenized, but is indexed and stored within the index.
            // Stored fields can be retrived from the index.
            $doc->addField(Zend_Search_Lucene_Field::Keyword('doctype', 
                                                             'autogenerated'));
            
            // Field is not tokenized nor indexed, but is stored in the index.
            $doc->addField(Zend_Search_Lucene_Field::UnIndexed('created', 
                                                               time()));
            
            // Binary String valued Field that is not tokenized nor indexed,
            // but is stored in the index.
            $doc->addField(Zend_Search_Lucene_Field::Binary('icon', 
                                                            $iconData));
            
            // Field is tokenized and indexed, and is stored in the index.
            $doc->addField(Zend_Search_Lucene_Field::Text('annotation', 
                                                          'Document annotation text'));
            
            // Field is tokenized and indexed, but that is not stored in the index.
            $doc->addField(Zend_Search_Lucene_Field::UnStored('contents', 
                                                              'My document content'));

            ?>
            

Vous pouvez donner le nom que vous voulez aux champs. Le nom "contents" est utilisé par défaut. C'est une bonne idée de placer les principales données de votre document dans le champ ainsi nommé.

12.1.3. Comprendre les types de champs

  • Les champs Keyword sont stockés et indexés, c'est à dire qu'il est possible de rechercher dedans, aussi bien que les afficher dans les résultats de recherche. Ils ne sont pas séparés en mots par un processus de tokenization. Les champs énumérés d'une base de données se traduisent bien en champs Keyword pour Zend_Search_Lucene.

  • Les champs UnIndexed n'offrent pas de possibilité de recherche, mais sont retournés avec les résultats de recherche. Les timestamps et clés primaires de base de données, chemins du système de fichiers, et tout autre identifiant externe sont de bons candidats pour des champs UnIndexed.

  • Les champs Binary ne sont ni tokenizés, ni indexés, mais sont stockés pour être récupérés avec les résultats de recherche. Ils peuvent être utilisés pour stocker toute donnée encodée comme chaine binaire, comme par exemple des icônes.

  • Les champs Text sont stockés, indexés et tokenizés. Les champs Text sont bien appropriés pour stocker des informations comme des sujets et titres qui doivent être recherchables aussi bien que retournés avec les résultats de recherche.

  • Les champs UnStored sont tokenizés et indexés, mais pas stockés dans l'index. Les grandes quantités de texte sont mieux indexées en utilisant ce type de champ. Stocker de données crée un index plus grand sur le disque, donc si vous avez besoin d'effectuer une recherche, mais de ne pas ré-afficher les données, utiliser le champ UnStored. Les champs UnStored sont pratiques lorsque l'on souhaite utiliser un index Zend_Search_Lucene en combinaison avec une base de données relationnelle. Vous pouvez indexer de gros champs de fichiers dédiés à la recherche avec les champs UnStored, et les récupérer depuis votre base de données en utilisant un champ séparé comme identifiant.

    Tableau 12.1. Types de Zend_Search_Lucene_Field

    Type de champ Stocké Indexé Tokenizé Binaire
    Keyword Oui Oui Non Non
    UnIndexed Oui Non Non Non
    Binary Oui Non Non Oui
    Text Oui Oui Oui Non
    UnStored Non Oui Oui Non


[5] Seules les recherches par mots ou groupes de mots sont supportées pour le moment.