Lucene - Update Document Operation

L'aggiornamento del documento è un'altra operazione importante nell'ambito del processo di indicizzazione. Questa operazione viene utilizzata quando i contenuti già indicizzati vengono aggiornati e gli indici diventano non validi. Questa operazione è nota anche come reindicizzazione.

Aggiorniamo i documenti contenenti i campi a IndexWriter dove IndexWriter viene utilizzato per aggiornare gli indici.

Ora ti mostreremo un approccio graduale e ti aiuteremo a capire come aggiornare il documento utilizzando un esempio di base.

Aggiorna un documento a un indice

Segui questo passaggio per aggiornare un documento a un indice:

Step 1 - Creare un metodo per aggiornare un documento Lucene da un file di testo aggiornato.

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

   //update indexes for file contents
   writer.updateDocument(new Term 
      (LuceneConstants.CONTENTS, 
      new FileReader(file)),document); 
   writer.close();
}

Crea un IndexWriter

Segui questi passaggi per creare un IndexWriter:

Step 1 - La classe IndexWriter funge da componente principale che crea / aggiorna gli indici durante il processo di indicizzazione.

Step 2 - Crea oggetto di IndexWriter.

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

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

Aggiorna il documento e avvia il processo di reindicizzazione

Di seguito sono riportati i due modi per aggiornare il documento.

  • updateDocument(Term, Document) - Elimina il documento contenente il termine e aggiungi il documento utilizzando l'analizzatore predefinito (specificato quando viene creato il writer dell'indice).

  • updateDocument(Term, Document,Analyzer) - Elimina il documento contenente il termine e aggiungi il documento utilizzando l'analizzatore fornito.

private void indexFile(File file) throws IOException {
   System.out.println("Updating index for "+file.getCanonicalPath());
   updateDocument(file);   
}

Applicazione di esempio

Per testare il processo di indicizzazione, creiamo un test dell'applicazione Lucene.

Passo Descrizione
1

Creare un progetto con un nome LuceneFirstApplication sotto un packagecom.tutorialspoint.lucene come spiegato nel capitolo Lucene - Prima applicazione . È inoltre possibile utilizzare il progetto creato nel capitolo EJB - 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 void updateDocument(File file) throws IOException {
      Document document = new Document();

      //update indexes for file contents
      writer.updateDocument(
         new Term(LuceneConstants.FILE_NAME,
         file.getName()),document); 
      writer.close();
   }  

   private void indexFile(File file) throws IOException {
      System.out.println("Updating index: "+file.getCanonicalPath());
      updateDocument(file);      
   }

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

Creazione di directory di dati e indici

Qui, 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 con la compilazione e l'esecuzione del tuo programma. Per fare ciò, tieni il fileLuceneTester.Java scheda file attiva e utilizzare l'opzione Esegui 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:

Updating index for E:\Lucene\Data\record1.txt
Updating index for E:\Lucene\Data\record10.txt
Updating index for E:\Lucene\Data\record2.txt
Updating index for E:\Lucene\Data\record3.txt
Updating index for E:\Lucene\Data\record4.txt
Updating index for E:\Lucene\Data\record5.txt
Updating index for E:\Lucene\Data\record6.txt
Updating index for E:\Lucene\Data\record7.txt
Updating index for E:\Lucene\Data\record8.txt
Updating index for E:\Lucene\Data\record9.txt
10 File indexed, time taken: 109 ms

Dopo aver eseguito con successo il programma di cui sopra, avrai il seguente contenuto nel tuo file index directory -