Accueil  / Semaine 9 / Quelques exercices de familiarisation

Quelques exercices de familiarisation

Important : Il est inutile d’entamer ces exercices si vous n’avez pas installé Lucene avec succès et procédé à tous les tests proposés de la manière exigée. Encore une fois, nous supposons que vous maîtrisez la programmation Java avec les outils java et javac.

Plan

1. Ajouter des documents dans un index

2. Rechercher des informations dans un index

3. Traiter deux exemples plus élaborés

Vous trouverez les fichiers de cette activité sur GitHub.


1. Ajouter des documents dans un index

Pour visualiser le fonctionnement de Lucene, nous utiliserons un premier exemple très simple qui permet d’ajouter des documents à un index en utilisant des fonctionnalités déjà programmées.

Dans un premier temps, vous êtes invité à cliquer sur l’icône qui suit afin de récupérer le code source de ce premier exemple. Ouvrez ensuite le fichier afin d’en analyser le contenu.

ajout.java-2.zip

Comme vous pouvez le voir, ce programme Java est relativement simple. Vous avez sans doute noté qu’il s’associera à quelques classes propres à Lucene : l’analyseur (StandardAnalyzer), une classe qui crée l’index (IndexWriter) et deux classes contenues dans le paquetage document : Document et Field (dans ce dernier cas, nous avons importé l’ensemble des classes du paquetage document plutôt que chacune des deux classes respectives).

Le contenu du programme est assez standard : on y crée cinq documents très simples, avec chacun un identifiant (Doc1 à Doc5), un titre (titre1 pour Doc1, titre2 pour Doc2, etc.), un auteur (auteur1 pour Doc1, auteur2 pour Doc2, etc.) et un contenu (comprenant de une à cinq lettres). Dans cet exemple, le programme Java se limite à ne fournir que du contenu. Toute la question de la création et de la gestion de l’indexation est laissée aux classes de Lucene.

Précisons tout de suite le travail de chacune de ces classes :

- IndexWriter est la composante centrale du processus d’indexation, qui créera un nouvel index et ajoutera des documents à un index existant. Notez que IndexWriter ne s’occupe ni de la lecture ni de la recherche dans un index.

- Analyser désigne ici une classe spécialisée qui, avant de procéder à l’indexation proprement dite, permet d’extraire les éléments essentiels d’un texte - les jetons, token en anglais - et d’éliminer le reste. Lucene fournit différentes versions d’analyseurs qui pourront soit jouer des rôles différents tels que la conversion des jetons en lettres minuscules (si on ne veut pas faire de différence entre les majuscules et les minuscules lors des recherches), soit éliminer des mots qui ralentissent inutilement la recherche (par exemple, les mots comme le ou la), etc. Dans notre exemple, l’analyseur utilisé est StandardAnalyzer.

- Document. Lorsque le texte est fourni à Lucene, celui-ci le traitera en créant une nouvelle instance de la classe Document, la remplira avec des champs (Field) et ajoutera ce Document à l’index.

- Field. Chaque Document dans un index contient un ou plusieurs champs formés par la classe Field (ou une classe dérivée comme TextField). Chacun de ces champs correspond à un morceau d’information pouvant soit faire l’objet d’une requête, soit être récupéré à la suite d’une recherche. Selon que l’on spécifie Field.Store.YES ou Field.Store.NO, la valeur originale du champ sera conservée dans l’index (en plus de la version indexée) : on n’utilise cette option que pour les petits champs car elle augmente la taille de l’index.

Placez le fichier ajout.java dans le répertoire courant de votre console (par exemple c :\lucene). Vous pouvez maintenant compiler l’exemple et créer votre index qui sera généré dans le répertoire courant : [1]

javac -cp .\core\lucene-core-4.6.1.jar;.\analysis\common\lucene-analyzers-common-4.6.1.jar ajout.java

S’il se plaint qu’il ne trouve pas le fichier ajout.java, alors assurez-vous qu’il se trouve bel et bien dans le répertoire courant !

Pour exécuter le programme tapez

java -cp .\core\lucene-core-4.6.1.jar;.\analysis\common\lucene-analyzers-common-4.6.1.jar;. ajout

Si vous obtenez une erreur du type "java.lang.NoClassDefFoundError" c’est que java ne trouve pas le fichier ajout.class dans le répertoire courant.


2. Rechercher des informations dans un index

Maintenant que l’index est créé, vous pouvez télécharger ce second programme Java qui permettra d’y effectuer des recherches simples. Cliquez donc sur l’icône pour le télécharger, puis ouvrez-le pour en vérifier le contenu.

recherche.java-2.zip

Notez encore une fois que ce programme Java est assez standard. Après avoir importé les classes nécessaires pour entrer du texte au clavier, il cherchera les classes de Lucene qui serviront à la recherche dans l’index.

La suite du programme est simplement une boucle pour demander les informations à rechercher et pour afficher ensuite le résultat de cette recherche.

Ici encore, le travail particulier de recherche est entièrement laissé aux classes de Lucene :

- IndexSearcher joue, lors de la recherche, un rôle similaire à IndexWriter lors de la création d’un index. C’est donc l’élément central lors de la consultation d’un index.

- Query est la classe qui traite les différents types de requêtes offertes par Lucene : requête simple, requête sur des champs multiples, etc.

- TopDocs contient simplement des pointeurs menant aux résultats de la recherche, classés selon leur pertinence. Dans cet exemple, on demande à Lucene de ne trouver que les premiers 4096 résultats. Dans la pratique, si on indexe des millions de documents, limiter la requête à quelques milliers de documents peut accélérer le traitement.

Compilez votre programme avec cette commande

javac -cp .\core\lucene-core-4.6.1.jar;.\analysis\common\lucene-analyzers-common-4.6.1.jar;.\queryparser\lucene-queryparser-4.6.1.jar recherche.java

Puis exécutez-le

java -cp .\core\lucene-core-4.6.1.jar;.\analysis\common\lucene-analyzers-common-4.6.1.jar;.\queryparser\lucene-queryparser-4.6.1.jar;. recherche

Faites ensuite les recherches suivantes :

- première recherche sur d ;
- deuxième recherche sur a b c ;
- troisième recherche sur d e ;
- quatrième recherche sur auteur1.
- cinquième recherche sur a AND b AND c

Vous noterez que Lucene classe pour vous les différents documents selon leur pertinence. Ainsi, pour une recherche sur d, Doc4 est préféré à Doc5 car il ne contient que la lettre d, alors que Doc5 est plus général et qu’il contient a b c d e.

De la même manière, la recherche sur a b c donne dans l’ordre Doc3 qui contient seulement les 3 lettres désirées, Doc5 qui contient les trois lettres plus d et e, Doc1 qui contient deux des trois lettres et, finalement, Doc2 qui n’en contient qu’une seule.

La dernière requête est une requête Booléenne. C’est-à-dire qu’elle ne donne que les documents comprenant à la fois a, b et c. Comprenez bien que cette requête diffère de la deuxième (a b c).

Vous avez donc un outil de recherche très performant, qui pondère les résultats de la recherche sans que vous ayez eu à programmer une seule ligne de code pour y parvenir. Le programme Java va permettre de fournir des critères de recherche et d’afficher les résultats obtenus. Le reste est géré par Lucene.


3. Traiter deux exemples plus élaborés

Les deux exemples qui vous ont été présentés jusqu’à maintenant sont relativement simples. Ils utilisent des documents créés de toutes pièces à l’intérieur d’un programme et ils les indexent pour permettre, ensuite, d’y effectuer une recherche.

Dans un cas réel, vous auriez probablement à utiliser des fichiers textes déjà construits ou générés à partir de formats de documents courants (.doc ou .pdf, par exemple) car, si vous vous rappelez bien, Lucene ne traite que des fichiers textes. Vous pouvez cependant utiliser une version plus étendue de Lucene appelée Solr qui, elle, permet de traiter les fichiers PDF : https://lucene.apache.org/solr/4_6_0/

Vous trouverez d’autres exemples dans l’excellent livre Lucene in Action d’Erik Hatcher et d’Otis Gospodnetic (les informations complètes sur cet ouvrage sont présentées dans la Bibliowebographie du cours).


[1Nous donnons les commandes pour Windows. Sous MacOS ou Linux, la commande serait plutôt : javac -cp ./core/lucene-core-4.6.1.jar:./analysis/common/lucene-analyzers-common-4.6.1.jar ajout.java Si vous utilisez un Mac ou Linux, vous devriez adapter les exemples.