Programmer's Reference Guide

Zend_Search_Lucene

Vue d'ensemble

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 [1]

  • Recherche par champs spécifiques (par exemple , titre, auteur, contenu)

Zend_Search_Lucene est dérivé du projet Apache Lucene. La version courante supportée de Lucene est la 2.0. Pour plus d'informations vous pouvez visiter http://lucene.apache.org/java/docs/ (http://lucene.apache.org/java/2_0_0/).

Objets document et champ

Zend_Search_Lucene 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 représenté 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 que toute 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();

// Le champs n'est pas segmenté, mais est indexé et stocké dans l'index.
// Les champs stockés peuvent être récupérés à partir de l'index.
$doc->addField(Zend_Search_Lucene_Field::Keyword('doctype',
                                                 'autogenerated'));

// Le champs n'est ni segmenté ni indexé, mais est stocké dans l'index.
$doc->addField(Zend_Search_Lucene_Field::UnIndexed('created',
                                                   time()));

// Le champs contenant des données binaires n'est ni segmenté ni indexé, mais est stocké dans l'index
$doc->addField(Zend_Search_Lucene_Field::Binary('icon',
                                                $iconData));

// Le champs est segmenté et indexé et est stocké avec l'index.
$doc->addField(Zend_Search_Lucene_Field::Text('annotation',
                                              'Document annotation text'));

// Le champs est segmenté et indexé, mais n'est pas stocké dans l'index.
$doc->addField(Zend_Search_Lucene_Field::UnStored('contents',
                                                  'My document content'));
    		

Chacune de ces méthodes (sauf la méthodeZend_Search_Lucene_Field::Binary()) a un paramètre facultatif $encoding qui spécifie l'encodage de la donnée d'entrée.

L'encodage peut pour des documents différents aussi bien que pour des champs différents dans un même document.

<?php
$doc = new Zend_Search_Lucene_Document();
$doc->addField(Zend_Search_Lucene_Field::Text('title', $title, 'iso-8859-1'));
$doc->addField(Zend_Search_Lucene_Field::UnStored('contents', $contents, 'utf-8'));
    		

Si le paramètre d'encodage est omis, alors l'option régionale est utilisé au moment de l'éxécution. Par exemple :

<?php
setlocale(LC_ALL, 'de_DE.iso-8859-1');
...
$doc->addField(Zend_Search_Lucene_Field::UnStored('contents', $contents));
    		

Les champs sont toujours stockés et retournés de l'index en encodage UTF-8. La conversion vers l'UTF-8 est réalisée automatiquement.

Les analyseurs textuels (voir ci-dessous) peuvent aussi convertir les textes vers d'autres encodages. En réalité, l'analyseur par défaut convertit les textes vers l'encodage "ASCII//TRANSLIT". Faîtes attention à ceci, ces traductions peuvent dépendre l'option régionale courante.

Vous pouvez donner le nom que vous voulez aux champs.

Java Lucene utilise le champs "contents" comme le champ de recherche par défaut. Zend_Search_Lucene recherche dans tous les champs par défaut, mais il est possible de changer ce comportement. Voir le chapitre "Champ de recherche par défaut" pour les détails.

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

    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

Documents HTML

Zend_Search_Lucene offre une fonctionnalité de parseur HTML. Les documents peuvent être créés directement à partir de fichiers HTML ou à partir de chaînes de caractères :

<?php
$doc = Zend_Search_Lucene_Document_Html::loadHTMLFile($filename);
$index->addDocument($doc);
...
$doc = Zend_Search_Lucene_Document_Html::loadHTML($htmlString);
$index->addDocument($doc);
    		

La classe Zend_Search_Lucene_Document_Html utilise les méthodes DOMDocument::loadHTML() et DOMDocument::loadHTMLFile() pour parser la source HTML, ainsi il n'est pas nécessaire que le HTML soit bien formé ou soit du XHTML. D'un autre côté elle est sensible à l'encodage mentionné dans la balise d'entête "meta http-equiv".

La classe Zend_Search_Lucene_Document_Html reconnaît le titre du document, le contenu ("body") et les métabalises de l'entête du document.

Le champs "title" est en réalité la valeur "/html/head/title". Il est stocké dans l'index, segmenté et disponible pour les recherches.

Le champs "body" est le contenu de la balise body. Il ne contient pas les scripts, les commentaires et les attributs de balises.

Les méthodes loadHTML() et loadHTMLFile() de la classe Zend_Search_Lucene_Document_Html ont aussi un second argument falcultatif.Si il est activé à true, alors le contenu de body est stocké dans l'index et peut être récupéré. Le contenu body est seulement segmenté et indexé, mais pas stocké par défaut.

Les métabalises d'entête du document produisent des champs additionnels. Le nom du champs est pris à partir de l'attribut "name", l'attribut "content" donne la valeur du champs, qui est segmenté, indéxé et stocké, ainsi les documents peuvent être recherché par leurs métabalises (par exemple, par les mots-clés)

Les documents parsés peuvent être étendus par les utilisateurs avec tout autre champs :

<?php
$doc = Zend_Search_Lucene_Document_Html::loadHTML($htmlString);
$doc->addField(Zend_Search_Lucene_Field::UnIndexed('created',
                                                   time()));
$doc->addField(Zend_Search_Lucene_Field::UnIndexed('created',
                                                   time()));
$doc->addField(Zend_Search_Lucene_Field::Text('annotation',
                                              'Document annotation text'));
$index->addDocument($doc);
    		

Les hyperliens du document ne sont pas inclus dans le document généré, mais peuvent être récupérés avec les méthodes Zend_Search_Lucene_Document_Html::getLinks() et Zend_Search_Lucene_Document_Html::getHeaderLinks() :

<?php
$doc = Zend_Search_Lucene_Document_Html::loadHTML($htmlString);
$linksArray = $doc->getLinks();
$headerLinksArray = $doc->getHeaderLinks();
    		

[1] Les recherches par mots, par groupes de mots, par phrase, les expressions booléennes et sous-requêtes sont supportées pour le moment.

Zend_Search_Lucene
blog comments powered by Disqus

Select a Version

Languages Available

Components

Search the Manual