Lucene - Operación de actualización del documento

La actualización del documento es otra operación importante como parte del proceso de indexación. Esta operación se utiliza cuando los contenidos ya indexados se actualizan y los índices dejan de ser válidos. Esta operación también se conoce como reindexación.

Actualizamos los documentos que contienen campos a IndexWriter, donde IndexWriter se usa para actualizar índices.

Ahora le mostraremos un enfoque paso a paso y lo ayudaremos a comprender cómo actualizar el documento usando un ejemplo básico.

Actualizar un documento a un índice

Siga este paso para actualizar un documento a un índice:

Step 1 - Cree un método para actualizar un documento de Lucene a partir de un archivo de texto actualizado.

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

Crear un IndexWriter

Siga estos pasos para crear un IndexWriter:

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

Step 2 - Crear objeto de IndexWriter.

Step 3 - Cree un directorio de Lucene que apunte a la ubicación donde se almacenarán los índices.

Step 4 - Inicialice el objeto IndexWriter creado con el directorio de índice, un analizador estándar que tiene información de 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);
}

Actualice el documento y comience el proceso de reindexación

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

  • updateDocument(Term, Document) - Elimine el documento que contiene el término y agregue el documento usando el analizador predeterminado (especificado cuando se crea el escritor de índice).

  • updateDocument(Term, Document,Analyzer) - Elimine el documento que contiene el término y agregue el documento usando el analizador provisto.

private void indexFile(File file) throws IOException {
   System.out.println("Updating index for "+file.getCanonicalPath());
   updateDocument(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 el nombre LuceneFirstApplication en packagecom.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 se utiliza para proporcionar varias constantes que se utilizarán 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 para que podamos buscarlos 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.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

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

Aquí, 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 comoE:\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 continuar con la compilación y ejecución de 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:

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

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