Lucene - Opération de recherche

Le processus de recherche est l'une des fonctionnalités de base fournies par Lucene. Le diagramme suivant illustre le processus et son utilisation. IndexSearcher est l'un des composants essentiels du processus de recherche.

Nous créons d'abord des répertoires contenant des index , puis nous les transmettons à IndexSearcher qui ouvre le répertoire à l' aide d' IndexReader . Ensuite, nous créons une requête avec un terme et effectuons une recherche à l'aide d' IndexSearcher en transmettant la requête au chercheur. IndexSearcher renvoie un objet TopDocs qui contient les détails de la recherche ainsi que les ID de document du document qui est le résultat de l'opération de recherche.

Nous allons maintenant vous montrer une approche par étapes et vous aider à comprendre le processus d'indexation à l'aide d'un exemple de base.

Créer un QueryParser

La classe QueryParser analyse l'entrée saisie par l'utilisateur dans la requête au format compréhensible Lucene. Suivez ces étapes pour créer un QueryParser -

Step 1 - Créer un objet de QueryParser.

Step 2 - Initialisez l'objet QueryParser créé avec un analyseur standard ayant les informations de version et le nom d'index sur lequel cette requête doit être exécutée.

QueryParser queryParser;

public Searcher(String indexDirectoryPath) throws IOException {

   queryParser = new QueryParser(Version.LUCENE_36,
      LuceneConstants.CONTENTS,
      new StandardAnalyzer(Version.LUCENE_36));
}

Créer un IndexSearcher

La classe IndexSearcher agit comme un composant principal que les index de recherche ont créé pendant le processus d'indexation. Suivez ces étapes pour créer un IndexSearcher -

Step 1 - Créer un objet d'IndexSearcher.

Step 2 - Créez un répertoire Lucene qui doit pointer vers l'emplacement où les index doivent être stockés.

Step 3 - Initialisez l'objet IndexSearcher créé avec le répertoire d'index.

IndexSearcher indexSearcher;

public Searcher(String indexDirectoryPath) throws IOException {
   Directory indexDirectory = 
      FSDirectory.open(new File(indexDirectoryPath));
   indexSearcher = new IndexSearcher(indexDirectory);
}

Effectuer une recherche

Suivez ces étapes pour effectuer une recherche -

Step 1 - Créez un objet Query en analysant l'expression de recherche via QueryParser.

Step 2 - Effectuez une recherche en appelant la méthode IndexSearcher.search ().

Query query;

public TopDocs search( String searchQuery) throws IOException, ParseException {
   query = queryParser.parse(searchQuery);
   return indexSearcher.search(query, LuceneConstants.MAX_SEARCH);
}

Obtenez le document

Le programme suivant montre comment obtenir le document.

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

Fermer IndexSearcher

Le programme suivant montre comment fermer l'IndexSearcher.

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

Exemple d'application

Créons une application de test Lucene pour tester le processus de recherche.

Étape La description
1

Créez un projet avec un nom LuceneFirstApplication sous un package com.tutorialspoint.lucene comme expliqué dans le chapitre Lucene - Première application . Vous pouvez également utiliser le projet créé dans le chapitre Lucene - Première application en tant que tel pour ce chapitre pour comprendre le processus de recherche.

2

Créez LuceneConstants.java, TextFileFilter.java et Searcher.java comme expliqué dans le chapitre Lucene - Première application . Gardez le reste des fichiers inchangés.

3

Créez LuceneTester.java comme indiqué ci-dessous.

4

Nettoyez et créez l'application pour vous assurer que la logique métier fonctionne conformément aux exigences.

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 filtre de fichiers.

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");
   }
}

Searcher.java

Cette classe permet de lire les index créés sur des données brutes et de rechercher des données à l'aide de la bibliothèque Lucene.

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é 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";
   Searcher searcher;

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

   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) +" ms");
      for(ScoreDoc scoreDoc : hits.scoreDocs) {
         Document doc = searcher.getDocument(scoreDoc);
         System.out.println("File: "+ doc.get(LuceneConstants.FILE_PATH));
      }
      searcher.close();
   }	
}

Création de répertoires de données et d'index

Nous avons utilisé 10 fichiers texte nommés record1.txt pour 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éé sous la forme E: \ Lucene \ Index. Après avoir exécuté le programme d'indexation dans le chapitreLucene - Indexing Process, vous pouvez voir la liste des fichiers d'index créés dans ce dossier.

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, du répertoire d'index et des index, vous pouvez continuer en compilant et en exécutant votre programme. Pour ce faire, gardezLuceneTester.Java onglet fichier actif et utilisez soit l'option Exécuter disponible dans l'EDI Eclipse, soit utilisez Ctrl + F11 pour compiler et exécuter votre LuceneTesterapplication. Si votre application s'exécute avec succès, elle imprimera le message suivant dans la console d'Eclipse IDE -

1 documents found. Time :29 ms
File: E:\Lucene\Data\record4.txt