You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ds...@apache.org on 2018/05/23 19:50:45 UTC

lucene-solr:branch_7x: SOLR-12375: Optimize Lucene needsScore / ScoreMode use: * A non-cached filter query could be told incorrectly that scores were needed. * The /export (ExportQParserPlugin) would declare incorrectly that scores are needed. * Expanded

Repository: lucene-solr
Updated Branches:
  refs/heads/branch_7x bc3926509 -> 11fb992ab


SOLR-12375: Optimize Lucene needsScore / ScoreMode use:
* A non-cached filter query could be told incorrectly that scores were needed.
* The /export (ExportQParserPlugin) would declare incorrectly that scores are needed.
* Expanded docs (expand component) could be told incorrectly that scores are needed.

note: non-trivial changes back-ported; ScoreMode is in master; 7x has needsScore.

(cherry picked from commit 53a3de3)


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

Branch: refs/heads/branch_7x
Commit: 11fb992abb3d209ab34a50956f2affe9626380b0
Parents: bc39265
Author: David Smiley <ds...@apache.org>
Authored: Wed May 23 15:37:33 2018 -0400
Committer: David Smiley <ds...@apache.org>
Committed: Wed May 23 15:50:40 2018 -0400

----------------------------------------------------------------------
 solr/CHANGES.txt                                |  5 ++++
 .../solr/handler/component/ExpandComponent.java | 23 ++++++++--------
 .../apache/solr/search/ExportQParserPlugin.java | 29 ++++++++++++--------
 .../org/apache/solr/search/ReRankCollector.java |  3 +-
 .../apache/solr/search/SolrIndexSearcher.java   |  2 +-
 5 files changed, 38 insertions(+), 24 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/11fb992a/solr/CHANGES.txt
----------------------------------------------------------------------
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 8f725bf..634ac13 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -227,6 +227,11 @@ Optimizations
 * SOLR-11880: Avoid creating new exceptions for every request made to MDCAwareThreadPoolExecutor by distributed
   search and update operations. (Varun Thacker, shalin)
 
+* SOLR-12375: Optimize Lucene needsScore / ScoreMode use:
+  A non-cached filter query could be told incorrectly that scores were needed.
+  The /export (ExportQParserPlugin) would declare incorrectly that scores are needed.
+  Expanded docs (expand component) could be told incorrectly that scores are needed.  (David Smiley)
+
 Other Changes
 ----------------------
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/11fb992a/solr/core/src/java/org/apache/solr/handler/component/ExpandComponent.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/component/ExpandComponent.java b/solr/core/src/java/org/apache/solr/handler/component/ExpandComponent.java
index be6e956..e372fcd 100644
--- a/solr/core/src/java/org/apache/solr/handler/component/ExpandComponent.java
+++ b/solr/core/src/java/org/apache/solr/handler/component/ExpandComponent.java
@@ -550,11 +550,6 @@ public class ExpandComponent extends SearchComponent implements PluginInfoInitia
       }
     }
 
-    @Override
-    public boolean needsScores() {
-      return true; // TODO: is this always true?
-    }
-
     public LeafCollector getLeafCollector(LeafReaderContext context) throws IOException {
       final int docBase = context.docBase;
 
@@ -633,11 +628,6 @@ public class ExpandComponent extends SearchComponent implements PluginInfoInitia
       this.field = field;
       this.collapsedSet = collapsedSet;
     }
-    
-    @Override
-    public boolean needsScores() {
-      return true; // TODO: is this always true?
-    }
 
     public LeafCollector getLeafCollector(LeafReaderContext context) throws IOException {
       final int docBase = context.docBase;
@@ -682,8 +672,19 @@ public class ExpandComponent extends SearchComponent implements PluginInfoInitia
 
   }
 
-  private interface GroupCollector {
+  //TODO lets just do simple abstract base class -- a fine use of inheritance
+  private interface GroupCollector extends Collector {
     public LongObjectMap<Collector> getGroups();
+
+    @Override
+    default boolean needsScores() {
+      final LongObjectMap<Collector> groups = getGroups();
+      if (groups.isEmpty()) {
+        return true; // doesn't matter?
+      } else {
+        return groups.iterator().next().value.needsScores(); // we assume all the collectors should have the same nature
+      }
+    }
   }
 
   private Query getGroupQuery(String fname,

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/11fb992a/solr/core/src/java/org/apache/solr/search/ExportQParserPlugin.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/search/ExportQParserPlugin.java b/solr/core/src/java/org/apache/solr/search/ExportQParserPlugin.java
index 6c1714c..d4973e6 100644
--- a/solr/core/src/java/org/apache/solr/search/ExportQParserPlugin.java
+++ b/solr/core/src/java/org/apache/solr/search/ExportQParserPlugin.java
@@ -16,19 +16,26 @@
  */
 package org.apache.solr.search;
 
-import org.apache.lucene.util.FixedBitSet;
-import org.apache.solr.handler.component.MergeStrategy;
-import org.apache.solr.request.SolrRequestInfo;
-
-import org.apache.lucene.search.*;
-import org.apache.lucene.index.*;
-import org.apache.solr.request.SolrQueryRequest;
-import org.apache.solr.common.params.SolrParams;
-
 import java.io.IOException;
 import java.util.Map;
 import java.util.Objects;
 
+import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.LeafReaderContext;
+import org.apache.lucene.search.IndexSearcher;
+import org.apache.lucene.search.LeafCollector;
+import org.apache.lucene.search.Query;
+import org.apache.lucene.search.ScoreDoc;
+import org.apache.lucene.search.Scorer;
+import org.apache.lucene.search.TopDocs;
+import org.apache.lucene.search.TopDocsCollector;
+import org.apache.lucene.search.Weight;
+import org.apache.lucene.util.FixedBitSet;
+import org.apache.solr.common.params.SolrParams;
+import org.apache.solr.handler.component.MergeStrategy;
+import org.apache.solr.request.SolrQueryRequest;
+import org.apache.solr.request.SolrRequestInfo;
+
 public class ExportQParserPlugin extends QParserPlugin {
 
   public static final String NAME = "xport";
@@ -72,7 +79,7 @@ public class ExportQParserPlugin extends QParserPlugin {
     }
 
     public Weight createWeight(IndexSearcher searcher, boolean needsScores, float boost) throws IOException{
-      return mainQuery.createWeight(searcher, true, boost);
+      return mainQuery.createWeight(searcher, needsScores, boost);
     }
 
     public Query rewrite(IndexReader reader) throws IOException {
@@ -176,7 +183,7 @@ public class ExportQParserPlugin extends QParserPlugin {
 
     @Override
     public boolean needsScores() {
-      return true; // TODO: is this the case?
+      return false;
     }
   }
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/11fb992a/solr/core/src/java/org/apache/solr/search/ReRankCollector.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/search/ReRankCollector.java b/solr/core/src/java/org/apache/solr/search/ReRankCollector.java
index 1c0deb1..72f9901 100644
--- a/solr/core/src/java/org/apache/solr/search/ReRankCollector.java
+++ b/solr/core/src/java/org/apache/solr/search/ReRankCollector.java
@@ -64,6 +64,7 @@ public class ReRankCollector extends TopDocsCollector {
       this.mainCollector = TopScoreDocCollector.create(Math.max(this.reRankDocs, length));
     } else {
       sort = sort.rewrite(searcher);
+      //scores are needed for Rescorer (regardless of whether sort needs it)
       this.mainCollector = TopFieldCollector.create(sort, Math.max(this.reRankDocs, length), false, true, true, true);
     }
     this.searcher = searcher;
@@ -81,7 +82,7 @@ public class ReRankCollector extends TopDocsCollector {
 
   @Override
   public boolean needsScores() {
-    return true;
+    return true; // since the scores will be needed by Rescorer as input regardless of mainCollector
   }
 
   public TopDocs topDocs(int start, int howMany) {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/11fb992a/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java b/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java
index 3525ac1..45fcadf 100644
--- a/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java
+++ b/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java
@@ -1062,7 +1062,7 @@ public class SolrIndexSearcher extends IndexSearcher implements Closeable, SolrI
       List<Weight> weights = new ArrayList<>(notCached.size());
       for (Query q : notCached) {
         Query qq = QueryUtils.makeQueryable(q);
-        weights.add(createWeight(rewrite(qq), true, 1));
+        weights.add(createWeight(rewrite(qq), false, 1));
       }
       pf.filter = new FilterImpl(answer, weights);
       pf.hasDeletedDocs = (answer == null);  // if all clauses were uncached, the resulting filter may match deleted docs