Introduction au Zend Framework

 Apprendre Zend Framework

appendix

 Guide de référence Zend Framework


  •  Zend_Gdata
  •  Zend_Http
  •  Zend_InfoCard
  •  Zend_Json
  •  Zend_Layout
  •  Zend_Ldap
  •  Zend_Loader
  •  Zend_Locale
  •  Zend_Log
  •  Zend_Mail
  •  Zend_Markup
  •  Zend_Measure
  •  Zend_Memory
  •  Zend_Mime
  •  Zend_Navigation
  •  Zend_Oauth
  •  Zend_OpenId
  •  Zend_Paginator
  •  Zend_Pdf
  •  Zend_ProgressBar
  •  Zend_Queue
  •  Zend_Reflection
  •  Zend_Registry
  •  Zend_Rest

  •  Zend_Search_Lucene
  •  Zend_Serializer
  •  Zend_Server
  •  Zend_Service
  •  Zend_Session
  •  Zend_Soap
  •  Zend_Tag
  •  Zend_Test
  •  Zend_Text
  •  Zend_TimeSync
  •  Zend_Tool
  •  Zend_Tool_Framework
  •  Zend_Tool_Project
  •  Zend_Translate
  •  Zend_Uri
  •  Zend_Validate
  •  Zend_Version
  •  Zend_View
  •  Zend_Wildfire
  •  Zend_XmlRpc
  • ZendX_Console_Process_Unix
  • ZendX_JQuery
  • Translation 61.2% Update 2010-11-28 - Revision 23149 - Version ZF 1.11.x

    Chapitre 60. Zend_Search_Lucene

    Table des matières

    60.1. Vue d'ensemble
    60.1.1. Introduction
    60.1.2. Objet "Document" et "Field"
    60.1.3. Comprendre les types de champs
    60.1.4. Documents HTML
    60.1.5. Documents Word 2007
    60.1.6. Document Powerpoint 2007
    60.1.7. Documents Excel 2007
    60.2. Créer des index
    60.2.1. Créer un nouvel index
    60.2.2. Mettre à jour un index
    60.2.3. Mise à jour de Documents
    60.2.4. Récupération de la taille de l'index
    60.2.5. Optimisation d'index
    60.2.5.1. Option d'optimisation automatique MaxBufferedDocs
    60.2.5.2. Option d'optimisation automatique MaxMergeDocs
    60.2.5.3. Option d'optimisation automatique MergeFactor
    60.2.6. Permissions
    60.2.7. Limitations
    60.2.7.1. Taille de l'index
    60.2.7.2. Systèmes de fichiers supportés
    60.3. Chercher dans un index
    60.3.1. Construire des requêtes
    60.3.1.1. Parsage de requêtes
    60.3.2. Résultats de recherche
    60.3.3. Limiter le nombre de résultats
    60.3.4. Etablissement des scores des résultats de recherche
    60.3.5. Tri des résultats de recherche
    60.3.6. Mise en évidence des résultats de recherche
    60.4. Langage de requêtes
    60.4.1. Termes
    60.4.2. Champs
    60.4.3. Jokers (Wildcards)
    60.4.4. Modificateurs de termes
    60.4.5. Recherche par intervalle
    60.4.6. Recherches floues
    60.4.7. Limitation des termes correspondants
    60.4.8. Recherches de proximité
    60.4.9. Booster un terme
    60.4.10. Opérateurs booléens
    60.4.10.1. AND
    60.4.10.2. OR
    60.4.10.3. NOT
    60.4.10.4. Les opérateurs &&, ||, et !
    60.4.10.5. +
    60.4.10.6. -
    60.4.10.7. Pas d'opérateur
    60.4.11. Groupement
    60.4.12. Groupement de champs
    60.4.13. Echappement des caractères spéciaux
    60.5. API de construction de requêtes
    60.5.1. Les Exceptions du parseur de requêtes
    60.5.2. Requête sur un terme
    60.5.3. Requête multi-termes
    60.5.4. Requête booléene
    60.5.5. Requête Joker (wildcard)
    60.5.6. Requête floue (fuzzy query)
    60.5.7. Requête de phrase
    60.5.8. Requête d'intervalle
    60.6. Jeu de caractères
    60.6.1. Support UTF-8 et caractères sur un octet
    60.6.2. Analyseur de texte par défaut
    60.6.3. Analyseurs de texte compatibles UTF-8
    60.7. Extensibilité
    60.7.1. Analyse de texte
    60.7.2. Filtrage des segments
    60.7.3. Algorithme de score
    60.7.4. Conteneur de stockage
    60.8. Agir avec Lucene Java
    60.8.1. Formats de fichier
    60.8.2. Répertoire Index
    60.8.3. Code source Java
    60.9. Avancé
    60.9.1. Depuis Zend Framework 1.6, gestion des transformations de format d'index
    60.9.2. Utiliser les propriétés statiques de l'index
    60.10. Bonnes pratiques
    60.10.1. Nommage des champs
    60.10.2. Performance de l'indexation
    60.10.3. Indexation à l'arrêt du programme
    60.10.4. Récupération de documents par leur id unique
    60.10.5. Utilisation de la mémoire
    60.10.6. Encodage
    60.10.7. Maintenance de l'index

    60.1. Vue d'ensemble

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

    60.1.2. 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 :

    $doc = new Zend_Search_Lucene_Document();

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

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

    // Un champ chaîne binaire qui n'est ni "tokenizé", ni indexé, mais
    // stocké dans l'index.
    $doc->addField(Zend_Search_Lucene_Field::Binary('icon',
                                                    
    $iconData));

    // Un champ "tokenizé", indexé et stocké dans l'index.
    $doc->addField(Zend_Search_Lucene_Field::Text('annotation',
                                                  
    'Document annotation text'));

    // Un champ "tokenizé" et indexé, mais pas stocké dans l'index.
    $doc->addField(Zend_Search_Lucene_Field::UnStored('contents',
                                                      
    '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 :

    $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, la locale courante est alors utilisée pour le déterminer à l'exécution. Par exemple :

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

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

      Tableau 60.1. 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

    60.1.4. 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 :

    $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 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 :

    $doc Zend_Search_Lucene_Document_Html::loadHTML($htmlString);
    $doc->addField(Zend_Search_Lucene_Field::UnIndexed('created',
                                                       
    time()));
    $doc->addField(Zend_Search_Lucene_Field::UnIndexed('updated',
                                                       
    time()));
    $doc->addField(Zend_Search_Lucene_Field::Text('annotation',
                                                  
    'Document annotation text'));
    $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() :

    $doc Zend_Search_Lucene_Document_Html::loadHTML($htmlString);
    $linksArray $doc->getLinks();
    $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".

    60.1.5. 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 :

    $doc Zend_Search_Lucene_Document_Docx::loadDocxFile($filename);
    $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 :

    $doc Zend_Search_Lucene_Document_Docx::loadDocxFile($filename);
    $doc->addField(Zend_Search_Lucene_Field::UnIndexed(
        
    'indexTime',
        
    time())
    );
    $doc->addField(Zend_Search_Lucene_Field::Text(
        
    'annotation',
        
    'Document annotation text')
    );
    $index->addDocument($doc);

    60.1.6. 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 :

    $doc Zend_Search_Lucene_Document_Pptx::loadPptxFile($filename);
    $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 :

    $doc Zend_Search_Lucene_Document_Pptx::loadPptxFile($filename);
    $doc->addField(Zend_Search_Lucene_Field::UnIndexed(
        
    'indexTime',
        
    time()));
    $doc->addField(Zend_Search_Lucene_Field::Text(
        
    'annotation',
        
    'Document annotation text'));
    $index->addDocument($doc);

    60.1.7. 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 :

    $doc Zend_Search_Lucene_Document_Xlsx::loadXlsxFile($filename);
    $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 :

    $doc Zend_Search_Lucene_Document_Xlsx::loadXlsxFile($filename);
    $doc->addField(Zend_Search_Lucene_Field::UnIndexed(
        
    'indexTime',
        
    time()));
    $doc->addField(Zend_Search_Lucene_Field::Text(
        
    'annotation',
        
    'Document annotation text'));
    $index->addDocument($doc);
    digg delicious meneame google twitter technorati facebook

    Comments

    Loading...