mirror of https://github.com/apache/lucene.git
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:
parent
b119be488a
commit
a278bb6628
|
@ -273,6 +273,8 @@ Optimizations
|
|||
|
||||
* 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
|
||||
----------------------
|
||||
|
||||
|
|
|
@ -59,7 +59,10 @@ import org.apache.lucene.index.StoredFieldVisitor;
|
|||
import org.apache.lucene.index.Term;
|
||||
import org.apache.lucene.index.Terms;
|
||||
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.ConstantScoreQuery;
|
||||
import org.apache.lucene.search.DocIdSet;
|
||||
import org.apache.lucene.search.DocIdSetIterator;
|
||||
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.TopFieldCollector;
|
||||
import org.apache.lucene.search.TopScoreDocCollector;
|
||||
import org.apache.lucene.search.TotalHitCountCollector;
|
||||
import org.apache.lucene.search.Weight;
|
||||
import org.apache.lucene.store.Directory;
|
||||
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.
|
||||
*/
|
||||
public int numDocs(Query a, DocSet b) throws IOException {
|
||||
if (filterCache != null) {
|
||||
// Negative query if absolute value different from original
|
||||
Query absQ = QueryUtils.getAbs(a);
|
||||
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 */
|
||||
|
|
Loading…
Reference in New Issue