Lucene - Elimina operazione documento

L'eliminazione del documento è un'altra importante operazione del processo di indicizzazione. Questa operazione viene utilizzata quando i contenuti già indicizzati vengono aggiornati e gli indici diventano non validi o gli indici diventano di dimensioni molto grandi, quindi per ridurre le dimensioni e aggiornare l'indice, vengono eseguite le operazioni di cancellazione.

Cancelliamo documento (s) contenente Field (s) a IndexWriter dove IndexWriter viene utilizzato per gli indici di aggiornamento.

Ora ti mostreremo un approccio graduale e ti faremo capire come eliminare un documento utilizzando un esempio di base.

Elimina un documento da un indice

Segui questi passaggi per eliminare un documento da un indice:

Step 1 - Creare un metodo per eliminare un documento Lucene da un file di testo obsoleto.

private void deleteDocument(File file) throws IOException {
   
   //delete indexes for a file
   writer.deleteDocument(new Term(LuceneConstants.FILE_NAME,file.getName())); 

   writer.commit();
   System.out.println("index contains deleted files: "+writer.hasDeletions());
   System.out.println("index contains documents: "+writer.maxDoc());
   System.out.println("index contains deleted documents: "+writer.numDoc());
}

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 a una posizione in cui devono essere archiviati gli indici.

Step 3 - Inizializza l'oggetto IndexWriter creato con la directory index, un analizzatore standard con le 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);
}

Elimina documento e avvia il processo di reindicizzazione

Di seguito sono riportati i modi per eliminare il documento.

  • deleteDocuments(Term) - Elimina tutti i documenti contenenti il ​​termine.

  • deleteDocuments(Term[]) - Elimina tutti i documenti contenenti uno dei termini nella matrice.

  • deleteDocuments(Query) - Elimina tutti i documenti che corrispondono alla query.

  • deleteDocuments(Query[]) - Elimina tutti i documenti che corrispondono alla query nell'array.

  • deleteAll - Elimina tutti i documenti.

private void indexFile(File file) throws IOException {
   System.out.println("Deleting index for "+file.getCanonicalPath());
   deleteDocument(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 pacchetto com.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 fornisce varie costanti che possono essere utilizzate 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 tal modo, rendendoli 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.index.Term;
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 deleteDocument(File file) throws IOException {
      //delete indexes for a file
      writer.deleteDocuments(
         new Term(LuceneConstants.FILE_NAME,file.getName())); 

	  writer.commit();  
   }  

   private void indexFile(File file) throws IOException {
      System.out.println("Deleting index: "+file.getCanonicalPath());
      deleteDocument(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

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 . È necessario creare un percorso della directory dell'indice come E: \ 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 compilare ed eseguire il 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:

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

Dopo aver eseguito correttamente il programma, avrai i seguenti contenuti nel tuo file index directory -