Menu

2014-03-19  Edit

crim.fr, prof java

Introduction à Lucene

Lucene est une bibliothèque d'indexation / recherche

  • open-source (licence Apache)
  • 100% java
  • très performante (en indexation et en recherche)
  • très répandue, base des applications Apache Solr et elasticsearch

Concepts

  • document
  • champ
  • analyseur / terme

TP1 - Tester Lucene

  • Télécharger la dernière version de lucene (4.7.0)
  • Décompresser lucene-4.7.0.zip sur le disque
  • Créer un dossier src/ dans le dossier lucene et y décompresser les sources (lucene-4.7.0-src.tgz)

Lancer la démo

Plutôt que les sources Java de Lucene, on utilisera les poèmes de Rimbaud (cf. poesies.zip en bas de page) comme corpus à indexer.

Les 4 jars nécessaires au fonctionnement de la démo sont :

  • core/lucene-core-4.7.0.jar
  • queryparser/lucene-queryparser-4.7.0.jar
  • analysis/common/lucene-analyzers-common-4.7.0.jar
  • demo/lucene-demo-4.7.0.jar

Indexation en ligne de commande

    java -cp CP org.apache.lucene.demo.IndexFiles -docs poesies

Note : Un nouveau dossier index devrait apparaître

Recherche en ligne de commande

    java -cp CP org.apache.lucene.demo.SearchFiles

Note : il est possible de lancer la démo sous Eclipse, il faut dans ce cas :

  • créer un nouveau projet
  • créer un dossier lib et y ajouter les 4 jars
  • ajouter les jars au build-path
  • créer une configuration de lancement (run configuration) en précisant la classe à appeler et les paramètres

Examiner les indexes créés avec Luke

Pour la version compatible avec Lucene 4.7, télécharger luke 4.7.

Lancer luke :

    java -jar lukeall-4.7.0.jar
  • Au lancement de luke, on choisit le dossier d'index à examiner
  • L'onglet Overview montre l'ensemble des champs de l'index avec les valeurs les plus fréquentes
  • L'onglet Documents permet de parcourir l'ensemble de l'index ou un résultat de recherche
  • L'onglet Search est dédié à la recherche

Analyse du code source de la démo

API

Préalable : Mettre un marque-page sur la documentation en ligne

  • org.apache.lucene.document.Document
  • org.apache.lucene.document.Field
    • org.apache.lucene.document.Field.Index
      • Index.NO
      • Index.NOT_ANALYZED
      • Index.ANALYZED
    • org.apache.lucene.document.Field.Store
      • Store.YES
      • Store.NO
  • org.apache.lucene.index.IndexWriter
  • org.apache.lucene.store.FSDirectory
  • org.apache.lucene.store.RAMDirectory
  • org.apache.lucene.search.IndexReader
  • org.apache.lucene.search.IndexSearcher
  • org.apache.lucene.search.Query

Code snippets

Créer un index Lucene

    // indexDir est une objet de type java.io.File
    // = dossier où sont stockés les indexes
    Directory dir = FSDirectory.open(new File(indexDir));
    Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_47);
    IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_47, analyzer);

    iwc.setOpenMode(OpenMode.CREATE);
    // ou
    // iwc.setOpenMode(OpenMode.CREATE_OR_APPEND);

    IndexWriter writer = new IndexWriter(dir, iwc);

Créer un document et l'ajouter dans l'index

    Document doc = new Document();
    doc.add(new StringField(...));
    doc.add(new LongField(...));
    doc.add(new TextField());
    writer.addDocument(doc);

Supprimer un/des document(s)

    // Supprime les documents qui contiennent le champ "obsolete"
    writer.deleteDocuments(new Term("obsolete"));

    // Supprime les documents dont le champ "categorie" est "boulon"
    writer.deleteDocuments(new Term("categorie", "boulon"));

    // Supprime tous les documents de l'index
    writer.deleteAll();

Fermer

    writer.close();

Ouvrir un index Lucene en lecture

    // indexDir est un objet de type java.io.File
    // = dossier où sont stockés les indexes
    IndexReader reader = DirectoryReader.open(FSDirectory.open(new File(index)));
    IndexSearcher searcher = new IndexSearcher(reader);

Rechercher sur un champ

    // Recherche sur la valeur exacte d'un terme
    Query query = new TermQuery(new Term("catcode", "XKZA"));

    // Recherche analysée
    Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_47);
    QueryParser parser = new QueryParser(Version.LUCENE_47, "contents", analyzer);
    Query query = parser.parse(expression);

    // Recherche les 100 premiers résultats sans filtre (null)
    TopDocs hits = searcher.search(query, null, 100);

Afficher les résultats

    int max = hits.totalHits;
    for (int i=0; i<max; i++) {
        Document doc = searcher.doc(hits.scoreDocs[i].doc);

        System.println("#"+i+" "+doc.get("ftitle"));
    }

Fermer

    reader.close();

TP : Indexer plus finement les poesies de Rimbaud

Objectif : indexer les poésies de Rimbaud pour permettre une recherche :

  • sur le contenu en plein-texte
  • affichant dans les résultats :
    • le titre
    • l'année entre parenthèses (lorsqu'elle est disponible)

Note : le fichier rimbaud_poesies.csv liste l'ensemble des poesies avec leur titre, année et taille du fichier


Related

Wiki: Home

Discussion

  • crim.fr, prof java

    poesies.zip

     
  • crim.fr, prof java

    rimbaud_poesies.csv

     

Anonymous
Anonymous

Add attachments
Cancel