Lucene - WildcardQuery

WildcardQuery se utiliza para buscar documentos utilizando comodines como '*' para cualquier secuencia de caracteres, que coincida con un solo carácter.

Declaración de clase

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

public class WildcardQuery 
   extends MultiTermQuery

Campos

  • Término de término protegido

Constructores de clases

S.No. Constructor y descripción
1

WildcardQuery(Term term)

Métodos de clase

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

boolean equals(Object obj)

2

protected FilteredTermEnum getEnum(IndexReader reader)

Construya la enumeración que se utilizará, ampliando el término del patrón.

3

Term getTerm()

Devuelve el término del patrón.

4

int hashCode()

5

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.MultiTermQuery
  • org.apache.lucene.search.Query
  • java.lang.Object

Uso

private void searchUsingWildCardQuery(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 WildcardQuery(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

Creemos una aplicación de prueba de Lucene para probar la búsqueda usando WildcardQuery.

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 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.WildcardQuery; 

import org.apache.lucene.search.Query; 
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.searchUsingWildCardQuery("record1*"); 
      } catch (IOException e) { 
         e.printStackTrace(); 
      } catch (ParseException e) { 
         e.printStackTrace(); 
      } 
   } 
	
   private void searchUsingWildCardQuery(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 WildcardQuery(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 nombrados desde record1.txt a record10.txt que contienen simplemente nombres y otros detalles de los estudiantes y los puse en el directorio E:\Lucene\Data. Datos de prueba. Se debe crear una ruta de directorio de índice comoE:\Lucene\Index. Después de ejecutar el programa de indexación durante 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, la creación de los datos sin procesar, el directorio de datos, el directorio de índices y los índices, estará listo para este paso que consiste en compilar y ejecutar su programa. Para hacer esto, mantengaLuceneTester.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 todo está bien con su aplicación, esto imprimirá el siguiente mensaje en la consola de Eclipse IDE:

2 documents found. Time :47ms 
File: E:\Lucene\Data\record1.txt 
File: E:\Lucene\Data\record10.txt