Lucene - PhraseQuery

La consulta de frase se utiliza para buscar documentos que contienen una secuencia particular de términos.

Declaración de clase

A continuación se muestra la declaración de org.apache.lucene.search.PhraseQuery clase:

public class PhraseQuery
   extends Query

Constructores de clases

La siguiente tabla muestra un constructor de clases:

S.No. Constructor y descripción
1

PhraseQuery()

Construye una consulta de frase vacía.

Métodos de clase

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

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

void add(Term term)

Agrega un término al final de la frase de consulta.

2

void add(Term term, int position)

Agrega un término al final de la frase de consulta.

3

Weight createWeight(Searcher searcher)

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

4

boolean equals(Object o)

Devuelve verdadero si el objeto o es igual a esto.

5

void extractTerms(Set<Term> queryTerms)

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

6

int[] getPositions()

Devuelve las posiciones relativas de los términos en esta frase.

7

int getSlop()

Devuelve la pendiente.

8

Term[] getTerms()

Devuelve el conjunto de términos de esta frase.

9

int hashCode()

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

10

Query rewrite(IndexReader reader)

Experto: llamado para reescribir consultas en consultas primitivas.

11

void setSlop(int s)

Establece el número de otras palabras permitidas entre palabras en una frase de consulta.

12

String toString(String f)

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 searchUsingPhraseQuery(String[] phrases)
   throws IOException, ParseException {
   searcher = new Searcher(indexDir);
   long startTime = System.currentTimeMillis();

   PhraseQuery query = new PhraseQuery();
   query.setSlop(0);

   for(String word:phrases) {
      query.add(new Term(LuceneConstants.FILE_NAME,word));
   }

   //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 Lucene de prueba para probar la búsqueda usando PhraseQuery.

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 sin procesar 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.PhraseQuery;
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();
         String[] phrases = new String[]{"record1.txt"};
         tester.searchUsingPhraseQuery(phrases);
      } catch (IOException e) {
         e.printStackTrace();
      } catch (ParseException e) {
         e.printStackTrace();
      }
   }

   private void searchUsingPhraseQuery(String[] phrases)
      throws IOException, ParseException {
      searcher = new Searcher(indexDir);
      long startTime = System.currentTimeMillis();

      PhraseQuery query = new PhraseQuery();
      query.setSlop(0);

      for(String word:phrases) {
         query.add(new Term(LuceneConstants.FILE_NAME,word));
      }

      //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

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 el programa de indexación durante 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, mantenga elLuceneTester.Java pestaña de archivo activa y utilice la Run 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:

1 documents found. Time :14ms
File: E:\Lucene\Data\record1.txt