Lucene - Proceso de indexación

El proceso de indexación es una de las funciones principales proporcionadas por Lucene. El siguiente diagrama ilustra el proceso de indexación y el uso de clases. IndexWriter es el componente principal y más importante del proceso de indexación.

Añadimos documento (s) que contiene Field (s) a IndexWriter que analiza el documento (s) usando el analizador y luego crea / / editar abiertas índices según sea necesario y almacenarlos / actualizar en un directorio . IndexWriter se utiliza para actualizar o crear índices. No se utiliza para leer índices.

Ahora, le mostraremos un proceso paso a paso para comenzar a comprender el proceso de indexación mediante un ejemplo básico.

Crea un documento

  • Cree un método para obtener un documento lucene a partir de un archivo de texto.

  • Cree varios tipos de campos que sean pares clave-valor que contengan claves como nombres y valores como contenido a indexar.

  • Establecer campo para ser analizado o no. En nuestro caso, solo se analizarán los contenidos, ya que pueden contener datos como a, am, are, etc. que no son necesarios en las operaciones de búsqueda.

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

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

Iniciar proceso de indexación

El siguiente programa muestra cómo iniciar un proceso de indexación:

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 una prueba de aplicación Lucene.

Paso Descripción
1

Cree un proyecto con el 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 Lucene - 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 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, los datos sin procesar, el directorio de datos y el directorio de índice, puede proceder compilando y ejecutando su programa. Para hacer esto, mantenga activa la pestaña del archivo LuceneTester.Java y use elRun opción disponible en Eclipse IDE 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:

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 −