Lucene - Requête booléenne

BooleanQuery est utilisé pour rechercher des documents résultant de plusieurs requêtes utilisant AND, OR ou NOT les opérateurs.

Déclaration de classe

Voici la déclaration pour le org.apache.lucene.search.BooleanQuery classe -

public class BooleanQuery
   extends Query
      implements Iterable<BooleanClause>

Des champs

Voici le champ pour la BooleanQuery -

  • protected int minNrShouldMatch

Constructeurs de classe

Le tableau suivant montre les différents constructeurs de classe -

S.No. Constructeur et description
1

BooleanQuery()

Construit une requête booléenne vide.

2

BooleanQuery(boolean disableCoord)

Construit une requête booléenne vide.

Méthodes de classe

Le tableau suivant montre les différentes méthodes de classe -

S.No. Méthode et description
1

void add(BooleanClause clause)

Ajoute une clause à une requête booléenne.

2

void add(Query query, BooleanClause.Occur occur)

Ajoute une clause à une requête booléenne.

3

List<BooleanClause> clauses()

Renvoie la liste des clauses de cette requête.

4

Object clone()

Renvoie un clone de cette requête.

5

Weight createWeight(Searcher searcher)

Expert: construit une implémentation Weight appropriée pour cette requête.

6

boolean equals(Object o)

Renvoie vrai si l'objet o est égal à ceci.

sept

void extractTerms(Set terms)

Expert: ajoute tous les termes apparaissant dans cette requête à l'ensemble de termes.

8

BooleanClause[] getClauses()

Renvoie l'ensemble des clauses de cette requête.

9

static int getMaxClauseCount()

Renvoie le nombre maximum de clauses autorisées, 1024 par défaut.

dix

int getMinimumNumberShouldMatch()

Obtient le nombre minimum de BooleanClauses facultatives qui doivent être satisfaites.

11

int hashCode()

Renvoie une valeur de code de hachage pour cet objet.

12

boolean isCoordDisabled()

Renvoie vrai si Similarity.coord(int,int) est désactivé dans le scoring pour cette instance de requête.

13

Iterator<BooleanClause> iterator()

Renvoie un itérateur sur les clauses de cette requête.

14

Query rewrite(IndexReader reader)

Expert: appelé à réécrire les requêtes en requêtes primitives.

15

static void setMaxClauseCount(int maxClauseCount)

Définit le nombre maximal de clauses autorisées par BooleanQuery.

16

void setMinimumNumberShouldMatch(int min)

Spécifie un nombre minimum de BooleanClauses facultatives qui doivent être satisfaites.

17

String toString(String field)

Imprime une version lisible par l'utilisateur de cette requête.

Méthodes héritées

Cette classe hérite des méthodes des classes suivantes -

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

Usage

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

Exemple d'application

Créons une application de test Lucene pour tester la recherche à l'aide de BooleanQuery.

Étape La description
1

Créez un projet avec un nom LuceneFirstApplication sous un package com.tutorialspoint.lucene comme expliqué dans le chapitre Lucene - Première application . Vous pouvez également utiliser le projet créé dans le chapitre Lucene - Première application en tant que tel pour ce chapitre pour comprendre le processus de recherche.

2

Créez LuceneConstants.java et Searcher.java comme expliqué dans le chapitre Lucene - Première application . Gardez le reste des fichiers inchangés.

3

Créez LuceneTester.java comme indiqué ci-dessous.

4

Nettoyez et créez l'application pour vous assurer que la logique métier fonctionne conformément aux exigences.

LuceneConstants.java

Cette classe est utilisée pour fournir diverses constantes à utiliser dans l'exemple d'application.

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

Cette classe permet de lire les index créés sur des données brutes et de rechercher des données à l'aide de la bibliothèque 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

Cette classe est utilisée pour tester la capacité de recherche de la bibliothèque 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();
   }
}

Création de répertoires de données et d'index

Nous avons utilisé 10 fichiers texte de record1.txt à record10.txt contenant les noms et autres détails des étudiants et les avons mis dans le répertoire E:\Lucene\Data. Données de test . Un chemin de répertoire d'index doit être créé commeE:\Lucene\Index. Après avoir exécuté le programme d'indexation pendant le chapitreLucene - Indexing Process, vous pouvez voir la liste des fichiers d'index créés dans ce dossier.

Exécution du programme

Une fois que vous avez terminé la création de la source, des données brutes, du répertoire de données, du répertoire d'index et des index, vous pouvez continuer en compilant et en exécutant votre programme. Pour ce faire, gardez l'onglet de fichier LuceneTester.Java actif et utilisez soit leRun option disponible dans l'IDE Eclipse ou utilisez Ctrl + F11 pour compiler et exécuter votre LuceneTesterapplication. Si tout va bien avec votre application, cela affichera le message suivant dans la console Eclipse IDE -

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