You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by rm...@apache.org on 2013/07/05 21:28:43 UTC
svn commit: r1500110 - in /lucene/dev/branches/branch_4x: ./ solr/
solr/CHANGES.txt solr/core/
solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java
Author: rmuir
Date: Fri Jul 5 19:28:42 2013
New Revision: 1500110
URL: http://svn.apache.org/r1500110
Log:
SOLR-5002: optimize numDocs(Query,DocSet) when filterCache is null
Modified:
lucene/dev/branches/branch_4x/ (props changed)
lucene/dev/branches/branch_4x/solr/ (props changed)
lucene/dev/branches/branch_4x/solr/CHANGES.txt (contents, props changed)
lucene/dev/branches/branch_4x/solr/core/ (props changed)
lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java
Modified: lucene/dev/branches/branch_4x/solr/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/CHANGES.txt?rev=1500110&r1=1500109&r2=1500110&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/CHANGES.txt (original)
+++ lucene/dev/branches/branch_4x/solr/CHANGES.txt Fri Jul 5 19:28:42 2013
@@ -244,6 +244,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
----------------------
Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java?rev=1500110&r1=1500109&r2=1500110&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java Fri Jul 5 19:28:42 2013
@@ -58,7 +58,10 @@ import org.apache.lucene.index.StoredFie
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;
@@ -76,6 +79,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;
@@ -1920,10 +1924,22 @@ public class SolrIndexSearcher extends I
* @throws IOException If there is a low-level I/O error.
*/
public int numDocs(Query a, DocSet b) throws IOException {
- // 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);
+ 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 */