Lucene - Operación Eliminar documento

Eliminar documento es otra operación importante del proceso de indexación. Esta operación se utiliza cuando se actualizan contenidos ya indexados y los índices se vuelven inválidos o los índices se vuelven muy grandes, entonces para reducir el tamaño y actualizar el índice, se realizan operaciones de eliminación.

Borramos documento (s) que contiene Field (s) a IndexWriter donde IndexWriter se utiliza para actualizar los índices.

Ahora le mostraremos un enfoque paso a paso y le haremos comprender cómo eliminar un documento con un ejemplo básico.

Eliminar un documento de un índice

Siga estos pasos para eliminar un documento de un índice:

Step 1 - Cree un método para eliminar un documento Lucene de un archivo de texto 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());
}

Crear un IndexWriter

La clase IndexWriter actúa como un componente central que crea / actualiza índices durante el proceso de indexación.

Siga estos pasos para crear un IndexWriter:

Step 1 - Crear objeto de IndexWriter.

Step 2 - Cree un directorio de Lucene que debe apuntar a una ubicación donde se almacenarán los índices.

Step 3 - Inicialice el objeto IndexWriter creado con el directorio de índice, un analizador estándar que tiene la información de la versión y otros parámetros obligatorios / opcionales.

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

Eliminar documento e iniciar el proceso de reindexación

A continuación se muestran las formas de eliminar el documento.

  • deleteDocuments(Term) - Eliminar todos los documentos que contienen el término.

  • deleteDocuments(Term[]) - Elimine todos los documentos que contengan cualquiera de los términos de la matriz.

  • deleteDocuments(Query) - Eliminar todos los documentos que coincidan con la consulta.

  • deleteDocuments(Query[]) - Elimine todos los documentos que coincidan con la consulta en la matriz.

  • deleteAll - Eliminar todos los documentos.

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

Aplicación de ejemplo

Para probar el proceso de indexación, creemos una prueba de la aplicación Lucene.

Paso Descripción
1

Cree un proyecto con un nombre LuceneFirstApplication en un paquete com.tutorialspoint.lucene como se explica en el capítulo Lucene - Primera aplicación . También puede utilizar el proyecto creado en EJB - Capítulo Primera aplicación como tal para este capítulo para comprender el proceso de indexación.

2

Cree LuceneConstants.java, TextFileFilter.java e Indexer.java como se explica en el capítulo Lucene - Primera aplicación . Mantenga el resto de los archivos sin cambios.

3

Cree LuceneTester.java como se menciona a continuación.

4

Limpie y compile la aplicación para asegurarse de que la lógica empresarial funcione según los requisitos.

LuceneConstants.java

Esta clase proporciona varias constantes que se pueden utilizar en la aplicación de muestra.

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

Esta clase se utiliza como .txt filtro de archivos.

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

Esta clase se usa para indexar los datos sin procesar, por lo que se pueden buscar usando la biblioteca 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

Esta clase se utiliza para probar la capacidad de indexación de la biblioteca 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();
   }
}

Creación de directorios de datos e índices

Hemos utilizado 10 archivos de texto de record1.txt a record10.txt que contienen nombres y otros detalles de los estudiantes y los colocamos en el directorio E: \ Lucene \ Data. Prueba de datos . Se debe crear una ruta de directorio de índice como E: \ Lucene \ Index. Después de ejecutar este programa, puede ver la lista de archivos de índice creados en esa carpeta.

Ejecutando el programa

Una vez que haya terminado con la creación de la fuente, los datos sin procesar, el directorio de datos y el directorio de índice, puede compilar y ejecutar su programa. Para hacer esto, mantenga elLuceneTester.Java pestaña de archivo activa y use la opción Ejecutar disponible en el IDE de Eclipse o use Ctrl + F11 para compilar y ejecutar su LuceneTestersolicitud. Si su aplicación se ejecuta correctamente, imprimirá el siguiente mensaje en la consola de Eclipse IDE:

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

Una vez que haya ejecutado el programa con éxito, tendrá el siguiente contenido en su index directory -