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:57 UTC

[solr] branch SOLR-16827 created (now a3ec4f8503f)

This is an automated email from the ASF dual-hosted git repository.

jbernste pushed a change to branch SOLR-16827
in repository https://gitbox.apache.org/repos/asf/solr.git


      at a3ec4f8503f Working explain

This branch includes the following new commits:

     new a3ec4f8503f Working explain

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[solr] 01/01: Working explain

Posted by jb...@apache.org.
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"));
   }
 }