Lucene - BooleanQuery

BooleanQuery viene utilizzato per cercare documenti che sono il risultato di più query utilizzando AND, OR o NOT operatori.

Dichiarazione di classe

Di seguito è riportata la dichiarazione per il org.apache.lucene.search.BooleanQuery classe -

public class BooleanQuery
   extends Query
      implements Iterable<BooleanClause>

Campi

Di seguito è riportato il campo per BooleanQuery:

  • protected int minNrShouldMatch

Costruttori di classi

La tabella seguente mostra i diversi costruttori di classi:

S.No. Costruttore e descrizione
1

BooleanQuery()

Costruisce una query booleana vuota.

2

BooleanQuery(boolean disableCoord)

Costruisce una query booleana vuota.

Metodi di classe

La tabella seguente mostra i diversi metodi di classe:

S.No. Metodo e descrizione
1

void add(BooleanClause clause)

Aggiunge una clausola a una query booleana.

2

void add(Query query, BooleanClause.Occur occur)

Aggiunge una clausola a una query booleana.

3

List<BooleanClause> clauses()

Restituisce l'elenco delle clausole in questa query.

4

Object clone()

Restituisce un clone di questa query.

5

Weight createWeight(Searcher searcher)

Esperto: crea un'implementazione del peso appropriata per questa query.

6

boolean equals(Object o)

Restituisce vero se l'oggetto o è uguale a questo.

7

void extractTerms(Set terms)

Esperto: aggiunge tutti i termini presenti in questa query al set di termini.

8

BooleanClause[] getClauses()

Restituisce il set di clausole in questa query.

9

static int getMaxClauseCount()

Restituisce il numero massimo di clausole consentite, 1024 per impostazione predefinita.

10

int getMinimumNumberShouldMatch()

Ottiene il numero minimo di BooleanClauses facoltative che deve essere soddisfatto.

11

int hashCode()

Restituisce un valore di codice hash per questo oggetto.

12

boolean isCoordDisabled()

Restituisce vero se Similarity.coord(int,int) è disabilitato nel punteggio per questa istanza di query.

13

Iterator<BooleanClause> iterator()

Restituisce un iteratore sulle clausole in questa query.

14

Query rewrite(IndexReader reader)

Esperto: chiamato a riscrivere query in query primitive.

15

static void setMaxClauseCount(int maxClauseCount)

Imposta il numero massimo di clausole consentite per BooleanQuery.

16

void setMinimumNumberShouldMatch(int min)

Specifica un numero minimo di BooleanClauses facoltative che devono essere soddisfatte.

17

String toString(String field)

Stampa una versione leggibile dall'utente di questa query.

Metodi ereditati

Questa classe eredita i metodi dalle seguenti classi:

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

Utilizzo

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();
}

Applicazione di esempio

Creiamo un'applicazione Lucene di prova per testare la ricerca utilizzando BooleanQuery.

Passo Descrizione
1

Creare un progetto con un nome LuceneFirstApplication sotto un pacchetto com.tutorialspoint.lucene come spiegato nel capitolo Lucene - Prima applicazione . È inoltre possibile utilizzare il progetto creato nel capitolo Lucene - Prima applicazione in quanto tale per questo capitolo per comprendere il processo di ricerca.

2

Creare LuceneConstants.java e Searcher.java come spiegato nel capitolo Lucene - Prima applicazione . Mantieni invariato il resto dei file.

3

Crea LuceneTester.java come indicato di seguito.

4

Pulisci e crea l'applicazione per assicurarti che la logica di business funzioni secondo i requisiti.

LuceneConstants.java

Questa classe viene utilizzata per fornire varie costanti da utilizzare nell'applicazione di esempio.

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

Questa classe viene utilizzata per leggere gli indici realizzati sui dati grezzi e per ricercare i dati utilizzando la libreria 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

Questa classe viene utilizzata per testare la capacità di ricerca della libreria 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();
   }
}

Creazione di directory di dati e indici

Abbiamo utilizzato 10 file di testo da record1.txt a record10.txt contenenti nomi e altri dettagli degli studenti e li abbiamo inseriti nella directory E:\Lucene\Data. Dati di prova . Un percorso della directory dell'indice dovrebbe essere creato comeE:\Lucene\Index. Dopo aver eseguito il programma di indicizzazione durante il capitoloLucene - Indexing Process, puoi vedere l'elenco dei file di indice creati in quella cartella.

Esecuzione del programma

Una volta che hai finito con la creazione del sorgente, dei dati grezzi, della directory dei dati, della directory degli indici e degli indici, puoi procedere compilando ed eseguendo il tuo programma. Per fare ciò, mantenere attiva la scheda del file LuceneTester.Java e utilizzare il fileRun opzione disponibile nell'IDE Eclipse o utilizzare Ctrl + F11 per compilare ed eseguire il tuo LuceneTesterapplicazione. Se tutto va bene con la tua applicazione, verrà stampato il seguente messaggio nella console dell'IDE di Eclipse:

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