Lucene - Première application

Dans ce chapitre, nous allons apprendre la programmation réelle avec Lucene Framework. Avant de commencer à écrire votre premier exemple à l'aide du framework Lucene, vous devez vous assurer que vous avez correctement configuré votre environnement Lucene comme expliqué dans Lucene - Tutoriel de configuration de l'environnement . Il est recommandé que vous ayez les connaissances pratiques d'Eclipse IDE.

Continuons maintenant en écrivant une application de recherche simple qui imprimera le nombre de résultats de recherche trouvés. Nous verrons également la liste des index créés au cours de ce processus.

Étape 1 - Créer un projet Java

La première étape consiste à créer un projet Java simple à l'aide de l'IDE Eclipse. Suivez l'optionFile > New -> Project et enfin sélectionner Java Projectassistant dans la liste des assistants. Maintenant, nommez votre projet commeLuceneFirstApplication en utilisant la fenêtre de l'assistant comme suit -

Une fois votre projet créé avec succès, vous aurez le contenu suivant dans votre Project Explorer -

Étape 2 - Ajouter les bibliothèques requises

Ajoutons maintenant la bibliothèque Lucene core Framework dans notre projet. Pour ce faire, faites un clic droit sur le nom de votre projetLuceneFirstApplication puis suivez l'option suivante disponible dans le menu contextuel: Build Path -> Configure Build Path pour afficher la fenêtre Java Build Path comme suit -

Maintenant, utilisez Add External JARs bouton disponible sous Libraries onglet pour ajouter le JAR principal suivant à partir du répertoire d'installation de Lucene -

  • lucene-core-3.6.2

Étape 3 - Créer des fichiers source

Créons maintenant des fichiers source réels sous le LuceneFirstApplicationprojet. Nous devons d'abord créer un package appelécom.tutorialspoint.lucene. Pour ce faire, faites un clic droit sur src dans la section de l'explorateur de paquets et suivez l'option: New -> Package.

Ensuite, nous allons créer LuceneTester.java et d'autres classes java sous le com.tutorialspoint.lucene paquet.

LuceneConstants.java

Cette classe est utilisée pour fournir diverses constantes à utiliser dans l'exemple d'application.

package com.tutorialspoint.lucene;

public class LuceneConstants {
   public static final String CONTENTS = "contents";
   public static final String FILE_NAME = "filename";
   public static final String FILE_PATH = "filepath";
   public static final int MAX_SEARCH = 10;
}

TextFileFilter.java

Cette classe est utilisée comme un .txt file filtre.

package com.tutorialspoint.lucene;

import java.io.File;
import java.io.FileFilter;

public class TextFileFilter implements FileFilter {

   @Override
   public boolean accept(File pathname) {
      return pathname.getName().toLowerCase().endsWith(".txt");
   }
}

Indexer.java

Cette classe est utilisée pour indexer les données brutes afin que nous puissions les rendre consultables à l'aide de la bibliothèque Lucene.

package com.tutorialspoint.lucene;

import java.io.File;
import java.io.FileFilter;
import java.io.FileReader;
import java.io.IOException;

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;

public class Indexer {

   private IndexWriter writer;

   public Indexer(String indexDirectoryPath) throws IOException {
      //this directory will contain the indexes
      Directory indexDirectory = 
         FSDirectory.open(new File(indexDirectoryPath));

      //create the indexer
      writer = new IndexWriter(indexDirectory, 
         new StandardAnalyzer(Version.LUCENE_36),true, 
         IndexWriter.MaxFieldLength.UNLIMITED);
   }

   public void close() throws CorruptIndexException, IOException {
      writer.close();
   }

   private Document getDocument(File file) throws IOException {
      Document document = new Document();

      //index file contents
      Field contentField = new Field(LuceneConstants.CONTENTS, new FileReader(file));
      //index file name
      Field fileNameField = new Field(LuceneConstants.FILE_NAME,
         file.getName(),Field.Store.YES,Field.Index.NOT_ANALYZED);
      //index file path
      Field filePathField = new Field(LuceneConstants.FILE_PATH,
         file.getCanonicalPath(),Field.Store.YES,Field.Index.NOT_ANALYZED);

      document.add(contentField);
      document.add(fileNameField);
      document.add(filePathField);

      return document;
   }   

   private void indexFile(File file) throws IOException {
      System.out.println("Indexing "+file.getCanonicalPath());
      Document document = getDocument(file);
      writer.addDocument(document);
   }

   public int createIndex(String dataDirPath, FileFilter filter) 
      throws IOException {
      //get all files in the data directory
      File[] files = new File(dataDirPath).listFiles();

      for (File file : files) {
         if(!file.isDirectory()
            && !file.isHidden()
            && file.exists()
            && file.canRead()
            && filter.accept(file)
         ){
            indexFile(file);
         }
      }
      return writer.numDocs();
   }
}

Searcher.java

Cette classe est utilisée pour rechercher les index créés par l'indexeur pour rechercher le contenu demandé.

package com.tutorialspoint.lucene;

import java.io.File;
import java.io.IOException;

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;

public class Searcher {
	
   IndexSearcher indexSearcher;
   QueryParser queryParser;
   Query query;
   
   public Searcher(String indexDirectoryPath) 
      throws IOException {
      Directory indexDirectory = 
         FSDirectory.open(new File(indexDirectoryPath));
      indexSearcher = new IndexSearcher(indexDirectory);
      queryParser = new QueryParser(Version.LUCENE_36,
         LuceneConstants.CONTENTS,
         new StandardAnalyzer(Version.LUCENE_36));
   }
   
   public TopDocs search( String searchQuery) 
      throws IOException, ParseException {
      query = queryParser.parse(searchQuery);
      return indexSearcher.search(query, LuceneConstants.MAX_SEARCH);
   }

   public Document getDocument(ScoreDoc scoreDoc) 
      throws CorruptIndexException, IOException {
      return indexSearcher.doc(scoreDoc.doc);	
   }

   public void close() throws IOException {
      indexSearcher.close();
   }
}

LuceneTester.java

Cette classe est utilisée pour tester la capacité d'indexation et de recherche de la bibliothèque lucene.

package com.tutorialspoint.lucene;

import java.io.IOException;

import org.apache.lucene.document.Document;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;

public class LuceneTester {
	
   String indexDir = "E:\\Lucene\\Index";
   String dataDir = "E:\\Lucene\\Data";
   Indexer indexer;
   Searcher searcher;

   public static void main(String[] args) {
      LuceneTester tester;
      try {
         tester = new LuceneTester();
         tester.createIndex();
         tester.search("Mohan");
      } catch (IOException e) {
         e.printStackTrace();
      } catch (ParseException e) {
         e.printStackTrace();
      }
   }

   private void createIndex() throws IOException {
      indexer = new Indexer(indexDir);
      int numIndexed;
      long startTime = System.currentTimeMillis();	
      numIndexed = indexer.createIndex(dataDir, new TextFileFilter());
      long endTime = System.currentTimeMillis();
      indexer.close();
      System.out.println(numIndexed+" File indexed, time taken: "
         +(endTime-startTime)+" ms");		
   }

   private void search(String searchQuery) throws IOException, ParseException {
      searcher = new Searcher(indexDir);
      long startTime = System.currentTimeMillis();
      TopDocs hits = searcher.search(searchQuery);
      long endTime = System.currentTimeMillis();
   
      System.out.println(hits.totalHits +
         " documents found. Time :" + (endTime - startTime));
      for(ScoreDoc scoreDoc : hits.scoreDocs) {
         Document doc = searcher.getDocument(scoreDoc);
            System.out.println("File: "
            + doc.get(LuceneConstants.FILE_PATH));
      }
      searcher.close();
   }
}

Étape 4 - Création du répertoire Data & Index

Nous avons utilisé 10 fichiers texte de record1.txt à record10.txt contenant les noms et autres détails des étudiants et les avons mis dans le répertoire E:\Lucene\Data. Données de test . Un chemin de répertoire d'index doit être créé commeE:\Lucene\Index. Après avoir exécuté ce programme, vous pouvez voir la liste des fichiers d'index créés dans ce dossier.

Étape 5 - Exécution du programme

Une fois que vous avez terminé la création de la source, des données brutes, du répertoire de données et du répertoire d'index, vous êtes prêt pour la compilation et l'exécution de votre programme. Pour ce faire, gardez leLuceneTester.Java onglet fichier actif et utilisez soit le Run option disponible dans l'IDE Eclipse ou utilisez Ctrl + F11 pour compiler et exécuter votre LuceneTesterapplication. Si l'application s'exécute avec succès, elle imprimera le message suivant dans la console d'Eclipse IDE -

Indexing E:\Lucene\Data\record1.txt
Indexing E:\Lucene\Data\record10.txt
Indexing E:\Lucene\Data\record2.txt
Indexing E:\Lucene\Data\record3.txt
Indexing E:\Lucene\Data\record4.txt
Indexing E:\Lucene\Data\record5.txt
Indexing E:\Lucene\Data\record6.txt
Indexing E:\Lucene\Data\record7.txt
Indexing E:\Lucene\Data\record8.txt
Indexing E:\Lucene\Data\record9.txt
10 File indexed, time taken: 109 ms
1 documents found. Time :0
File: E:\Lucene\Data\record4.txt

Une fois que vous avez exécuté le programme avec succès, vous aurez le contenu suivant dans votre index directory -