Mit Lucene:Warum erhalte ich die Fehlermeldung „Zu viele Klauseln“, wenn ich eine Präfixsuche durchführe?

StackOverflow https://stackoverflow.com/questions/8532

  •  08-06-2019
  •  | 
  •  

Frage

Ich habe seit einiger Zeit eine App, die Präfixsuchen durchführt.Kürzlich wurde die Indexgröße erhöht und es stellte sich heraus, dass einige Präfixe zu zahlreich waren, als dass Lucene sie verarbeiten könnte.Es warf mir immer wieder ein Zu viele Klauseln Fehler, der sehr frustrierend war, da ich ständig auf meine JARs schaute und bestätigte, dass keiner der enthaltenen Codes tatsächlich eine boolesche Abfrage verwendete.

Warum löst es nicht so etwas wie eine Too Many Hits-Ausnahme aus?Und warum verschwindet dieser Fehler tatsächlich, wenn ich die Ganzzahl der statischen Max-Klauseln der booleschen Abfrage erhöhe, wenn ich definitiv nur eine Präfixabfrage verwende?Gibt es etwas Grundlegendes bei der Ausführung von Abfragen, das ich nicht verstehe?Werden sie heimlich zu booleschen Abfragen?

War es hilfreich?

Lösung

Ich habe das schon einmal getroffen.Es hat damit zu tun, dass Lucene im Verborgenen viele (alle?) Dinge in boolesche Abfragen umwandelt, wenn Sie Query.rewrite() aufrufen.

Aus: http://lucene.apache.org/java/2_2_0/api/org/apache/lucene/search/Query.html#rewrite(org.apache.lucene.index.IndexReader)

public Query rewrite(IndexReader reader)
              throws IOException

    Expert: called to re-write queries into primitive queries.
            For example, a PrefixQuery will be rewritten into a
            BooleanQuery that consists of TermQuerys.

    Throws:
        IOException

Andere Tipps

Die API-Referenzseite von TooManyClauses zeigt, dass PrefixQuery, FuzzyQuery, WildcardQuery und RangeQuery auf diese Weise erweitert werden (in BooleanQuery).Da es in der API-Referenz enthalten ist, sollte es sich um ein Verhalten handeln, auf das sich Benutzer verlassen können.Lucene legt keine willkürlichen Beschränkungen für die Anzahl der Treffer fest (außer dass eine Dokument-ID ein int ist), sodass eine Ausnahme „zu viele Treffer“ möglicherweise keinen Sinn ergibt.Vielleicht sollte PrefixQuery.rewrite(IndexReader) die TooManyClauses abfangen und eine „Zu viele Präfixe“-Ausnahme auslösen, aber im Moment verhält es sich nicht so.

Eine andere Möglichkeit, nach Präfixen zu suchen, ist übrigens die Verwendung von PrefixFilter.Filtern Sie entweder Ihre Abfrage damit oder umschließen Sie den Filter mit einer ConstantScoreQuery.

Beim Ausführen einer Präfixabfrage sucht Lucene in seinem „Wörterbuch“ nach allen Begriffen, die mit der Abfrage übereinstimmen.Wenn mehr als 1024 (standardmäßig) übereinstimmen, wird die TooManyClauses-Exception ausgelöst.

Sie können BooleanQuery.setMaxClauseCount aufrufen, um die maximale Anzahl zulässiger Klauseln pro BooleanQuery zu erhöhen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top