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"));
   }
 }