Chapitre 12. Zend_Search
Précédent |  | Suivant

## Chapitre 12. Zend_Search

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

Précédent |  | Suivant
11.6. Exemple d'utilisation du module Zend_Pdf | Sommaire | 12.2. Créer des indexes