Zoeken…


BooleanQuery

BooleanQuery wordt gebruikt om andere query's te combineren.

Ze kunnen worden gecombineerd met behulp van drie BooleanClause.Occur-parameters:

  • BooleanClause.Occur.MUST - De subquery moet overeenkomen.
  • BooleanClause.Occur.SHOULD - De subquery komt mogelijk niet overeen, maar krijgt een hogere score als dat zo is. Als er geen MOET-clausules zijn, moet er ten minste één clausule worden gevonden.
  • BooleanClause.Occur.MUST_NOT - De subquery moet niet overeenkomen met het document.

In dit voorbeeld komt een document overeen als het 'belangrijk', maar niet 'verboden' is, en krijgt het een hogere score als het ook 'nuttig' heeft.

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

Als alternatief kunt u ook het minimum aantal clausules opgeven dat moet worden gekoppeld:

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: clausules met BooleanClause.Occur.MUST_NOT komen niet overeen met al het andere, ze elimineren alleen overeenkomsten. Je BooleanQuery moet ten minste één clausule MUST of SHOULD , anders komt er niets bij. Dit zal bijvoorbeeld NIET werken:

//***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 wordt gebruikt om een reeks termen te zoeken. Het volgende komt overeen met de uitdrukking "Hallo wereld" (na te zijn geïndexeerd met StandardAnalyzer )

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

PhraseQuery kan ook "slop", of extra termen binnen een zoekopdracht verwerken door een maximale bewerkingsafstand in te stellen met setSlop . Dit komt overeen met "Lorem ipsum sit amet dolor":

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

U kunt ook exacte positieverhogingen instellen:

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

Dit combineert zoekopdrachten zodanig dat de beste (dat wil zeggen de hoogste score) match van zijn subquery's bijdraagt aan de uiteindelijke score.

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

Het tweede argument voor de constructor DisjunctionMaxQuery is een waarde voor de tiebreaker, die, wanneer deze niet nul is, het mogelijk maakt dat niet-maximale overeenkomsten een kleine bijdrage leveren om te scoren, om de banden te verbreken. Over het algemeen moet deze klein zijn (in de orde van 0,1).

Vragen stimuleren

Een zoekopdracht kan worden gestimuleerd om de score ten opzichte van andere subquery's te verhogen. Dit wordt gedaan door het te verpakken met een 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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow