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

:::java
    // 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

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

Supprimer un/des document(s)

:::java
    // 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

:::java
    writer.close();

Ouvrir un index Lucene en lecture

:::java
    // 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

:::java
    // 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

:::java
    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

:::java
    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





Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.