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