Lucene est une bibliothèque d'indexation / recherche
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 :
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 :
Pour la version compatible avec Lucene 4.7, télécharger luke 4.7.
Lancer luke :
java -jar lukeall-4.7.0.jar
Préalable : Mettre un marque-page sur la documentation en ligne
:::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);
:::java
Document doc = new Document();
doc.add(new StringField(...));
doc.add(new LongField(...));
doc.add(new TextField());
writer.addDocument(doc);
:::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();
:::java
writer.close();
:::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);
:::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);
:::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"));
}
:::java
reader.close();
Objectif : indexer les poésies de Rimbaud pour permettre une recherche :
Note : le fichier rimbaud_poesies.csv liste l'ensemble des poesies avec leur titre, année et taille du fichier
Anonymous
poesies.zip
rimbaud_poesies.csv