Lucene - BooleanQuery

BooleanQuery se usa para buscar documentos que son el resultado de múltiples consultas usando AND, OR o NOT operadores.

Declaración de clase

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

public class BooleanQuery
   extends Query
      implements Iterable<BooleanClause>

Campos

A continuación se muestra el campo para BooleanQuery:

  • protected int minNrShouldMatch

Constructores de clases

La siguiente tabla muestra los diferentes constructores de clases:

S.No. Constructor y descripción
1

BooleanQuery()

Construye una consulta booleana vacía.

2

BooleanQuery(boolean disableCoord)

Construye una consulta booleana 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(BooleanClause clause)

Agrega una cláusula a una consulta booleana.

2

void add(Query query, BooleanClause.Occur occur)

Agrega una cláusula a una consulta booleana.

3

List<BooleanClause> clauses()

Devuelve la lista de cláusulas de esta consulta.

4

Object clone()

Devuelve un clon de esta consulta.

5

Weight createWeight(Searcher searcher)

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

6

boolean equals(Object o)

Devuelve verdadero si el objeto o es igual a esto.

7

void extractTerms(Set terms)

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

8

BooleanClause[] getClauses()

Devuelve el conjunto de cláusulas de esta consulta.

9

static int getMaxClauseCount()

Devuelve el número máximo de cláusulas permitidas, 1024 por defecto.

10

int getMinimumNumberShouldMatch()

Obtiene el número mínimo de cláusulas booleanas opcionales que se deben satisfacer.

11

int hashCode()

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

12

boolean isCoordDisabled()

Devuelve verdadero si Similarity.coord(int,int) está inhabilitado en la puntuación de esta instancia de consulta.

13

Iterator<BooleanClause> iterator()

Devuelve un iterador sobre las cláusulas de esta consulta.

14

Query rewrite(IndexReader reader)

Experto: llamado para reescribir consultas en consultas primitivas.

15

static void setMaxClauseCount(int maxClauseCount)

Establece el número máximo de cláusulas permitidas por BooleanQuery.

dieciséis

void setMinimumNumberShouldMatch(int min)

Especifica un número mínimo de cláusulas booleanas opcionales que deben cumplirse.

17

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 searchUsingBooleanQuery(String searchQuery1,
   String searchQuery2)throws IOException, ParseException {
   searcher = new Searcher(indexDir);
   long startTime = System.currentTimeMillis();
   
   //create a term to search file name
   Term term1 = new Term(LuceneConstants.FILE_NAME, searchQuery1);
   //create the term query object
   Query query1 = new TermQuery(term1);

   Term term2 = new Term(LuceneConstants.FILE_NAME, searchQuery2);
   //create the term query object
   Query query2 = new PrefixQuery(term2);

   BooleanQuery query = new BooleanQuery();
   query.add(query1,BooleanClause.Occur.MUST_NOT);
   query.add(query2,BooleanClause.Occur.MUST);

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

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.BooleanClause;
import org.apache.lucene.search.PrefixQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.BooleanQuery;
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.searchUsingBooleanQuery("record1.txt","record1");
      } catch (IOException e) {
         e.printStackTrace();
      } catch (ParseException e) {
         e.printStackTrace();
      }
   }

   private void searchUsingBooleanQuery(String searchQuery1,
      String searchQuery2)throws IOException, ParseException {
      searcher = new Searcher(indexDir);
      long startTime = System.currentTimeMillis();
      
      //create a term to search file name
      Term term1 = new Term(LuceneConstants.FILE_NAME, searchQuery1);
      //create the term query object
      Query query1 = new TermQuery(term1);

      Term term2 = new Term(LuceneConstants.FILE_NAME, searchQuery2);
      //create the term query object
      Query query2 = new PrefixQuery(term2);

      BooleanQuery query = new BooleanQuery();
      query.add(query1,BooleanClause.Occur.MUST_NOT);
      query.add(query2,BooleanClause.Occur.MUST);

      //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 activa la pestaña del archivo LuceneTester.Java y use elRun opción disponible en Eclipse IDE 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:

1 documents found. Time :26ms
File: E:\Lucene\Data\record10.txt