Chapitre 27. Zend_Search

Table des matières

27.1. Vue d'ensemble
27.1.1. Introduction
27.1.2. Objets document et champ
27.1.3. Comprendre les types de champs
27.2. Créer des indexes
27.2.1. Créer un nouvel index
27.2.2. Mettre à jour l'index
27.2.3. Mise à jour de documents
27.3. Rechercher dans l'index
27.3.1. Créer des requêtes
27.3.2. Résultats de recherche
27.3.3. Score de résultats
27.4. Query Language
27.4.1. Terms
27.4.2. Fields
27.4.3. Term Modifiers
27.4.4. Proximity Searches
27.4.5. Boosting a Term
27.4.6. Boolean Operators
27.4.7. Grouping
27.4.8. Field Grouping
27.4.9. Escaping Special Characters
27.5. Types de requêtes
27.5.1. Recherche avec un seul terme
27.5.2. Recherche avec plusieurs termes
27.5.3. Requêtes de phrases
27.6. Jeux de caractères.
27.6.1. Support d'UTF-8 et de jeux de caractères mono-octet.
27.6.2. Analyseur textuel par défaut
27.6.3. Analysseur textuel compatible UTF-8
27.7. Extensibilité
27.7.1. Analyse textuelle
27.7.2. Algorithme de scoring
27.7.3. API de Stockage
27.8. Interopération avec Java Lucene
27.8.1. Formats de fichier
27.8.2. Répertoire d'index
27.8.3. Code source Java
27.8.4. Utiliser LuceneIndexCreation.jar
27.9. Utilisation avancée
27.9.1. Utiliser l'index en tant que propriété statique

27.1. Vue d'ensemble

27.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 [7]

  • 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/.

27.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é.

27.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 27.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


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