Cu Lucene: De ce primesc o eroare la prea multe clauze dacă fac o căutare prefix?

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?

0
fr hi bn

3 răspunsuri

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

From: 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
0
adăugat
Și această transformare Query.rewrite() întotdeauna se întâmplă înainte ca interogarea să fie executată? (Pare rezonabil că interogarea trebuie defalcată în interogări primitive înainte de a fi executată.)
adăugat autor KajMagnus, sursa

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.

0
adăugat
Asta are sens, dar problema pentru mine a fost că nu aveam cum să știu că un PrefixQuery a devenit de fapt BooleanQuery.
adăugat autor dlamblin, sursa

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.

0
adăugat
Este PrefixFilter extins, de asemenea, în clauze booleene? (Sau este implementat într-un mod diferit?)
adăugat autor KajMagnus, sursa