Vue d'ensembleIntroductionZend_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
.
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 :
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
: 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 : 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_FieldType de champStockéIndexé"Tokenizé"BinaireKeywordOuiOuiNonNonUnIndexedOuiNonNonNonBinaryOuiNonNonOuiTextOuiOuiOuiNonUnStoredNonOuiOuiNon
Documents HTMLZend_Search_Lucene offre une fonctionnalité d'analyse HTML.
Les documents peuvent être créés directement à d'un fichier ou d'une chaîne HTML :
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 : 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() :
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".
Documents Word 2007Zend_Search_Lucene offre une fonctionnalité d'analyse de
documents Word 2007. On peut créer directement un document depuis un fichier Word 2007 :
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
: addField(Zend_Search_Lucene_Field::UnIndexed(
'indexTime',
time())
);
$doc->addField(Zend_Search_Lucene_Field::Text(
'annotation',
'Document annotation text')
);
$index->addDocument($doc);
]]>Document Powerpoint 2007Zend_Search_Lucene offre une fonctionnalité d'analyse de
documents Powerpoint 2007. On peut créer directement un document depuis un fichier
Powerpoint 2007 : 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 : addField(Zend_Search_Lucene_Field::UnIndexed(
'indexTime',
time()));
$doc->addField(Zend_Search_Lucene_Field::Text(
'annotation',
'Document annotation text'));
$index->addDocument($doc);
]]>Documents Excel 2007Zend_Search_Lucene offre une fonctionnalité d'analyse de
documents Excel 2007. On peut créer directement un document depuis un fichier Excel 2007
: 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 : addField(Zend_Search_Lucene_Field::UnIndexed(
'indexTime',
time()));
$doc->addField(Zend_Search_Lucene_Field::Text(
'annotation',
'Document annotation text'));
$index->addDocument($doc);
]]>