Mit Lucene: Warum erhalte ich Zu Viele Klauseln Fehlermeldung, wenn ich eine Präfix-Suche?
Habe ich eine app tun Präfix sucht für eine Weile. Kürzlich die Indexgröße erhöht, und es stellte sich heraus, dass einige Präfixe wurden zu verdammten zahlreiche für lucene zu handhaben. Sie warfen mir eine Zu Viele Klauseln Fehler, das war sehr frustrierend, als ich sah meine Gläser und bestätigt, dass keiner der code tatsächlich verwendet eine Boolesche Abfrage.
Warum nicht, es zu werfen so etwas wie einen Zu Viele Treffer Ausnahme? Und warum hat die Erhöhung der boolean-Abfrage ist statisch max Klauseln integer tatsächlich dieser Fehler geht Weg, wenn ich definitiv nur mit einem prefix-Abfrage? Gibt es etwas grundlegendes, wie Abfragen ausgeführt werden, dass ich nicht verstehen; ist es, dass Sie heimlich geworden Boolean-Abfragen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den ich getroffen habe, vor. Es hat mit der Tatsache zu tun, dass lucene unter die Decke, dreht viele (alle?) Dinge, die in boolean-Abfragen beim Aufruf der Abfrage.rewrite()
Aus: http://lucene.apache.org/java/2_2_0/api/org/apache/lucene/search/Query.html#rewrite(org.apache.lucene.index.IndexReader)
Query.rewrite()
transformation immer passiert, bevor die Abfrage ausgeführt wird? (Das wäre zwar sinnvoll erscheinen, dass die Abfrage muss aufgeschlüsselt werden, um primitive Abfragen, bevor Sie ausgeführt wird.)Den API-Referenz Seite TooManyClauses zeigt, dass PrefixQuery, FuzzyQuery, WildcardQuery, und RangeQuery erweitert werden auf diese Weise (in BooleanQuery). Da es in der API-Referenz, sollte es ein Verhalten, dass die Nutzer sich verlassen können. Lucene stellt keine willkürlichen Grenzen für die Anzahl der Treffer (mit Ausnahme von Dokument-ID als int), so dass ein "zu viele Treffer" exception nicht sinnvoll. Vielleicht PrefixQuery.rewrite(IndexReader) fangen sollte die TooManyClauses und werfen "zu viele Präfixe" Ausnahme, aber jetzt es verhält sich nicht so.
Durch die Art und Weise, einen anderen Weg zu suchen durch das Präfix zu verwenden PrefixFilter. Entweder filtern Sie Ihre Abfrage mit oder wickeln Sie die filter mit einem ConstantScoreQuery.
PrefixFilter
auch erweitert in booleschen Klauseln? (Oder ist es irgendwie anders implementiert?)Wenn Sie eine Präfix-Abfrage, Lucene sucht alle Begriffe, die in seinem "Wörterbuch", die der Abfrage entsprechen. Wenn mehr als 1024 (Standard) überein, die TooManyClauses-Exception geworfen wird.
Können Sie anrufen BooleanQuery.setMaxClauseCount zum erhöhen der maximalen Anzahl von Klauseln zulässig sind pro BooleanQuery.