Sök…


BooleanQuery

BooleanQuery används för att kombinera andra frågor.

De kan kombineras med tre BooleanClause.Occur-parametrar:

  • BooleanClause.Occur.MUST - Underfrågan måste matchas.
  • BooleanClause.Occur.SHOULD - Underfrågan kanske inte matchas, men kommer att få högre poäng om det är det. Om det inte finns MÅSTE-klausuler måste minst en SKAL-klausul matchas.
  • BooleanClause.Occur.MUST_NOT - Underfrågan får inte matcha dokumentet.

I det här exemplet kommer ett dokument att matcha om det har "viktigt", men inte "förbjudet", och kommer att få en högre poäng om det också har "användbart".

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

Alternativt kan du också ange det minsta antalet klausuler som måste matchas:

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: Klausuler med BooleanClause.Occur.MUST_NOT inte allt annat, de eliminerar bara matcher. Din BooleanQuery måste ha minst en MUST eller SHOULD klausul, annars kommer den inte att matcha någonting. Detta fungerar till exempel INTE :

//***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 används för att söka efter en ordningssekvens. Följande matchar frasen "Hello World" (efter att ha indexerats med StandardAnalyzer )

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

PhraseQuery kan också hantera "slop" eller extra termer inom en fråga genom att ställa in ett maximalt redigeringsavstånd med setSlop . Detta kommer att matcha "Lorem ipsum sit amet dolor":

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

Du kan också ställa exakta positionstillägg:

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

Detta kombinerar frågor så att den bästa (det vill säga högsta poäng) av dess undersökningar bidrar till slutresultatet.

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

Det andra argumentet till DisjunctionMaxQuery konstruktören är ett bandbrytervärde, som, när det inte är noll, tillåter icke-maximala matchningar att ge ett litet bidrag till poängen, för att bryta banden. Det bör i allmänhet vara litet (i storleksordningen 0,1).

Öka frågorna

En fråga kan ökas för att öka poängen i förhållande till andra undersökningar. Detta görs genom att förpacka det med en 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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow