Lucene - Processo di indicizzazione

Il processo di indicizzazione è una delle funzionalità principali fornite da Lucene. Il diagramma seguente illustra il processo di indicizzazione e l'uso delle classi. IndexWriter è il componente più importante e fondamentale del processo di indicizzazione.

Aggiungiamo i documenti contenenti i campi a IndexWriter che analizza i documenti utilizzando l' analizzatore e quindi crea / apre / modifica gli indici come richiesto e li archivia / li aggiorna in una directory . IndexWriter viene utilizzato per aggiornare o creare indici. Non viene utilizzato per leggere gli indici.

Ora ti mostreremo un processo passo passo per iniziare a comprendere il processo di indicizzazione utilizzando un esempio di base.

Crea un documento

  • Crea un metodo per ottenere un documento Lucene da un file di testo.

  • Crea vari tipi di campi che sono coppie di valori chiave contenenti chiavi come nomi e valori come contenuti da indicizzare.

  • Imposta il campo da analizzare o meno. Nel nostro caso vanno analizzati solo i contenuti in quanto possono contenere dati come a, am, are, an etc. che non sono richiesti nelle operazioni di ricerca.

  • Aggiungi i campi appena creati all'oggetto documento e restituiscilo al metodo del chiamante.

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

Crea un IndexWriter

La classe IndexWriter funge da componente principale che crea / aggiorna gli indici durante il processo di indicizzazione. Segui questi passaggi per creare un IndexWriter:

Step 1 - Crea oggetto di IndexWriter.

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

Step 3 - Inizializza l'oggetto IndexWriter creato con la directory index, un analizzatore standard con informazioni sulla versione e altri parametri obbligatori / facoltativi.

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

Avvia il processo di indicizzazione

Il seguente programma mostra come avviare un processo di indicizzazione:

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

Applicazione di esempio

Per testare il processo di indicizzazione, è necessario creare un test dell'applicazione Lucene.

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 indicizzazione.

2

Creare LuceneConstants.java, TextFileFilter.java e Indexer.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");
   }
}

Indexer.java

Questa classe viene utilizzata per indicizzare i dati grezzi in modo che possiamo renderli ricercabili utilizzando la libreria 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();
   }
}

LuceneTester.java

Questa classe viene utilizzata per testare la capacità di indicizzazione della libreria Lucene.

package com.tutorialspoint.lucene;

import java.io.IOException;

public class LuceneTester {
	
   String indexDir = "E:\\Lucene\\Index";
   String dataDir = "E:\\Lucene\\Data";
   Indexer indexer;
   
   public static void main(String[] args) {
      LuceneTester tester;
      try {
         tester = new LuceneTester();
         tester.createIndex();
      } catch (IOException 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");		
   }
}

Creazione di directory di dati e indici

Abbiamo utilizzato 10 file di testo da record1.txt a record10.txt contenenti nomi e altri dettagli degli studenti e li abbiamo inseriti nella directory E:\Lucene\Data. Dati di prova . Un percorso della directory dell'indice dovrebbe essere creato comeE:\Lucene\Index. Dopo aver eseguito questo programma, 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 e della directory dell'indice, puoi procedere compilando ed eseguendo il tuo programma. Per fare ciò, mantenere attiva la scheda del file LuceneTester.Java e utilizzare il fileRun opzione disponibile nell'IDE Eclipse o utilizzare Ctrl + F11 per compilare ed eseguire il tuo LuceneTesterapplicazione. Se l'applicazione viene eseguita correttamente, stamperà il seguente messaggio nella console dell'IDE di Eclipse:

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

Dopo aver eseguito il programma con successo, avrai il seguente contenuto nel tuo file index directory −