Lucene - Operación Agregar documento

Agregar documento es una de las operaciones principales del proceso de indexación.

Nos sumamos documento (s) que contiene Field (s) a IndexWriter donde IndexWriter se utiliza para actualizar o crear índices.

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

Agregar un documento a un índice

Siga estos pasos para agregar un documento a un índice:

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

Step 2 - Cree varios campos que sean pares clave-valor que contengan claves como nombres y valores como contenidos a indexar.

Step 3- Establecer campo para ser analizado o no. En nuestro caso, solo se analizará el contenido, ya que puede contener datos como a, am, are, etc., que no son necesarios en las operaciones de búsqueda.

Step 4 - Agregue los campos recién creados al objeto de documento y devuélvalo al método de llamada.

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

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 apunte a la ubicación donde se almacenarán los índices.

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

Agregar documento e iniciar el proceso de indexación

Las siguientes dos son las formas de agregar el documento.

  • addDocument(Document) - Agrega el documento usando el analizador predeterminado (especificado cuando se crea el escritor de índice).

  • addDocument(Document,Analyzer) - Agrega el documento usando el analizador provisto.

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

Aplicación de ejemplo

Para probar el proceso de indexación, necesitamos crear la 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 . Para comprender el proceso de indexación, también puede utilizar el proyecto creado en el capítulo EJB - Primera aplicación como tal para este capítulo.
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 filtro de archivo .txt.

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

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();
      System.out.println(numIndexed+" File indexed, time taken: "
         +(endTime-startTime)+" ms");		
   }
}

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 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, la creación de los datos sin procesar, el directorio de datos y el directorio de índice, estará listo para este paso que consiste en compilar y ejecutar su programa. Para hacer esto, mantenga activa la pestaña del archivo LuceneTester.Java y use la opción Ejecutar disponible en el IDE de Eclipse o useCtrl + F11 para compilar y ejecutar su LuceneTestersolicitud. Si su aplicación se ejecuta correctamente, imprimirá el siguiente mensaje en la consola de Eclipse IDE:

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

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