Lucene - TermQuery

TermQuery es el objeto de consulta más utilizado y es la base de muchas consultas complejas que Lucene puede utilizar. Se utiliza para recuperar documentos basados ​​en la clave que distingue entre mayúsculas y minúsculas.

Declaración de clase

A continuación se muestra la declaración de org.apache.lucene.search.TermQuery clase -

public class TermQuery
   extends Query

Constructores de clases

La siguiente tabla muestra un constructor de clases:

S.No. Constructor y descripción
1

TermQuery(Term t)

Construye una consulta para el término t.

Métodos de clase

La siguiente tabla muestra los diferentes métodos de clase:

S.No. Método y descripción
1

void addDocument(Document doc)

Agrega un documento a este índice.

2

Weight createWeight(Searcher searcher)

Experto: construye una implementación de peso adecuada para esta consulta.

3

boolean equals(Object o)

Devuelve verdadero si el objeto o es igual a esto.

4

void extractTerms(Set<Term> terms)

Experto: agrega todos los términos que aparecen en esta consulta al conjunto de términos.

5

Term getTerm()

Devuelve el término de esta consulta.

6

int hashCode()

Devuelve un valor de código hash para este objeto.

7

String toString(String field)

Imprime una versión legible por el usuario de esta consulta.

Métodos heredados

Esta clase hereda métodos de las siguientes clases:

  • org.apache.lucene.search.Query
  • java.lang.Object

Uso

private void searchUsingTermQuery(
   String searchQuery)throws IOException, ParseException {
   searcher = new Searcher(indexDir);
   long startTime = System.currentTimeMillis();
   
   //create a term to search file name
   Term term = new Term(LuceneConstants.FILE_NAME, searchQuery);
   //create the term query object
   Query query = new TermQuery(term);
   //do the search
   TopDocs hits = searcher.search(query);
   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();
}

Aplicación de ejemplo

Para probar la búsqueda con TermQuery, creemos una aplicación de prueba de 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 Lucene - Capítulo Primera aplicación como tal para este capítulo para comprender el proceso de búsqueda.

2

Cree LuceneConstants.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;
}

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 TopDocs search(Query query) throws IOException, ParseException {
      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.index.Term;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TermQuery;
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.searchUsingTermQuery("record4.txt");
      } catch (IOException e) {
         e.printStackTrace();
      } catch (ParseException e) {
         e.printStackTrace();
      }
   }

   private void searchUsingTermQuery(
      String searchQuery)throws IOException, ParseException {
      searcher = new Searcher(indexDir);
      long startTime = System.currentTimeMillis();
      
      //create a term to search file name
      Term term = new Term(LuceneConstants.FILE_NAME, searchQuery);
      //create the term query object
      Query query = new TermQuery(term);
      //do the search
      TopDocs hits = searcher.search(query);
      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

He usado 10 archivos de texto de record1.txt a record10.txt que contienen nombres y otros detalles de los estudiantes y los puse 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 el programa de indexación en el capítulo Lucene - Proceso de indexación , 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, 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:

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