Index: IndexSearcher.java =================================================================== RCS file: /home/cvspublic/jakarta-lucene/src/java/org/apache/lucene/search/IndexSearcher.java,v retrieving revision 1.23 diff -u -3 -p -u -r1.23 IndexSearcher.java --- IndexSearcher.java 14 Nov 2004 13:26:28 -0000 1.23 +++ IndexSearcher.java 6 Jan 2005 18:59:40 -0000 @@ -87,18 +87,20 @@ public class IndexSearcher extends Searc if (nDocs <= 0) // null might be returned from hq.top() below. throw new IllegalArgumentException("nDocs must be > 0"); + if (filter != null) + query = new FilteredQuery(query, filter); + Scorer scorer = query.weight(this).scorer(reader); + if (scorer == null) return new TopDocs(0, new ScoreDoc[0]); - final BitSet bits = filter != null ? filter.bits(reader) : null; final HitQueue hq = new HitQueue(nDocs); final int[] totalHits = new int[1]; scorer.score(new HitCollector() { private float minScore = 0.0f; public final void collect(int doc, float score) { - if (score > 0.0f && // ignore zeroed buckets - (bits==null || bits.get(doc))) { // skip docs not in bits + if (score > 0.0f) { totalHits[0]++; if (hq.size() < nDocs || score >= minScore) { hq.insert(new ScoreDoc(doc, score)); @@ -119,18 +121,20 @@ public class IndexSearcher extends Searc public TopFieldDocs search(Query query, Filter filter, final int nDocs, Sort sort) throws IOException { + + if (filter != null) + query = new FilteredQuery(query, filter); + Scorer scorer = query.weight(this).scorer(reader); if (scorer == null) return new TopFieldDocs(0, new ScoreDoc[0], sort.fields); - final BitSet bits = filter != null ? filter.bits(reader) : null; final FieldSortedHitQueue hq = new FieldSortedHitQueue(reader, sort.fields, nDocs); final int[] totalHits = new int[1]; scorer.score(new HitCollector() { public final void collect(int doc, float score) { - if (score > 0.0f && // ignore zeroed buckets - (bits==null || bits.get(doc))) { // skip docs not in bits + if (score > 0.0f) { totalHits[0]++; hq.insert(new FieldDoc(doc, score)); } @@ -148,22 +152,12 @@ public class IndexSearcher extends Searc // inherit javadoc public void search(Query query, Filter filter, final HitCollector results) throws IOException { - HitCollector collector = results; - if (filter != null) { - final BitSet bits = filter.bits(reader); - collector = new HitCollector() { - public final void collect(int doc, float score) { - if (bits.get(doc)) { // skip docs not in bits - results.collect(doc, score); - } - } - }; - } - + if (filter != null) + query = new FilteredQuery(query, filter); + Scorer scorer = query.weight(this).scorer(reader); - if (scorer == null) - return; - scorer.score(collector); + if (scorer != null) + scorer.score(results); } public Query rewrite(Query original) throws IOException {