Zend_Search_Lucene

Vue d'ensemble

Introduction

Zend_Search_Lucene est un moteur de recherche de contenus principalement textuels écrit entièrement en PHP 5. Comme il stocke ses index sur le système de fichiers et qu'il ne requiert pas de base de données, il peut offrir des fonctionnalités de recherche à presque n'importe quel site écrit en PHP. Zend_Search_Lucene dispose des caractéristiques suivantes :

  • "Ranked searching" - les meilleurs résultats sont retournés en premier.

  • Plusieurs puissants types de requêtes : phrase, booléen, joker (wildcard), proximité, intervalle et bien d'autres.

  • Recherche par champ spécifique (p. ex. titre, auteur, contenus)

Zend_Search_Lucene est dérivé du projet Apache Lucene. Les versions actuelles de format d'index Lucene supportées (à partir de Zend Framework 1.6) sont 1.4 à 2.3. Pour plus d'informations sur Lucene, rendez-vous sur http://lucene.apache.org/java/docs/.

Note: Les implémentations précédentes de Zend_Search_Lucene supportent les formats d'indexation Lucene 1.4 (1.9) à 2.1.
A partir de Zend Framework 1.5, tout index créé en utilisant une version antérieure à la 2.1 et automatiquement mis à niveau au format Lucene 2.1 après la mise à jour de Zend_Search_Lucene et ne sera pas compatible avec les implémentations de Zend_Search_Lucene incluses dans Zend Framework 1.0.x.

Objet "Document" et "Field"

Zend_Search_Lucene travaille avec des documents comme objets de base pour l'indexation. Un document est divisé en champs possédant un nom et du contenu dans lequel on pourra chercher.

Un document est représenté par la classe Zend_Search_Lucene_Document. Les objets de cette classe contiennent des instances de Zend_Search_Lucene_Field qui représentent les champs du document.

Il est important de noter que n'importe quelle information peut être ajoutée à l'index. Des informations propres à l'application ou des métadonnées peuvent être stockées dans le document, puis récupérées durant la recherche.

Il est de la responsabilité de votre application de gérer l'indexation. Cela signifie que les données peuvent être indexées depuis n'importe quelle source accessible par votre application. Par exemple, elles peuvent provenir du système de fichier, d'une base de données, d'un formulaire HTML, etc.

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

  1. $doc = new Zend_Search_Lucene_Document();
  2.  
  3. // Le champ n'est pas "tokenizé", mais il est indexé et stocké dans l'index.
  4. // Les champs stockés peuvent être récupéré depuis l'index.
  5. $doc->addField(Zend_Search_Lucene_Field::Keyword('doctype',
  6.                                                  'autogenerated'));
  7.  
  8. // Le champ n'est ni "tokenizé", ni indexé, mais il est stocké dans l'index.
  9. $doc->addField(Zend_Search_Lucene_Field::UnIndexed('created',
  10.                                                    time()));
  11.  
  12. // Un champ chaîne binaire qui n'est ni "tokenizé", ni indexé, mais
  13. // stocké dans l'index.
  14. $doc->addField(Zend_Search_Lucene_Field::Binary('icon',
  15.                                                 $iconData));
  16.  
  17. // Un champ "tokenizé", indexé et stocké dans l'index.
  18. $doc->addField(Zend_Search_Lucene_Field::Text('annotation',
  19.                                               'Document annotation text'));
  20.  
  21. // Un champ "tokenizé" et indexé, mais pas stocké dans l'index.
  22. $doc->addField(Zend_Search_Lucene_Field::UnStored('contents',
  23.                                                   'My document content'));

Chacune de ces méthodes (à l'exception de Zend_Search_Lucene_Field::Binary()) possède un paramètre optionnel $encoding servant à spécifier l'encodage de la chaîne entrée.

L'encodage peut différer par document, voire par champ au sein d'un même document :

  1. $doc = new Zend_Search_Lucene_Document();
  2. $doc->addField(Zend_Search_Lucene_Field::Text('title',
  3.                                               $title,
  4.                                               'iso-8859-1'));
  5. $doc->addField(Zend_Search_Lucene_Field::UnStored('contents',
  6.                                                   $contents,
  7.                                                   'utf-8'));

Si le paramètre d'encodage est omis, la locale courante est alors utilisée pour le déterminer à l'exécution. Par exemple :

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

Les champs sont toujours stockés et retournés depuis l'index en UTF-8. Toute conversion requise vers UTF-8 est effectuée automatiquement.

Les analyseurs de texte (voir plus bas) peuvent également convertir du texte vers d'autres encodages. Actuellement, l'analyseur par défaut convertit le texte au format "ASCII/TRANSLIT". Soyez prudent, cependant; cette conversion peut déprendre de la locale.

Le nom des champs est défini par vous dans la méthode addField().

Java Lucene utilise le champ "contents" comme champ de recherche par défaut. Zend_Search_Lucene cherche par défaut dans tous les champs. Cela dit, ce comportement est configurable. Consultez le chapitre "Champ de recherche par défaut" pour plus de détails.

Comprendre les types de champs

  • Les champs Keyword (mot-clé) sont stockés ET indexés. Cela signifie qu'ils peuvent être aussi bien cherchés dans l'index qu'affichés dans les résultats de la recherche. Ils ne sont pas divisés en plusieurs mots par "tokenization". Les champs d'énumérations dans une base de donnée se transposent généralement assez bien en champs de type Keyword dans Zend_Search_Lucene.

  • Les champs UnIndexed (non-indexé) ne peuvent pas être utilisés dans la recherche. En revanche, ils peuvent être retournés dans les résultats. Des timestamps de base de données, des clés primaires, des chemins de fichiers et d'autres identifiants externes sont autant de bons exemples d'utilisation des champs de type UnIndexed.

  • Les champs Binary (binaire) ne sont ni "tokenizés", ni indexés, mais ils sont stockés dans le but d'être retournés dans les résultats de recherche. Ils peuvent être utilisés pour stocker n'importe quelle donnée encodée en chaîne binaire, telle qu'une icône par exemple.

  • Les champs Text (texte) sont stockés, indexés et "tokenizés". Les champs de type Text sont appropriés pour stocker des informations telles que sujets et titres sur lesquels on veut pouvoir effectuer des recherches, mais également les utiliser dans l'affichage des résultats.

  • Les champs UnStored sont "tokenizés" et indexés, mais pas stockés dans l'index. Il est recommandé d'utiliser ce type de champ pour indexer les textes conséquents. Stocker des données implique la création d'index plus volumineux sur le disque. Donc si vous disposez de données sur lesquelles vous voulez uniquement effectuer des recherches sans nécessairement afficher ces données dans les résultats, utilisez un champ de type UnStored. Le type UnStored est pratique lorsque vous utilisez un index Zend_Search_Lucene en combinaison avec une base de données relationnelle. Vous pouvez indexer des gros champs de données dans des champs de type UnStored et les extraire de la base de données relationnelle en utilisant un champ séparé en tant qu'identifiant.

    Les types 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é d'analyse HTML. Les documents peuvent être créés directement à d'un fichier ou d'une chaîne HTML :

  1. $doc = Zend_Search_Lucene_Document_Html::loadHTMLFile($filename);
  2. $index->addDocument($doc);
  3. ...
  4. $doc = Zend_Search_Lucene_Document_Html::loadHTML($htmlString);
  5. $index->addDocument($doc);

La classe Zend_Search_Lucene_Document_Html utilise les méthodes DOMDocument::loadHTML() et DOMDocument::loadHTMLFile() pour analyser la source HTML, ainsi il n'est pas nécessaire que le HTML soit bien formé ou au format XHTML. Par contre, ces méthodes prennent en compte l'encodage spécifié dans la balise méta "http-equiv".

La classe Zend_Search_Lucene_Document_Html reconnaît le titre d'une page HTML, son corps ("body"), ainsi que les métadonnées de son entête.

Le champ "title" correspond au contenu de la balise /html/head/title. Il est stocké dans l'index, "tokenizé" et disponible pour la recherche.

Le champ "body" correspond au contenu de la balise "body" du fichier ou de la chaîne HTML. Il ne prend pas en compte les scripts, les commentaires ou les attributs.

Les méthodes loadHTML() et loadHTMLFile() de la classe Zend_Search_Lucene_Document_Html possèdent également un deuxième argument optionnel. Si sa valeur est true, le body sera alors stocké dans l'index et pourra être retourné dans les résultats de recherche. Par défaut, le body est "tokenizé", indexé, mais pas stocké.

The third parameter of loadHTML() and loadHTMLFile() methods optionally specifies source HTML document encoding. It's used if encoding is not specified using Content-type HTTP-EQUIV meta tag.

Les autres métadonnées génèrent des champs additionnels dans le document. Le champ "name" prend sa valeur dans l'attribut "name" de la métadonnées. Le champ "value" prend sa valeur dans l'attribut "content" de la métadonnées. Ces deux champs sont "tokenizés", indexés et stockés. Ainsi les documents peuvent être cherchés à travers leurs métadonnées (p. ex. par mots-clés).

Les documents analysés peuvent être enrichis par le programmeur avec d'autres champs :

  1. $doc = Zend_Search_Lucene_Document_Html::loadHTML($htmlString);
  2. $doc->addField(Zend_Search_Lucene_Field::UnIndexed('created',
  3.                                                    time()));
  4. $doc->addField(Zend_Search_Lucene_Field::UnIndexed('updated',
  5.                                                    time()));
  6. $doc->addField(Zend_Search_Lucene_Field::Text('annotation',
  7.                                               'Document annotation text'));
  8. $index->addDocument($doc);

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

  1. $doc = Zend_Search_Lucene_Document_Html::loadHTML($htmlString);
  2. $linksArray = $doc->getLinks();
  3. $headerLinksArray = $doc->getHeaderLinks();

A partir de Zend Framework 1.6, il est également possible d'exclure les balises "link" dont l'attribut rel vaut 'nofollow'. Utilisez Zend_Search_Lucene_Document_Html::setExcludeNoFollowLinks($true) pour activer cette option.

La méthode Zend_Search_Lucene_Document_Html::getExcludeNoFollowLinks() retourne la valeur courante du flag "Exclude nofollow links".

Documents Word 2007

Zend_Search_Lucene offre une fonctionnalité d'analyse de documents Word 2007. On peut créer directement un document depuis un fichier Word 2007 :

  1. $doc = Zend_Search_Lucene_Document_Docx::loadDocxFile($filename);
  2. $index->addDocument($doc);

La classe Zend_Search_Lucene_Document_Docx utilise la classe ZipArchive et les méthodes de simplexml pour analyser le document source. Si la classe ZipArchive (issue du module php_zip) n'est pas disponible, Zend_Search_Lucene_Document_Docx ne sera pas non plus disponible dans le Zend Framework.

La classe Zend_Search_Lucene_Document_Docx reconnaît les métadonnées et le texte des documents. Les métadonnées sont constituées, suivant le contenu du document, du nom de fichier (filename), sujet (subject), créateur (creator), mots-clés (keywords), description, auteur de la dernière modification (lastModifiedBy), révision (revision), date de modification (modified), date de création (created).

Le champ "filename" correspond au nom du fichier Word 2007.

Le champ "title" correspond au titre du document.

Le champ "subject" correspond au sujet du document.

Le champ "creator" correspond à l'auteur du document.

Le champ "keywords" contient les mots-clés du document.

Le champ "description" correspond à la description du document.

Le champ "lastModifiedBy" correspond au nom de l'utilisateur qui a modifié en dernier le document.

Le champ "revision" correspond au numéro actuel de la version du document.

Le champ "modified" contient la date de dernière modification du document.

Le champ "created" contient la date de création du document.

Le champ "body" contient le véritable contenu du document Word 2007. Il n'inclut que le texte normal. Les commentaires et révisions ne sont pas inclus.

La méthode loadDocxFile() de la classe Zend_Search_Lucene_Document_Docx possède également un second argument optionnel. S'il est défini à TRUE, le champ "body" sera alors également stocké dans l'index et pourra être affiché dans les résultats de recherche. Par défaut, le champ "body" est "tokenizé" et indexé, mais pas stocké.

Les documents parsés peuvent être étendus par le programmeur avec d'autres champs :

  1. $doc = Zend_Search_Lucene_Document_Docx::loadDocxFile($filename);
  2. $doc->addField(Zend_Search_Lucene_Field::UnIndexed(
  3.     'indexTime',
  4.     time())
  5. );
  6. $doc->addField(Zend_Search_Lucene_Field::Text(
  7.     'annotation',
  8.     'Document annotation text')
  9. );
  10. $index->addDocument($doc);

Document Powerpoint 2007

Zend_Search_Lucene offre une fonctionnalité d'analyse de documents Powerpoint 2007. On peut créer directement un document depuis un fichier Powerpoint 2007 :

  1. $doc = Zend_Search_Lucene_Document_Pptx::loadPptxFile($filename);
  2. $index->addDocument($doc);

La classe Zend_Search_Lucene_Document_Pptx utilise la classe ZipArchive et les méthodes de simplexml pour analyser le document source. Si la classe ZipArchive (issue du module php_zip) n'est pas disponible, Zend_Search_Lucene_Document_Pptx ne sera pas non plus disponible dans le Zend Framework.

La classe Zend_Search_Lucene_Document_Pptx reconnaît les métadonnées et le texte des documents. Les métadonnées sont constituées, suivant le contenu du document, du nom de fichier (filename), sujet (subject), créateur (creator), mots-clés (keywords), description, auteur de la dernière modification (lastModifiedBy), révision (revision), date de modification (modified), date de création (created).

Le champ "filename" correspond au nom du fichier Powerpoint 2007.

Le champ "title" correspond au titre du document.

Le champ "subject" correspond au sujet du document.

Le champ "creator" correspond à l'auteur du document.

Le champ "keywords" contient les mots-clés du document.

Le champ "description" correspond à la description du document.

Le champ "lastModifiedBy" correspond au nom de l'utilisateur qui a modifié en dernier le document.

Le champ "revision" correspond au numéro actuel de la version du document.

Le champ "modified" contient la date de dernière modification du document.

Le champ "created" contient la date de création du document.

Le champ "body" contient le véritable contenu de toutes les slides, ainsi que les notes dans le document Powerpoint 2007.

La méthode loadPptxFile() de la classe Zend_Search_Lucene_Document_Pptx possède également un second argument optionnel. S'il est défini à true, le champ "body" sera alors également stocké dans l'index et pourra être affiché dans les résultats de recherche. Par défaut, le champ "body" est "tokenizé" et indexé, mais pas stocké.

Les documents analysés peuvent être étendus par le programmeur avec d'autres champs :

  1. $doc = Zend_Search_Lucene_Document_Pptx::loadPptxFile($filename);
  2. $doc->addField(Zend_Search_Lucene_Field::UnIndexed(
  3.     'indexTime',
  4.     time()));
  5. $doc->addField(Zend_Search_Lucene_Field::Text(
  6.     'annotation',
  7.     'Document annotation text'));
  8. $index->addDocument($doc);

Documents Excel 2007

Zend_Search_Lucene offre une fonctionnalité d'analyse de documents Excel 2007. On peut créer directement un document depuis un fichier Excel 2007 :

  1. $doc = Zend_Search_Lucene_Document_Xlsx::loadXlsxFile($filename);
  2. $index->addDocument($doc);

La classe Zend_Search_Lucene_Document_Xlsx utilise la classe ZipArchive et les méthodes de simplexml pour analyser le document source. Si la classe ZipArchive (issue du module php_zip) n'est pas disponible, Zend_Search_Lucene_Document_Xlsx ne sera pas non plus disponible dans le Zend Framework.

La classe Zend_Search_Lucene_Document_Xlsx reconnaît les métadonnées et le texte des documents. Les métadonnées sont constituées, suivant le contenu du document, du nom de fichier (filename), sujet (subject), créateur (creator), mots-clés (keywords), description, auteur de la dernière modification (lastModifiedBy), révision (revision), date de modification (modified), date de création (created).

Le champ "filename" correspond au nom du fichier Excel 2007.

Le champ "title" correspond au titre du document.

Le champ "subject" correspond au sujet du document.

Le champ "creator" correspond à l'auteur du document.

Le champ "keywords" contient les mots-clés du document.

Le champ "description" correspond à la description du document.

Le champ "lastModifiedBy" correspond au nom de l'utilisateur qui a modifié en dernier le document.

Le champ "revision" correspond au numéro actuel de la version du document.

Le champ "modified" contient la date de dernière modification du document.

Le champ "created" contient la date de création du document.

Le champ "body" contient le véritable contenu de toutes les cellules de toutes les feuilles de calcul du document Excel 2007.

La méthode loadXlsxFile() de la classe Zend_Search_Lucene_Document_Xlsx possède également un second argument optionnel. S'il est défini à true, le champ "body" sera alors également stocké dans l'index et pourra être affiché dans les résultats de recherche. Par défaut, le champ "body" est "tokenizé" et indexé, mais pas stocké.

Les documents analysés peuvent être étendus par le programmeur avec d'autres champs :

  1. $doc = Zend_Search_Lucene_Document_Xlsx::loadXlsxFile($filename);
  2. $doc->addField(Zend_Search_Lucene_Field::UnIndexed(
  3.     'indexTime',
  4.     time()));
  5. $doc->addField(Zend_Search_Lucene_Field::Text(
  6.     'annotation',
  7.     'Document annotation text'));
  8. $index->addDocument($doc);


Zend_Search_Lucene