Manipulation d'un index avec Zend Search Lucene
Avant de commencer à indexer notre contenu, il faut configurer notre index. 2 composants sont indispensables pour avoir un index de qualité : la transformation du texte en segment et le filtrage. Une fois ces 2 composants correctement configuré, on peut créer et manipuler notre index.
Transformation de texte en segment
La première étape dans le processus d'indexation est de transformer les textes en segments. Les segments sont des séquences de lettres. Zend_Search_Lucene fournit 2 analyseur prêt à l'emploi :
- Zend_Search_Lucene_Analysis_Analyzer_Common_Text
- Zend_Search_Lucene_Analysis_Analyzer_Common_Text_Caseinsentitive
Comme leur nom l'indique, l'un permet de créer des segments soit qui sont soit sensible à la casse soit insensible. Il est bien sûr possible de définir ces propres analyseurs, la documentation officielle en donne un bon exemple.
Pour changer d'analyseur :
Zend_Search_Lucene_Analysis_Analyzer::setDefault(
new Zend_Search_Lucene_Analysis_Analyzer_Common_Text());
...
$index->addDocument($doc);
Filtrage des segments
Il est possible de filtrer les segments, l'analyseur Zend_Search_Lucene_Analysis_Analyzer_Common_Text_Caseinsentitive utilise déjà le filtre Zend_Search_Lucene_Analysis_TokenFilter_LowerCase. Mais il existe par défaut, 2 filtres qui ont importance cruciale dans l'obtention d'un index de qualité :
- Zend_Search_Lucene_Analysis_TokenFilter_ShortWords
- Zend_Search_Lucene_Analysis_TokenFilter_StopWords
Le TokenFilter_ShortWords permet d'exclure de l'indexation les mots courts de l'indexation. Il suffit de passer le nombre de lettre minimal pour que le mot soit indexé. Généralement, une limite à 2 caractère est suffisante.
Le TokenFilter_StopWords permet d'exclure une liste de mots de l'indexation. Il est souvent utile de ne pas indexé les mots de liaison d'une longue qui n'apporte réellement d'information lors de l'indexation. Par contre, il est important de fournir une liste de mot qui soit en rapport avec la langue des documents indexés.
Le format de tel fichier est définit en mettant un mot par ligne, le caractère # permet de commenter certains mots.
On trouve sur les Web de nombreuses listes de stopwords (Exemple de stopwords dans plusieurs langues)
Voici le code permettant de spécifier les différents filtres à utiliser lors de la création de notre index.
$stopWordsFilter = new Zend_Search_Lucene_Analysis_TokenFilter_StopWords();
$stopWordsFilter->loadFromFile($my_stopwords_file);
$analyzer = new Zend_Search_Lucene_Analysis_Analyzer_Common_TextNum_CaseInsensitive();
$analyzer->addFilter($stopWordsFilter);
Zend_Search_Lucene_Analysis_Analyzer::setDefault($analyzer);
La classe Zend_Search_Lucene_Analysis_TokenFilter fournit une interface abstraite pour ces filtres. Vos propres filtres devraient étendre cette classe directement ou indirectement.
Création d'un index
La création et la mise à jour des index sont implémentées dans le composant Zend_Search_Lucene, ainsi que dans le projet Java Lucene. Il possible d'utiliser l'une ou l'autre de ces options pour créer des index dans lesquels Zend_Search_Lucene pourra chercher.
Nous avons définit auparavant les principales options de configuration pour la création d'un index.
$index = Zend_Search_Lucene::create('/data/my-index');
$doc = new Zend_Search_Lucene_Document();
$doc->addField(Zend_Search_Lucene_Field::Text('url', $docUrl));
$doc->addField(Zend_Search_Lucene_Field::UnStored('contents', $docContent));
$index->addDocument($doc);
Avec ces quelques lignes de code, nous avons crées un index et ajouter un document. Le document contenait 2 information :
- une URL
- un contenu
Mise à jour d'un index
Pour ajouter, un fichier à notre index, il suffit d'ouvrir notre index et de lui ajouter un nouveau document.
$index = Zend_Search_Lucene::open('/data/my-index');
$doc = new Zend_Search_Lucene_Document();
$doc->addField(Zend_Search_Lucene_Field::Text('url', $docUrl));
$doc->addField(Zend_Search_Lucene_Field::UnStored('contents', $docContent));
$index->addDocument($doc);
La bibliothèque Zend Search Lucene fournit des implémentations pour ajouter directement des documents Word, Excel, Powerpoint et des Pages HTML.
Modification / Suppression d'un document
Le format de fichier d'un index Lucene ne permet pas la mise à jour d'un document. Les documents doivent être supprimés puis réinsérés dans l'index afin d'être mis à jour efficacement.
La méthode Zend_Search_Lucene::delete() utilise un identifiant interne de document. Cet identifiant peut être récupéré dans une requête en demandant la propriété 'id' :
$removePath = ...;
$hits = $index->find('path:' . $removePath);
foreach ($hits as $hit) {
$index->delete($hit->id);
}
La suppression réelle de l'index sera effective uniquement lorsque l'optimisation aura eu lieu.
Reconstruire intégralement un index
Lors du développement d'une application Web exploitant un moteur d'indexation, il est fortement recommandé de développer un script permettant de reconstruire l'index dans sa totalité au cas où.
Manipuler un index avec Zend Search Lucene est très simple, voir simpliste. Il suffit d'intégrer les fonctions d'indexation dans votre modèle de données pour avoir un moteur d'indexation utilisable. Le tutoriel Jobeet donne un exemple d'intégration de ce moteur avec Doctrine ou avec Propel.
Commentaires
Ajouter un commentaire