Lucene - Operazione di ricerca

Il processo di ricerca è una delle funzionalità principali fornite da Lucene. Il diagramma seguente illustra il processo e il suo utilizzo. IndexSearcher è uno dei componenti principali del processo di ricerca.

Per prima cosa creiamo una o più directory contenenti indici e poi la passiamo a IndexSearcher che apre la directory utilizzando IndexReader . Quindi creiamo una query con un termine ed eseguiamo una ricerca utilizzando IndexSearcher passando la query al ricercatore. IndexSearcher restituisce un oggetto TopDocs che contiene i dettagli della ricerca insieme agli ID documento del documento che è il risultato dell'operazione di ricerca.

Ora ti mostreremo un approccio graduale e ti aiuteremo a comprendere il processo di indicizzazione utilizzando un esempio di base.

Crea un QueryParser

La classe QueryParser analizza l'input immesso dall'utente nella query di formato comprensibile Lucene. Segui questi passaggi per creare un QueryParser:

Step 1 - Crea oggetto di QueryParser.

Step 2 - Inizializza l'oggetto QueryParser creato con un analizzatore standard con le informazioni sulla versione e il nome dell'indice su cui eseguire la query.

QueryParser queryParser;

public Searcher(String indexDirectoryPath) throws IOException {

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

Crea un IndexSearcher

La classe IndexSearcher funge da componente principale che gli indici di ricerca creati durante il processo di indicizzazione. Segui questi passaggi per creare un IndexSearcher:

Step 1 - Crea oggetto di IndexSearcher.

Step 2 - Creare una directory Lucene che dovrebbe puntare alla posizione in cui devono essere archiviati gli indici.

Step 3 - Inizializza l'oggetto IndexSearcher creato con la directory dell'indice.

IndexSearcher indexSearcher;

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

Effettua la ricerca

Segui questi passaggi per effettuare la ricerca:

Step 1 - Crea un oggetto Query analizzando l'espressione di ricerca tramite QueryParser.

Step 2 - Effettua la ricerca chiamando il metodo IndexSearcher.search ().

Query query;

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

Ottieni il documento

Il seguente programma mostra come ottenere il documento.

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

Chiudi IndexSearcher

Il seguente programma mostra come chiudere IndexSearcher.

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

Applicazione di esempio

Creiamo un'applicazione Lucene di prova per testare il processo di ricerca.

Passo Descrizione
1

Creare un progetto con un nome LuceneFirstApplication sotto un pacchetto com.tutorialspoint.lucene come spiegato nel capitolo Lucene - Prima applicazione . È inoltre possibile utilizzare il progetto creato nel capitolo Lucene - Prima applicazione in quanto tale per questo capitolo per comprendere il processo di ricerca.

2

Creare LuceneConstants.java, TextFileFilter.java e Searcher.java come spiegato nel capitolo Lucene - Prima applicazione . Mantieni invariato il resto dei file.

3

Crea LuceneTester.java come indicato di seguito.

4

Pulisci e crea l'applicazione per assicurarti che la logica aziendale funzioni secondo i requisiti.

LuceneConstants.java

Questa classe viene utilizzata per fornire varie costanti da utilizzare nell'applicazione di esempio.

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

Questa classe viene utilizzata come file .txt filtro file.

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

Questa classe viene utilizzata per leggere gli indici realizzati sui dati grezzi e per ricercare i dati utilizzando la libreria 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

Questa classe viene utilizzata per testare la capacità di ricerca della libreria 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();
   }	
}

Creazione di directory di dati e indici

Abbiamo utilizzato 10 file di testo denominati record1.txt per record10.txt contenenti nomi e altri dettagli degli studenti e li abbiamo inseriti nella directory E: \ Lucene \ Data. Dati di prova . È necessario creare un percorso della directory dell'indice come E: \ Lucene \ Index. Dopo aver eseguito il programma di indicizzazione nel capitoloLucene - Indexing Process, puoi vedere l'elenco dei file di indice creati in quella cartella.

Esecuzione del programma

Una volta che hai finito con la creazione del sorgente, dei dati grezzi, della directory dei dati, della directory degli indici e degli indici, puoi procedere compilando ed eseguendo il tuo programma. Per fare questo, tieniLuceneTester.Java scheda file attiva e utilizzare l'opzione Esegui disponibile nell'IDE Eclipse o utilizzare Ctrl + F11 per compilare ed eseguire il tuo LuceneTesterapplication. Se l'applicazione viene eseguita correttamente, stamperà il seguente messaggio nella console di Eclipse IDE:

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