Lucene - Opciones de campo

El campo es la unidad más importante del proceso de indexación. Es el objeto real que contiene el contenido a indexar. Cuando agregamos un campo, Lucene proporciona numerosos controles en el campo utilizando las Opciones de campo que indican cuánto se puede buscar un campo.

Añadimos 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 las diversas opciones de campo utilizando un ejemplo básico.

Varias opciones de campo

A continuación se muestran las diversas opciones de campo:

  • Index.ANALYZED- En esto, primero analizamos, luego indexamos. Se utiliza para la indexación de texto normal. Analyzer dividirá el valor del campo en un flujo de tokens y cada token se puede buscar por separado.

  • Index.NOT_ANALYZED- En esto, no analizamos, sino indexamos. Se utiliza para indexar el texto completo. Por ejemplo, nombres de personas, URL, etc.

  • Index.ANALYZED_NO_NORMS - Esta es una variante de Index.ANALYZED. El analizador dividirá el valor del campo en un flujo de tokens y cada token se puede buscar por separado. Sin embargo, los NORM no se almacenan en los índices. Los NORMAS se utilizan para impulsar la búsqueda y esto a menudo termina consumiendo mucha memoria.

  • Index.Index.NOT_ANALYZED_NO_NORMS - Esta es una variante de Index.NOT_ANALYZED. Se realiza la indexación, pero los NORMAS no se almacenan en los índices.

  • Index.NO - El valor del campo no se puede buscar.

Uso de opciones de campo

A continuación se muestran las diferentes formas en que se pueden utilizar las opciones de campo:

  • Crear un método para obtener un documento Lucene a partir de un archivo de texto.

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

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

  • Para agregar los campos recién creados al objeto de documento y devolverlo 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;
}

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

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 -