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


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow