Suche…
BooleanQuery
BooleanQuery wird verwendet, um andere Abfragen zu kombinieren.
Sie können mit drei BooleanClause.Occur-Parametern kombiniert werden:
-
BooleanClause.Occur.MUST
- Die Unterabfrage muss übereinstimmen. -
BooleanClause.Occur.SHOULD
- Die Unterabfrage wird möglicherweise nicht übereinstimmen, wird jedoch höher bewertet, wenn dies der Fall ist. Wenn es keine MUST-Klauseln gibt, muss mindestens eine SHOULD-Klausel übereinstimmen. -
BooleanClause.Occur.MUST_NOT
- Die Unterabfrage darf nicht mit dem Dokument übereinstimmen.
In diesem Beispiel stimmt ein Dokument überein, wenn es "wichtig", aber nicht "verboten" ist, und erhält eine höhere Punktzahl, wenn es auch "hilfreich" ist.
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();
Alternativ können Sie auch die Mindestanzahl von Klauseln angeben, die abgeglichen werden müssen:
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: Klauseln mit BooleanClause.Occur.MUST_NOT
stimmen nicht mit BooleanClause.Occur.MUST_NOT
anderen überein, sie beseitigen nur Übereinstimmungen. Ihre BooleanQuery muss mindestens eine MUST
oder SHOULD
Klausel enthalten, da sonst keine Übereinstimmung besteht. Dies wird zum Beispiel NICHT funktionieren:
//***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 wird verwendet, um nach einer Folge von Begriffen zu suchen. Folgendes stimmt mit der Phrase "Hello World" überein (nachdem sie mit StandardAnalyzer
indexiert wurde)
Query query = new PhraseQuery.Builder()
.add(new Term("text", "hello"))
.add(new Term("text", "world"))
.build();
PhraseQuery kann auch "Slop" oder zusätzliche Begriffe in einer Abfrage behandeln, indem Sie mit setSlop
einen maximalen Bearbeitungsabstand setSlop
. Dies wird mit "Lorem ipsum sit amet dolor" übereinstimmen:
Query query = new PhraseQuery.Builder()
.add(new Term("text", "lorem"))
.add(new Term("text", "amet"))
.setSlop(2)
.build();
Sie können auch genaue Positionsschritte einstellen:
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
Dadurch werden Abfragen so kombiniert, dass die beste Übereinstimmung (dh die Partitur mit den höchsten Bewertungen) der Unterabfragen zum Endergebnis beiträgt.
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);
Das zweite Argument für den DisjunctionMaxQuery
Konstruktor ist ein Tiebreaker-Wert, der, wenn er nicht Null ist, zulässt, dass nicht-maximale Übereinstimmungen einen kleinen Beitrag zum Ergebnis leisten, um Bindungen zu lösen. Es sollte im Allgemeinen klein sein (in der Größenordnung von 0,1).
Anfragen verstärken
Eine Abfrage kann verstärkt werden, um die Bewertung relativ zu anderen Unterabfragen zu erhöhen. Dies erfolgt durch Umwickeln mit einer 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();