You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by sa...@apache.org on 2016/11/02 23:59:16 UTC

[19/50] [abbrv] lucene-solr:apiv2: SOLR-9704: optimization: use filters after blockChildren for acceptDocs

SOLR-9704: optimization: use filters after blockChildren for acceptDocs


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/0f8802ba
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/0f8802ba
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/0f8802ba

Branch: refs/heads/apiv2
Commit: 0f8802ba20de35daac75f6bbcc28a1789a27b06a
Parents: d8d3a8b
Author: yonik <yo...@apache.org>
Authored: Sat Oct 29 20:43:54 2016 -0400
Committer: yonik <yo...@apache.org>
Committed: Sat Oct 29 20:43:54 2016 -0400

----------------------------------------------------------------------
 solr/CHANGES.txt                                |  5 +++
 .../solr/search/facet/FacetProcessor.java       | 34 +++++++++++++-------
 2 files changed, 27 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/0f8802ba/solr/CHANGES.txt
----------------------------------------------------------------------
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 50639ab..3b3fba7 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -86,6 +86,11 @@ New Features
   Example:  { type:terms, field:category, filter:"user:yonik" } 
   (yonik)
 
+Optimizations
+----------------------
+* SOLR-9704: Facet Module / JSON Facet API: Optimize blockChildren facets that have
+  filters specified by using those filters as acceptDocs. (yonik)
+
 Other Changes
 ----------------------
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/0f8802ba/solr/core/src/java/org/apache/solr/search/facet/FacetProcessor.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/search/facet/FacetProcessor.java b/solr/core/src/java/org/apache/solr/search/facet/FacetProcessor.java
index e610478..a8914f1 100644
--- a/solr/core/src/java/org/apache/solr/search/facet/FacetProcessor.java
+++ b/solr/core/src/java/org/apache/solr/search/facet/FacetProcessor.java
@@ -28,7 +28,6 @@ import java.util.Map;
 import org.apache.lucene.index.LeafReaderContext;
 import org.apache.lucene.search.BooleanClause;
 import org.apache.lucene.search.BooleanQuery;
-import org.apache.lucene.search.MatchAllDocsQuery;
 import org.apache.lucene.search.Query;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.util.SimpleOrderedMap;
@@ -88,14 +87,14 @@ public abstract class FacetProcessor<FacetRequestT extends FacetRequest>  {
   public void process() throws IOException {
     // Check filters... if we do have filters they apply after domain changes.
     // We still calculate them first because we can use it in a parent->child domain change.
-    handleFilters();
-    handleDomainChanges();
-    if (filter != null) {
+    evalFilters();
+    boolean appliedFilters = handleDomainChanges();
+    if (filter != null && !appliedFilters) {
       fcontext.base = fcontext.base.intersection( filter );
     }
   }
 
-  private void handleFilters() throws IOException {
+  private void evalFilters() throws IOException {
     if (freq.filters == null || freq.filters.isEmpty()) return;
 
     List<Query> qlist = new ArrayList<>(freq.filters.size());
@@ -120,10 +119,11 @@ public abstract class FacetProcessor<FacetRequestT extends FacetRequest>  {
     this.filter = fcontext.searcher.getDocSet(qlist);
   }
 
-  private void handleDomainChanges() throws IOException {
-    if (freq.domain == null) return;
+  private boolean handleDomainChanges() throws IOException {
+    if (freq.domain == null) return false;
     handleFilterExclusions();
-    handleBlockJoin();
+    boolean appliedFilters = handleBlockJoin();
+    return appliedFilters;
   }
 
   private void handleFilterExclusions() throws IOException {
@@ -187,8 +187,10 @@ public abstract class FacetProcessor<FacetRequestT extends FacetRequest>  {
     fcontext.base = fcontext.searcher.getDocSet(qlist);
   }
 
-  private void handleBlockJoin() throws IOException {
-    if (!(freq.domain.toChildren || freq.domain.toParent)) return;
+  // returns "true" if filters have already been applied.
+  private boolean handleBlockJoin() throws IOException {
+    boolean appliedFilters = false;
+    if (!(freq.domain.toChildren || freq.domain.toParent)) return appliedFilters;
 
     // TODO: avoid query parsing per-bucket somehow...
     String parentStr = freq.domain.parents;
@@ -205,13 +207,21 @@ public abstract class FacetProcessor<FacetRequestT extends FacetRequest>  {
     DocSet result;
 
     if (freq.domain.toChildren) {
-      DocSet filt = fcontext.searcher.getDocSetBits( new MatchAllDocsQuery() );
-      result = BlockJoin.toChildren(input, parents, filt, fcontext.qcontext);
+      // If there are filters on this facet, then use them as acceptDocs when executing toChildren.
+      // We need to remember to not redundantly re-apply these filters after.
+      DocSet acceptDocs = this.filter;
+      if (acceptDocs == null) {
+        acceptDocs = fcontext.searcher.getLiveDocs();
+      } else {
+        appliedFilters = true;
+      }
+      result = BlockJoin.toChildren(input, parents, acceptDocs, fcontext.qcontext);
     } else {
       result = BlockJoin.toParents(input, parents, fcontext.qcontext);
     }
 
     fcontext.base = result;
+    return appliedFilters;
   }
 
   protected void processStats(SimpleOrderedMap<Object> bucket, DocSet docs, int docCount) throws IOException {