Ricerca…


BooleanQuery

BooleanQuery viene utilizzato per combinare altre query.

Possono essere combinati usando tre parametri BooleanClause.Occur:

  • BooleanClause.Occur.MUST - La sottoquery deve essere abbinata.
  • BooleanClause.Occur.SHOULD - La sottoquery potrebbe non essere abbinata, ma se lo è, riceverà un punteggio più alto. Se non ci sono clausole MUST, allora almeno una clausola SHOULD deve essere abbinata.
  • BooleanClause.Occur.MUST_NOT - La sottoquery non deve corrispondere al documento.

In questo esempio, un documento corrisponderà se ha "importante", ma non "proibito" e otterrà un punteggio più alto se anche "utile".

Query importantQuery = new TermQuery(new Term("fieldname", "important"));
Query optionalQuery = new TermQuery(new Term("fieldname", "helpful"));
Query forbidQuery = new TermQuery(new Term("fieldname", "forbidden"));
BooleanQuery query = new BooleanQuery.Builder()
        .add(importantQuery, BooleanClause.Occur.MUST) 
        .add(optionalQuery, BooleanClause.Occur.SHOULD) 
        .add(forbidQuery, BooleanClause.Occur.MUST_NOT) 
        .build();

In alternativa, puoi anche specificare il numero minimo di clausole che devono essere abbinate:

Query query1 = new TermQuery(new Term("fieldname", "one"));
Query query2 = new TermQuery(new Term("fieldname", "two"));
Query query3 = new TermQuery(new Term("fieldname", "three"));
BooleanQuery query = new BooleanQuery.Builder()
        .add(query1, BooleanClause.Occur.SHOULD) 
        .add(query2, BooleanClause.Occur.SHOULD) 
        .add(query3, BooleanClause.Occur.SHOULD)
        .setMinimumNumberShouldMatch(2)
        .build();

Gotcha: le clausole con BooleanClause.Occur.MUST_NOT non corrispondono a tutto il resto, eliminano solo le corrispondenze. Il tuo BooleanQuery deve avere almeno un MUST o SHOULD clausola, o corrisponderà nulla. Questo, ad esempio, NON funzionerà:

//***This does NOT work!***
Query forbidQuery = new TermQuery(new Term("fieldname", "forbidden"));
BooleanQuery getEverythingElseQuery = new BooleanQuery.Builder()
        .add(forbidQuery, BooleanClause.Occur.MUST_NOT) 
        .build();

PhraseQuery

PhraseQuery viene utilizzato per cercare una sequenza di termini. Il seguente corrisponde alla frase "Hello World" (dopo essere stato indicizzato con StandardAnalyzer )

Query query = new PhraseQuery.Builder()
        .add(new Term("text", "hello"))
        .add(new Term("text", "world"))
        .build();

PhraseQuery può anche gestire "slop", o termini extra all'interno di una query, impostando una distanza di modifica massima con setSlop . Questo corrisponderà a "Lorem ipsum sit amet dolor":

Query query = new PhraseQuery.Builder()
        .add(new Term("text", "lorem"))
        .add(new Term("text", "amet"))
        .setSlop(2)
        .build();

Puoi anche impostare incrementi di posizione esatti:

Query query = new PhraseQuery.Builder()
        .add(new Term("text", "lorem"), 0)
        .add(new Term("text", "sit"), 2)
        .add(new Term("text", "dolor"), 4)
        .build();

DisjunctionMaxQuery

Questo combina le query in modo tale che la corrispondenza migliore (ovvero con il punteggio più alto) delle sottoquery contribuisca al punteggio finale.

List<Query> disjuncts = new ArrayList<Query>();
disjuncts.add(new TermQuery(new Term("fieldname", "hello")));
disjuncts.add(new TermQuery(new Term("fieldname", "world")));
Query query = new DisjunctionMaxQuery(disjuncts, 0.0f);

Il secondo argomento del costruttore DisjunctionMaxQuery è un valore di tie breaker che, quando non zero, consente alle corrispondenze non massimali di apportare un piccolo contributo al punteggio, in modo da interrompere i legami. Generalmente dovrebbe essere piccolo (dell'ordine di 0,1).

Aumentare le query

Una query può essere potenziata per aumentare il punteggio rispetto ad altre subquery. Questo viene fatto avvolgendolo con un BoostQuery

Query lessRelevantQuery = new TermQuery(new Term("fieldname", "ipsum"));
//Five times as interesting
Query highlyRelevantQuery = new BoostQuery(
         new TermQuery(new Term("fieldname", "lorem")), 
         5.0f);
BooleanQuery query = new BooleanQuery.Builder()
        .add(lessRelevantQuery, BooleanClause.Occur.SHOULD) 
        .add(highlyRelevantQuery, BooleanClause.Occur.SHOULD) 
        .build();


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow