You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@solr.apache.org by jb...@apache.org on 2023/06/12 20:29:58 UTC
[solr] 01/01: Working explain
This is an automated email from the ASF dual-hosted git repository.
jbernste pushed a commit to branch SOLR-16827
in repository https://gitbox.apache.org/repos/asf/solr.git
commit a3ec4f8503f971f48395c4754b4e7b377f936bfb
Author: Joel Bernstein <jb...@apache.org>
AuthorDate: Mon Jun 12 16:29:07 2023 -0400
Working explain
---
.../solr/handler/component/ResponseBuilder.java | 5 +++
.../apache/solr/search/ReRankQParserPlugin.java | 26 ++++++++++--
.../java/org/apache/solr/search/ReRankScaler.java | 8 +++-
.../java/org/apache/solr/search/ReRankWeight.java | 23 +++++++----
.../solr/search/TestReRankQParserPlugin.java | 46 ++++++++++++++++++++--
5 files changed, 93 insertions(+), 15 deletions(-)
diff --git a/solr/core/src/java/org/apache/solr/handler/component/ResponseBuilder.java b/solr/core/src/java/org/apache/solr/handler/component/ResponseBuilder.java
index ea90503ef5c..61c8e3d4aa2 100644
--- a/solr/core/src/java/org/apache/solr/handler/component/ResponseBuilder.java
+++ b/solr/core/src/java/org/apache/solr/handler/component/ResponseBuilder.java
@@ -42,6 +42,7 @@ import org.apache.solr.search.QParser;
import org.apache.solr.search.QueryCommand;
import org.apache.solr.search.QueryResult;
import org.apache.solr.search.RankQuery;
+import org.apache.solr.search.ReRankScaler;
import org.apache.solr.search.SortSpec;
import org.apache.solr.search.grouping.GroupingSpecification;
import org.apache.solr.search.grouping.distributed.command.QueryCommandResult;
@@ -93,6 +94,7 @@ public class ResponseBuilder {
private RTimer timer = null;
private Query highlightQuery = null;
+ private ReRankScaler.ReRankScalerExplain reRankScalerExplain;
public List<SearchComponent> components;
@@ -194,6 +196,9 @@ public class ResponseBuilder {
// for the second phase.
public int firstPhaseElapsedTime;
+ public ReRankScaler.MinMaxExplain mainScaleExplain;
+ public ReRankScaler.MinMaxExplain reRankScaleExplain;
+
/**
* Utility function to add debugging info. This will make sure a valid debugInfo exists before
* adding to it.
diff --git a/solr/core/src/java/org/apache/solr/search/ReRankQParserPlugin.java b/solr/core/src/java/org/apache/solr/search/ReRankQParserPlugin.java
index 0cc16ff742c..062a96bfee1 100644
--- a/solr/core/src/java/org/apache/solr/search/ReRankQParserPlugin.java
+++ b/solr/core/src/java/org/apache/solr/search/ReRankQParserPlugin.java
@@ -21,6 +21,7 @@ import org.apache.lucene.search.MatchAllDocsQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.QueryRescorer;
import org.apache.solr.common.SolrException;
+import org.apache.solr.common.params.CommonParams;
import org.apache.solr.common.params.SolrParams;
import org.apache.solr.common.util.StrUtils;
import org.apache.solr.request.SolrQueryRequest;
@@ -86,7 +87,14 @@ public class ReRankQParserPlugin extends QParserPlugin {
ReRankScaler reRankScaler = new ReRankScaler(mainScale, reRankScale, reRankOperator);
- return new ReRankQuery(reRankQuery, reRankDocs, reRankWeight, reRankOperator, reRankScaler);
+ if (reRankScaler.scaleScores()) {
+ reRankWeight = 1;
+ }
+
+ boolean debugQuery = params.getBool(CommonParams.DEBUG_QUERY, false);
+
+ return new ReRankQuery(
+ reRankQuery, reRankDocs, reRankWeight, reRankOperator, reRankScaler, debugQuery);
}
}
@@ -132,6 +140,7 @@ public class ReRankQParserPlugin extends QParserPlugin {
private static final class ReRankQuery extends AbstractReRankQuery {
private final Query reRankQuery;
private final double reRankWeight;
+ private final boolean debugQuery;
@Override
public int hashCode() {
@@ -167,7 +176,8 @@ public class ReRankQParserPlugin extends QParserPlugin {
int reRankDocs,
double reRankWeight,
ReRankOperator reRankOperator,
- ReRankScaler reRankScaler) {
+ ReRankScaler reRankScaler,
+ boolean debugQuery) {
super(
defaultQuery,
reRankDocs,
@@ -176,6 +186,7 @@ public class ReRankQParserPlugin extends QParserPlugin {
reRankOperator);
this.reRankQuery = reRankQuery;
this.reRankWeight = reRankWeight;
+ this.debugQuery = debugQuery;
}
@Override
@@ -205,8 +216,17 @@ public class ReRankQParserPlugin extends QParserPlugin {
@Override
protected Query rewrite(Query rewrittenMainQuery) throws IOException {
- return new ReRankQuery(reRankQuery, reRankDocs, reRankWeight, reRankOperator, reRankScaler)
+ return new ReRankQuery(
+ reRankQuery, reRankDocs, reRankWeight, reRankOperator, reRankScaler, debugQuery)
.wrap(rewrittenMainQuery);
}
+
+ public boolean getCache() {
+ if (debugQuery) {
+ return false;
+ } else {
+ return super.getCache();
+ }
+ }
}
}
diff --git a/solr/core/src/java/org/apache/solr/search/ReRankScaler.java b/solr/core/src/java/org/apache/solr/search/ReRankScaler.java
index 19034a5a247..c0281f5dc15 100644
--- a/solr/core/src/java/org/apache/solr/search/ReRankScaler.java
+++ b/solr/core/src/java/org/apache/solr/search/ReRankScaler.java
@@ -21,6 +21,7 @@ import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import org.apache.lucene.search.ScoreDoc;
+import org.apache.solr.request.SolrRequestInfo;
public class ReRankScaler {
@@ -115,6 +116,8 @@ public class ReRankScaler {
if (scaleMainScores()) {
MinMaxExplain mainExplain = getMinMaxExplain(mainQueryMin, mainQueryMax, originalScoreMap);
scaledOriginalScoreMap = minMaxScaleScores(originalScoreMap, mainExplain);
+ System.out.println("Scaled Main Scores:" + scaledOriginalScoreMap);
+ SolrRequestInfo.getRequestInfo().getResponseBuilder().mainScaleExplain = mainExplain;
reRankScalerExplain.setMainScaleExplain(mainExplain);
} else {
scaledOriginalScoreMap = originalScoreMap;
@@ -133,6 +136,8 @@ public class ReRankScaler {
if (scaleReRankScores()) {
MinMaxExplain reRankExplain = getMinMaxExplain(reRankQueryMin, reRankQueryMax, rescoredMap);
scaledRescoredMap = minMaxScaleScores(rescoredMap, reRankExplain);
+ System.out.println("Scaled reRank Scores:" + scaledRescoredMap);
+ SolrRequestInfo.getRequestInfo().getResponseBuilder().reRankScaleExplain = reRankExplain;
reRankScalerExplain.setReRankScaleExplain(reRankExplain);
} else {
scaledRescoredMap = rescoredMap;
@@ -278,7 +283,8 @@ public class ReRankScaler {
} else {
float scaledScore = (score - localMin) / (localMax - localMin);
if (scaleMin != 0 || scaleMax != 1) {
- return (diff * scaledScore) + scaleMin;
+ scaledScore = (diff * scaledScore) + scaleMin;
+ return scaledScore;
} else {
return scaledScore;
}
diff --git a/solr/core/src/java/org/apache/solr/search/ReRankWeight.java b/solr/core/src/java/org/apache/solr/search/ReRankWeight.java
index 872e80cc2c7..44f6b8db483 100644
--- a/solr/core/src/java/org/apache/solr/search/ReRankWeight.java
+++ b/solr/core/src/java/org/apache/solr/search/ReRankWeight.java
@@ -17,7 +17,6 @@
package org.apache.solr.search;
import java.io.IOException;
-import java.util.Locale;
import org.apache.lucene.index.LeafReaderContext;
import org.apache.lucene.search.Explanation;
import org.apache.lucene.search.FilterWeight;
@@ -25,6 +24,7 @@ import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.Rescorer;
import org.apache.lucene.search.Weight;
+import org.apache.solr.request.SolrRequestInfo;
/** A {@code Weight} used by reranking queries. */
public class ReRankWeight extends FilterWeight {
@@ -59,19 +59,26 @@ public class ReRankWeight extends FilterWeight {
float mainScore = mainExplain.getValue().floatValue();
if (reRankScore > 0.0f) {
float scaledMainScore =
- reRankScaler.getReRankScalerExplain().getMainScaleExplain().scale(mainScore);
+ SolrRequestInfo.getRequestInfo().getResponseBuilder().mainScaleExplain.scale(mainScore);
float scaledReRankScore =
- reRankScaler.getReRankScalerExplain().getReRankScaleExplain().scale(reRankScore);
+ SolrRequestInfo.getRequestInfo()
+ .getResponseBuilder()
+ .reRankScaleExplain
+ .scale(reRankScore);
float scaledCombined =
ReRankScaler.combineScores(scaledMainScore, scaledReRankScore, reRankOperator);
+ System.out.println(
+ "Scaled scores 1:"
+ + Float.valueOf(scaledMainScore).toString()
+ + " : "
+ + Float.valueOf(scaledReRankScore).toString());
Explanation scaleExplain =
Explanation.match(
scaledCombined,
- String.format(
- Locale.getDefault(),
- "Main query score rescaled to %1$f reRank score rescaled to %2$f",
- scaledMainScore,
- scaledReRankScore),
+ "Main query score rescaled to "
+ + scaledMainScore
+ + " reRank score rescaled to "
+ + scaledReRankScore,
reRankExplain);
return scaleExplain;
}
diff --git a/solr/core/src/test/org/apache/solr/search/TestReRankQParserPlugin.java b/solr/core/src/test/org/apache/solr/search/TestReRankQParserPlugin.java
index cab3cce58de..83ddc67ee56 100644
--- a/solr/core/src/test/org/apache/solr/search/TestReRankQParserPlugin.java
+++ b/solr/core/src/test/org/apache/solr/search/TestReRankQParserPlugin.java
@@ -1130,10 +1130,10 @@ public class TestReRankQParserPlugin extends SolrTestCaseJ4 {
assertEquals(scaled3, .5f, 0);
float rescore = ReRankScaler.getReRankScore(100.2777f, 200.2333f, ReRankOperator.ADD);
- assertEquals(rescore, 200.2333f - 100.2777f, 0);
+ assertEquals(rescore, 99.9556f, .00001f);
- rescore = ReRankScaler.getReRankScore(100.2777f, 200.2333f, ReRankOperator.MULTIPLY);
- assertEquals(rescore, 200.2333f / 100.2777f, 0);
+ rescore = ReRankScaler.getReRankScore(100.88845f, 200.77777f, ReRankOperator.MULTIPLY);
+ assertEquals(rescore, 1.99009f, .00001f);
rescore = ReRankScaler.getReRankScore(100.2777f, 200.2333f, ReRankOperator.REPLACE);
assertEquals(rescore, 200.2333f, 0);
@@ -1362,5 +1362,45 @@ public class TestReRankQParserPlugin extends SolrTestCaseJ4 {
"//result/doc[1]/float[@name='score'][.='30.0']",
"//result/doc[2]/str[@name='id'][.='5']",
"//result/doc[2]/float[@name='score'][.='30.0']");
+
+ // Test reRank more than found
+ params = new ModifiableSolrParams();
+ params.add(
+ "rq",
+ "{!"
+ + ReRankQParserPlugin.NAME
+ + " "
+ + ReRankQParserPlugin.RERANK_MAIN_SCALE
+ + "=10-20 "
+ + ReRankQParserPlugin.RERANK_SCALE
+ + "=10-20 "
+ + ReRankQParserPlugin.RERANK_QUERY
+ + "=$rqq "
+ + ReRankQParserPlugin.RERANK_DOCS
+ + "=4}");
+ params.add("q", "term_t:YYYY");
+ params.add("fq", "id:(4 OR 5)");
+ params.add("fl", "id,score");
+ params.add("rqq", "{!edismax bf=$bff}*:*");
+ params.add("bff", "field(test_ti)");
+ params.add("start", "0");
+ params.add("rows", "6");
+ params.add("df", "text");
+ params.add("debugQuery", "true");
+ assertQ(
+ req(params),
+ "*[count(//doc)=2]",
+ "//result/doc[1]/str[@name='id'][.='4']",
+ "//result/doc[1]/float[@name='score'][.='30.0']",
+ "//result/doc[2]/str[@name='id'][.='5']",
+ "//result/doc[2]/float[@name='score'][.='30.0']");
+
+ String explainResponse = JQ(req(params));
+ assertTrue(
+ explainResponse.contains(
+ "30.001122 = Main query score rescaled to 10.0 reRank score rescaled to 20.001122"));
+ assertTrue(
+ explainResponse.contains(
+ "30.001133 = Main query score rescaled to 20.0 reRank score rescaled to 10.001134"));
}
}