Accueil  / Semaine 10 / Travail noté sur le moteur de recherche Lucene

Travail noté sur le moteur de recherche Lucene

Consignes du travail noté 4

Vous devez rédiger un court rapport (en format « pdf », « Word 97/2000/XP », « RTF », « OpenDocument » ou « texte »)
que vous transmettrez, par courriel, au chargé d’encadrement. L’objet du courriel doit commencer par
« [INF6104][TRAVAIL4] » afin de permettre au chargé d’encadrement de classer rapidement ses messages.
Dans le corps de votre message ainsi que dans votre rapport, vous devez bien indiquer vos nom et numéro d’étudiant ainsi que le numéro du travail. Joignez les classes Java dans une archive zip.

Le travail est noté sur 10 points. Il faut prévoir environ 9 heures pour le faire.

Troncature

Pour l’exécution de ce travail, vous devrez veiller à activer la troncature des mots en supposant que
tous les textes sont en anglais.

Rappel : calcul du temps d’exécution d’une tâche en Java

Pour calculer le temps d’exécution d’une tâche en Java avec votre ordinateur, vous
pouvez utiliser l’exemple de code suivant :

long avant = System.currentTimeMillis();
mafonction();
long apres = System.currentTimeMillis();
System.out.println("Ça a pris "+ (apres-avant)/1000.0+" secondes.");

Évidemment, il faut éviter d’utiliser d’autres applications pendant que votre programme s’exécute !

Parfois, pour obtenir une meilleure estimation du temps, il est possible d’effectuer le travail
en boucle et d’en faire la moyenne, comme dans cet exemple :

long avant = System.currentTimeMillis();
for (int k = 0; k < 1000; ++k)
 mafonction();
long apres = System.currentTimeMillis();
System.out.println("Ça a pris "+ (apres-avant)/1000.0+" secondes");
System.out.println("Une moyenne de  "+ (apres-avant)/(1000*1000.0)+" secondes.");

Rappel : lire une liste dans un fichier texte

Si vous avez un fichier en format texte Java, vous pouvez en lire le contenu et le mettre
dans un tableau avec le code suivant :

import java.util.*;
import java.io.*;

public class test {
       public static void main(String arg[]) throws IOException {
               BufferedReader sr = new BufferedReader(
                               new FileReader(arg[0]));
               String line;
               Vector<String> lignes = new Vector<String>();
               while ( ( line = sr.readLine()) != null)
                       lignes.add(line);
               String[] li = lignes.toArray(new String[0]);
               for (int k = 0; k < li.length; ++k)
                       System.out.println(li[k]);
       }
}

Rappel : accès aux dossiers

Étant donné un instance de la classe java.io.File, vous pouvez vérifier s’il s’agit d’un dossier avec la méthode isDirectory(). Dans ce cas, vous pouvez avoir accès aux fichiers qu’il contient avec la méthode listFiles(). Dans le cas où il s’agit d’un fichier, vous pouvez vérifier l’extension d’un fichier avec un appel tel que getName().endsWith(".txt").

La méthode getPath() vous permet d’avoir accès au chemin du fichier, ce qui est utile lors de l’indexation. Par exemple, vous pouvez composer un champ Lucène de cette manière :

new StringField("path", file.getPath(), Field.Store.YES);

Rappel : Lire le contenu d’un fichier

Vous pouvez lire le contenu d’un fichier en Java avec la classe java.io.FileReader. Pour des raisons de performance, on la combine le plus souvent avec la classe BufferedReader de cette manière

Reader r = new BufferedReader(new FileReader(file));

Lucène vous permet d’indexer un fichier à l’aide d’une instance de la classe Reader, comme ceci :

new TextField("contenu",reader);

Énoncé

Veuillez utiliser l’ensemble des documents sur le cédérom Gutenberg qui vous a été fourni pour répondre
aux questions suivantes.

Question 1 (4 points)

Indexez d’abord seulement 10 documents, puis 20, puis 30, et ainsi de suite par
incrément de 10 documents, jusqu’à ce que la totalité des documents ayant l’extension txt sur le
cédérom (dans les répertoires etextxx) ait été indexée. Calculez le temps nécessaire pour l’exécution de chaque
indexation, la taille (sur le disque) de chaque index ainsi que la somme de la taille des
fichiers indexés. Faites aussi, en boucle, pour chaque index, 100 fois
10 recherches par mots-clés
en choisissant des mots différents,
puis divisez la somme obtenue par 1000 pour obtenir le temps de recherche.
Donnez le résultat dans un tableau à 5 colonnes : nombre de
fichiers, temps d’indexation, taille de l’index, volume de données indexées, temps
de recherche moyen. Fournissez des graphiques sur le temps d’indexation, le temps de recherche et la taille de l’index en fonction du volume des données.

Vous devez fournir votre code Java.

Question 2 (2 points)

 À partir du tableau de l’exercice précédent, pouvez-vous dire si la performance de Lucene décroît
avec la taille de l’index ? Si votre volume de données était 1000 fois plus important,
quel serait, environ, le temps de recherche moyen, la taille de l’index et le temps d’indexation ?
 À partir de vos données et de votre analyse, donnez la taille de l’index, le temps nécessaire pour
construire l’index et le temps moyen des requêtes pour les 8 milliards de documents faisant en
moyenne 20 Ko. Cette opération est-elle envisageable ? Que feriez-vous si on vous donnait le mandat de
la faire ?

Question 3 (4 points)

Construisez un index complet de tous les documents (comme celui qui a été généré à la question 1).
Choisissez 50 mots (anglais) différents. Pour chaque mot, trouvez le nombre de documents
dans lequel il apparaît. Ensuite, considérez chaque paire de mots
(il y en a {50 \choose 2} = \frac{50\times 49 } {2}=1225). Pour chaque
paire de mots, faites une recherche pour trouver le nombre de documents contient les deux mots (attention : à ne pas confondre avec un mot ou l’autre).
Répétez chaque requête 10 fois et calculez le temps moyen de chaque requête pour chacune
des 1225 paires de mots. Certaines requêtes prennent-elles plus de temps que
d’autres ? Expliquez vos résultats.

Vous devez fournir votre code Java.


Les travaux du cours INF 6104 ne sont pas sous une licence Creative Commons.