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