Am avut o aplicație care face căutări de prefix pentru o vreme. Recent, mărimea indexului a fost mărită și sa dovedit că unele prefixe erau prea numeroase pentru a lucra cu lucene. A continuat să-mi arunc o prea multe Clauze , ceea ce a fost foarte frustrant, deoarece m-am uitat la JAR-urile mele și am confirmat că nici unul din codul inclus nu a folosit o interogare booleană.
De ce nu arunca ceva asemănător cu o excepție prea mare? Și de ce creșterea integerului interogării clasei statice maxime interogare booleană face de fapt această eroare să dispară, când cu siguranță folosesc doar o interogare prefix? Există ceva fundamental pentru modul în care sunt rulate interogările pe care nu le înțeleg; este ca ei devin în secret întrebări booleene?
Am mai lovit-o înainte. Ea are legătură cu faptul că lucene, sub capace, transformă multe (toate?) Lucruri în interogări booleene atunci când numiți Query.rewrite ()
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
Când rulați o interogare de prefix, Lucene caută toți termenii din "dicționarul" care corespund interogării. Dacă se potrivește mai mult de 1024 (implicit), se aruncă excepția TooManyClauses-Exception.
Puteți apela BooleanQuery.setMaxClauseCount pentru a crește numărul maxim de clauze permise pentru BooleanQuery.
Pagina de referință API a lui TooManyClauses arată că PrefixQuery, FuzzyQuery, WildcardQuery și RangeQuery sunt extinse în acest fel (în BooleanQuery). Întrucât se află în referința API, ar trebui să fie un comportament pe care utilizatorii se pot baza. Lucene nu plasează limite arbitrare asupra numărului de hit-uri (altele decât un ID de document fiind un int), astfel încât o excepție "prea multă lovitură" ar putea să nu aibă sens. Poate că PrefixQuery.rewrite (IndexReader) ar trebui să captureze TooManyClauses și să arunce o excepție "prea multe prefixe", dar acum nu se comportă în acest fel.
Apropo, un alt mod de a căuta prin prefix este să utilizați PrefixFilter. Fie filtrați interogarea cu aceasta, fie împachetați filtrul cu un ConstantScoreQuery.