SOLR-5002: optimize numDocs(Query,DocSet) when filterCache is null

git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1500102 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Robert Muir 2013-07-05 19:03:16 +00:00
parent b119be488a
commit a278bb6628
2 changed files with 22 additions and 4 deletions

View File

@ -273,6 +273,8 @@ Optimizations
* SOLR-4815: Admin-UI - DIH: Let "commit" be checked by default (steffkes) * SOLR-4815: Admin-UI - DIH: Let "commit" be checked by default (steffkes)
* SOLR-5002: optimize numDocs(Query,DocSet) when filterCache is null (Robert Muir)
Other Changes Other Changes
---------------------- ----------------------

View File

@ -59,7 +59,10 @@ import org.apache.lucene.index.StoredFieldVisitor;
import org.apache.lucene.index.Term; import org.apache.lucene.index.Term;
import org.apache.lucene.index.Terms; import org.apache.lucene.index.Terms;
import org.apache.lucene.index.TermsEnum; import org.apache.lucene.index.TermsEnum;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.Collector; import org.apache.lucene.search.Collector;
import org.apache.lucene.search.ConstantScoreQuery;
import org.apache.lucene.search.DocIdSet; import org.apache.lucene.search.DocIdSet;
import org.apache.lucene.search.DocIdSetIterator; import org.apache.lucene.search.DocIdSetIterator;
import org.apache.lucene.search.Explanation; import org.apache.lucene.search.Explanation;
@ -77,6 +80,7 @@ import org.apache.lucene.search.TopDocs;
import org.apache.lucene.search.TopDocsCollector; import org.apache.lucene.search.TopDocsCollector;
import org.apache.lucene.search.TopFieldCollector; import org.apache.lucene.search.TopFieldCollector;
import org.apache.lucene.search.TopScoreDocCollector; import org.apache.lucene.search.TopScoreDocCollector;
import org.apache.lucene.search.TotalHitCountCollector;
import org.apache.lucene.search.Weight; import org.apache.lucene.search.Weight;
import org.apache.lucene.store.Directory; import org.apache.lucene.store.Directory;
import org.apache.lucene.util.Bits; import org.apache.lucene.util.Bits;
@ -1921,10 +1925,22 @@ public class SolrIndexSearcher extends IndexSearcher implements Closeable,SolrIn
* @throws IOException If there is a low-level I/O error. * @throws IOException If there is a low-level I/O error.
*/ */
public int numDocs(Query a, DocSet b) throws IOException { public int numDocs(Query a, DocSet b) throws IOException {
// Negative query if absolute value different from original if (filterCache != null) {
Query absQ = QueryUtils.getAbs(a); // Negative query if absolute value different from original
DocSet positiveA = getPositiveDocSet(absQ); Query absQ = QueryUtils.getAbs(a);
return a==absQ ? b.intersectionSize(positiveA) : b.andNotSize(positiveA); DocSet positiveA = getPositiveDocSet(absQ);
return a==absQ ? b.intersectionSize(positiveA) : b.andNotSize(positiveA);
} else {
// If there isn't a cache, then do a single filtered query
// NOTE: we cannot use FilteredQuery, because BitDocSet assumes it will never
// have deleted documents, but UninvertedField's doNegative has sets with deleted docs
TotalHitCountCollector collector = new TotalHitCountCollector();
BooleanQuery bq = new BooleanQuery();
bq.add(QueryUtils.makeQueryable(a), BooleanClause.Occur.MUST);
bq.add(new ConstantScoreQuery(b.getTopFilter()), BooleanClause.Occur.MUST);
super.search(bq, null, collector);
return collector.getTotalHits();
}
} }
/** @lucene.internal */ /** @lucene.internal */