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/.
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.
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.
-
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 dansZend_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 130. 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
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".
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);
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);
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);