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:37:39 UTC
lucene-solr:master: SOLR-12375: Optimize Lucene 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 co
Repository: lucene-solr
Updated Branches:
refs/heads/master d32ce81ea -> 53a3de3b9
SOLR-12375: Optimize Lucene 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.
Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/53a3de3b
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/53a3de3b
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/53a3de3b
Branch: refs/heads/master
Commit: 53a3de3b98a5a06146a33251c176b7e4475270e4
Parents: d32ce81
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:37:33 2018 -0400
----------------------------------------------------------------------
solr/CHANGES.txt | 5 ++++
.../solr/handler/component/ExpandComponent.java | 23 ++++++++-------
.../apache/solr/search/ExportQParserPlugin.java | 30 +++++++++++++-------
.../org/apache/solr/search/ReRankCollector.java | 3 +-
.../apache/solr/search/SolrIndexSearcher.java | 4 +--
5 files changed, 40 insertions(+), 25 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/53a3de3b/solr/CHANGES.txt
----------------------------------------------------------------------
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 9ec2de3..761d06d 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -256,6 +256,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 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/53a3de3b/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 09b4b36..f6e29e4 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
@@ -551,11 +551,6 @@ public class ExpandComponent extends SearchComponent implements PluginInfoInitia
}
}
- @Override
- public ScoreMode scoreMode() {
- return ScoreMode.COMPLETE; // TODO: is this always true?
- }
-
public LeafCollector getLeafCollector(LeafReaderContext context) throws IOException {
final int docBase = context.docBase;
@@ -634,11 +629,6 @@ public class ExpandComponent extends SearchComponent implements PluginInfoInitia
this.field = field;
this.collapsedSet = collapsedSet;
}
-
- @Override
- public ScoreMode scoreMode() {
- return ScoreMode.COMPLETE; // TODO: is this always true?
- }
public LeafCollector getLeafCollector(LeafReaderContext context) throws IOException {
final int docBase = context.docBase;
@@ -683,8 +673,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 ScoreMode scoreMode() {
+ final LongObjectMap<Collector> groups = getGroups();
+ if (groups.isEmpty()) {
+ return ScoreMode.COMPLETE; // doesn't matter?
+ } else {
+ return groups.iterator().next().value.scoreMode(); // 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/53a3de3b/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 fd625af..dbaf3db 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,27 @@
*/
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.ScoreMode;
+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";
@@ -73,7 +81,7 @@ public class ExportQParserPlugin extends QParserPlugin {
@Override
public Weight createWeight(IndexSearcher searcher, ScoreMode scoreMode, float boost) throws IOException{
- return mainQuery.createWeight(searcher, ScoreMode.COMPLETE, boost);
+ return mainQuery.createWeight(searcher, scoreMode, boost);
}
public Query rewrite(IndexReader reader) throws IOException {
@@ -177,7 +185,7 @@ public class ExportQParserPlugin extends QParserPlugin {
@Override
public ScoreMode scoreMode() {
- return ScoreMode.COMPLETE; // TODO: is this the case?
+ return ScoreMode.COMPLETE_NO_SCORES;
}
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/53a3de3b/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 9b6ecb3..0447053 100644
--- a/solr/core/src/java/org/apache/solr/search/ReRankCollector.java
+++ b/solr/core/src/java/org/apache/solr/search/ReRankCollector.java
@@ -65,6 +65,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;
@@ -82,7 +83,7 @@ public class ReRankCollector extends TopDocsCollector {
@Override
public ScoreMode scoreMode() {
- return ScoreMode.COMPLETE;
+ return ScoreMode.COMPLETE; // 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/53a3de3b/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 2dbc2db..a8c168e 100644
--- a/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java
+++ b/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java
@@ -1061,7 +1061,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), ScoreMode.COMPLETE, 1));
+ weights.add(createWeight(rewrite(qq), ScoreMode.COMPLETE_NO_SCORES, 1));
}
pf.filter = new FilterImpl(answer, weights);
pf.hasDeletedDocs = (answer == null); // if all clauses were uncached, the resulting filter may match deleted docs
@@ -1672,7 +1672,7 @@ public class SolrIndexSearcher extends IndexSearcher implements Closeable, SolrI
@Override
public ScoreMode scoreMode() {
- return ScoreMode.COMPLETE;
+ return ScoreMode.TOP_SCORES;
}
};