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
// 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);
Document doc = new Document(); doc.add(new StringField(...)); doc.add(new LongField(...)); doc.add(new TextField()); writer.addDocument(doc);
// 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();
writer.close();
// 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);
// 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);
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")); }
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