Lucene - Operación de búsqueda

El proceso de búsqueda es una de las funcionalidades centrales proporcionadas por Lucene. El siguiente diagrama ilustra el proceso y su uso. IndexSearcher es uno de los componentes centrales del proceso de búsqueda.

Primero creamos directorio (s) que contienen índices y luego lo pasamos a IndexSearcher que abre el directorio usando IndexReader . Luego creamos una consulta con un término y hacemos una búsqueda usando IndexSearcher pasando la consulta al buscador. IndexSearcher devuelve un objeto TopDocs que contiene los detalles de la búsqueda junto con los ID de documento del documento que es el resultado de la operación de búsqueda.

Ahora le mostraremos un enfoque paso a paso y lo ayudaremos a comprender el proceso de indexación mediante un ejemplo básico.

Crear un QueryParser

La clase QueryParser analiza la entrada ingresada por el usuario en la consulta de formato comprensible de Lucene. Siga estos pasos para crear un QueryParser:

Step 1 - Crear objeto de QueryParser.

Step 2 - Inicialice el objeto QueryParser creado con un analizador estándar que tenga información de versión y nombre de índice en el que se ejecutará esta consulta.

QueryParser queryParser;

public Searcher(String indexDirectoryPath) throws IOException {

   queryParser = new QueryParser(Version.LUCENE_36,
      LuceneConstants.CONTENTS,
      new StandardAnalyzer(Version.LUCENE_36));
}

Crear un IndexSearcher

La clase IndexSearcher actúa como un componente central que los índices de búsqueda creados durante el proceso de indexación. Siga estos pasos para crear un IndexSearcher:

Step 1 - Crear objeto de IndexSearcher.

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

Step 3 - Inicialice el objeto IndexSearcher creado con el directorio de índice.

IndexSearcher indexSearcher;

public Searcher(String indexDirectoryPath) throws IOException {
   Directory indexDirectory = 
      FSDirectory.open(new File(indexDirectoryPath));
   indexSearcher = new IndexSearcher(indexDirectory);
}

Hacer búsqueda

Siga estos pasos para realizar la búsqueda:

Step 1 - Cree un objeto de consulta analizando la expresión de búsqueda a través de QueryParser.

Step 2 - Realice una búsqueda llamando al método IndexSearcher.search ().

Query query;

public TopDocs search( String searchQuery) throws IOException, ParseException {
   query = queryParser.parse(searchQuery);
   return indexSearcher.search(query, LuceneConstants.MAX_SEARCH);
}

Obtener el documento

El siguiente programa muestra cómo obtener el documento.

public Document getDocument(ScoreDoc scoreDoc) 
   throws CorruptIndexException, IOException {
   return indexSearcher.doc(scoreDoc.doc);	
}

Cerrar IndexSearcher

El siguiente programa muestra cómo cerrar IndexSearcher.

public void close() throws IOException {
   indexSearcher.close();
}

Aplicación de ejemplo

Creemos una aplicación de prueba de Lucene para probar el proceso de búsqueda.

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 búsqueda.

2

Cree LuceneConstants.java, TextFileFilter.java y Searcher.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");
   }
}

Searcher.java

Esta clase se usa para leer los índices hechos en datos brutos y buscar datos usando la biblioteca Lucene.

package com.tutorialspoint.lucene;

import java.io.File;
import java.io.IOException;

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;

public class Searcher {
	
   IndexSearcher indexSearcher;
   QueryParser queryParser;
   Query query;

   public Searcher(String indexDirectoryPath) throws IOException {
      Directory indexDirectory = 
         FSDirectory.open(new File(indexDirectoryPath));
      indexSearcher = new IndexSearcher(indexDirectory);
      queryParser = new QueryParser(Version.LUCENE_36,
         LuceneConstants.CONTENTS,
         new StandardAnalyzer(Version.LUCENE_36));
   }

   public TopDocs search( String searchQuery) 
      throws IOException, ParseException {
      query = queryParser.parse(searchQuery);
      return indexSearcher.search(query, LuceneConstants.MAX_SEARCH);
   }

   public Document getDocument(ScoreDoc scoreDoc) 
      throws CorruptIndexException, IOException {
      return indexSearcher.doc(scoreDoc.doc);	
   }

   public void close() throws IOException {
      indexSearcher.close();
   }
}

LuceneTester.java

Esta clase se utiliza para probar la capacidad de búsqueda de la biblioteca Lucene.

package com.tutorialspoint.lucene;

import java.io.IOException;

import org.apache.lucene.document.Document;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;

public class LuceneTester {
	
   String indexDir = "E:\\Lucene\\Index";
   String dataDir = "E:\\Lucene\\Data";
   Searcher searcher;

   public static void main(String[] args) {
      LuceneTester tester;
      try {
         tester = new LuceneTester();
         tester.search("Mohan");
      } catch (IOException e) {
         e.printStackTrace();
      } catch (ParseException e) {
         e.printStackTrace();
      }
   }

   private void search(String searchQuery) throws IOException, ParseException {
      searcher = new Searcher(indexDir);
      long startTime = System.currentTimeMillis();
      TopDocs hits = searcher.search(searchQuery);
      long endTime = System.currentTimeMillis();

      System.out.println(hits.totalHits +
         " documents found. Time :" + (endTime - startTime) +" ms");
      for(ScoreDoc scoreDoc : hits.scoreDocs) {
         Document doc = searcher.getDocument(scoreDoc);
         System.out.println("File: "+ doc.get(LuceneConstants.FILE_PATH));
      }
      searcher.close();
   }	
}

Creación de directorios de datos e índices

Hemos usado 10 archivos de texto llamados record1.txt para 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 el programa de indexación en el capítuloLucene - Indexing Process, 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, el directorio de índices y los índices, puede proceder compilando y ejecutando su programa. Para hacer esto, manténLuceneTester.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 LuceneTesterapplication. Si su aplicación se ejecuta correctamente, imprimirá el siguiente mensaje en la consola de Eclipse IDE:

1 documents found. Time :29 ms
File: E:\Lucene\Data\record4.txt