[ http://issues.apache.org/jira/browse/LUCENE-330?page=comments#action_12368948 ]
Erik Hatcher commented on LUCENE-330: ------------------------------------- I manually applied that patch (prior to my first comment actually) as automatically applying didn't work. I just committed another test to TestFilteredQuery, which fails with this patch with this error: java.lang.IndexOutOfBoundsException: Not a valid hit number: 0 at org.apache.lucene.search.Hits.hitDoc(Hits.java:134) at org.apache.lucene.search.Hits.id(Hits.java:116) at org.apache.lucene.search.TestFilteredQuery.testBoolean(TestFilteredQuery.java:139) I'm fairly confident I applied the patch correctly, though I suppose its possible I missed something. Here's an inlined version of the diff I have locally of FilteredQuery: $ svn diff FilteredQuery.java Index: FilteredQuery.java =================================================================== --- FilteredQuery.java (revision 383339) +++ FilteredQuery.java (working copy) @@ -34,6 +34,7 @@ * <p>Created: Apr 20, 2004 8:58:29 AM * * @author Tim Jones + * @author Paul Elschot * @since 1.4 * @version $Id$ * @see CachingWrapperFilter @@ -75,22 +76,42 @@ // return this query public Query getQuery() { return FilteredQuery.this; } - // return a scorer that overrides the enclosed query's score if - // the given hit has been filtered out. - public Scorer scorer (IndexReader indexReader) throws IOException { + // return a filtering scorer + public Scorer scorer (IndexReader indexReader) throws IOException { final Scorer scorer = weight.scorer (indexReader); final BitSet bitset = filter.bits (indexReader); return new Scorer (similarity) { - // pass these methods through to the enclosed scorer - public boolean next() throws IOException { return scorer.next(); } + public boolean next() throws IOException { + do { + if (! scorer.next()) { + return false; + } + } while (! bitset.get(scorer.doc())); + /* When skipTo() is allowed on scorer it should be used here + * in combination with bitset.nextSetBit(...) + * See the while loop in skipTo() below. + */ + return true; + } public int doc() { return scorer.doc(); } - public boolean skipTo (int i) throws IOException { return scorer.skipTo(i); } - // if the document has been filtered out, set score to 0.0 - public float score() throws IOException { - return (bitset.get(scorer.doc())) ? scorer.score() : 0.0f; - } + public boolean skipTo(int i) throws IOException { + if (! scorer.skipTo(i)) { + return false; + } + while (! bitset.get(scorer.doc())) { + int nextFiltered = bitset.nextSetBit(scorer.doc() + 1); + if (nextFiltered == -1) { + return false; + } else if (! scorer.skipTo(nextFiltered)) { + return false; + } + } + return true; + } + + public float score() throws IOException { return scorer.score(); } // add an explanation about whether the document was filtered public Explanation explain (int i) throws IOException { What am I missing? > [PATCH] Use filter bits for next() and skipTo() in FilteredQuery > ---------------------------------------------------------------- > > Key: LUCENE-330 > URL: http://issues.apache.org/jira/browse/LUCENE-330 > Project: Lucene - Java > Type: Improvement > Components: Search > Versions: CVS Nightly - Specify date in submission > Environment: Operating System: other > Platform: Other > Reporter: paul.elschot > Assignee: Lucene Developers > Priority: Minor > Attachments: FilteredQuery.java, FilteredQuery.java, FilteredQuery.java, > FilteredQuery.java, FilteredQueryPatch1.txt, IndexSearcherPatch2.txt, > SkipFilter.java, SkipFilter.java > > This improves performance of FilteredQuery by not calling score() > on documents that do not pass the filter. > This passes the current tests for FilteredQuery, but these tests > have not been adapted/extended. -- This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: http://issues.apache.org/jira/secure/Administrators.jspa - For more information on JIRA, see: http://www.atlassian.com/software/jira --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]