Ah! I thought that the ConstantScoreQuery would also be rewritten into a BooleanQuery, resulting in the same exception. If that's the case, then this should work. I'll give that a try when I get into the office this morning.
On Fri, Oct 16, 2009 at 6:46 AM, Michael McCandless < luc...@mikemccandless.com> wrote: > Well, you could wrap the C | D filter as a Query (using > ConstantScoreQuery), and then add that as a SHOULD clause on your > toplevel BooleanQuery? > > Mike > > On Thu, Oct 15, 2009 at 5:42 PM, Shaun Senecal <ssenecal.w...@gmail.com> > wrote: > > At first I thought so, yes, but then I realised that the query I wanted > to > > execute was A | B | C | D and in reality I was executing (A | B) & (C | > D). > > I guess my unit tests were missing some cases and don't currently catch > > this. > > > > > > > > On Thu, Oct 15, 2009 at 11:59 PM, Michael McCandless < > > luc...@mikemccandless.com> wrote: > > > >> You should be able to do exactly what you were doing on 2.4, right? > >> (By setting the rewrite method). > >> > >> Mike > >> > >> On Thu, Oct 15, 2009 at 8:30 AM, Shaun Senecal <ssenecal.w...@gmail.com > > > >> wrote: > >> > Thanks for the explanation Mike. It looks like I have no choice but > to > >> move > >> > any queries which throw TooManyClauses to be Filters. Sadly, this > means a > >> > max query time of 6s under load unless I can find a way to rewrite the > >> query > >> > to span a Query and a Filter. > >> > > >> > > >> > Thanks again > >> > > >> > > >> > > >> > On Thu, Oct 15, 2009 at 6:52 PM, Michael McCandless < > >> > luc...@mikemccandless.com> wrote: > >> > > >> >> On Thu, Oct 15, 2009 at 4:57 AM, Shaun Senecal < > ssenecal.w...@gmail.com > >> > > >> >> wrote: > >> >> > >> >> > Up to Lucene 2.4, this has been working out for us. However, in > >> >> > Lucene 2.9 this breaks since rewrite() now returns a > >> >> > ConstantScoreQuery. > >> >> > >> >> You can get back to the 2.4 behavior by calling > >> >> > prefixQuery.setRewriteMethod(prefixQuery.SCORING_BOOLEAN_QUERY_REWRITE) > >> >> before calling rewrite(). > >> >> > >> >> > Is there a way I can know that a ConstantScoreQuery will match at > >> >> > least 1 term (if not, I dont want to add it to the BooleanQuery)? > >> >> > >> >> There is a new method in 2.9: MultiTermQuery.getTotalNumberOfTerms(), > >> >> which returns how many terms were visited during rewrite. Would that > >> >> work? > >> >> > >> >> > My understanding is that Lucene will apply the Filter (C | D) > first, > >> >> > limiting the result set, then apply the Query (A | B). Is this > >> >> > correct? > >> >> > >> >> Actually the filter & query clauses are AND'd in a sort of leapfrog > >> >> fashion, taking turns skipping up to the other's doc ID and only > >> >> accepting a doc ID when they both skip to the same point. But this > >> >> (the mechanics of how Lucene takes a filter into account) is an > >> >> implementation detail and is likely to change. > >> >> > >> >> > If so, the end result is essentially the query: (A | B) & (C | D) > >> >> > >> >> Except that C, D contribute no scoring information, if scoring > >> >> matters. If scoring doesn't matter, entirely (even for A, B), you > >> >> should use a collector that does not call score() at all to save CPU. > >> >> > >> >> Mike > >> >> > >> >> --------------------------------------------------------------------- > >> >> To unsubscribe, e-mail: java-user-unsubscr...@lucene.apache.org > >> >> For additional commands, e-mail: java-user-h...@lucene.apache.org > >> >> > >> >> > >> > > >> > >> --------------------------------------------------------------------- > >> To unsubscribe, e-mail: java-user-unsubscr...@lucene.apache.org > >> For additional commands, e-mail: java-user-h...@lucene.apache.org > >> > >> > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: java-user-unsubscr...@lucene.apache.org > For additional commands, e-mail: java-user-h...@lucene.apache.org > >