This is an automated email from the ASF dual-hosted git repository.
houston pushed a commit to branch branch_9x
in repository https://gitbox.apache.org/repos/asf/solr.git
The following commit(s) were added to refs/heads/branch_9x by this push:
new c9866fb45db SOLR-17678: Change matchScore to originalScore, make it a
fake-function (#3381)
c9866fb45db is described below
commit c9866fb45dbfbcb95ac7fc710bfbdba1bbd7363c
Author: Houston Putman <[email protected]>
AuthorDate: Tue Jun 10 10:19:59 2025 -0500
SOLR-17678: Change matchScore to originalScore, make it a fake-function
(#3381)
(cherry picked from commit b3ba48ff67de5cf516da8d5136336b4c115918ed)
---
solr/CHANGES.txt | 2 +-
.../org/apache/solr/response/DocsStreamer.java | 2 --
...eAugmenter.java => OriginalScoreAugmenter.java} | 8 ++++----
.../org/apache/solr/search/DocIterationInfo.java | 6 +++---
.../org/apache/solr/search/ReRankCollector.java | 6 +++---
.../org/apache/solr/search/SolrReturnFields.java | 24 ++++++++++++++--------
.../java/org/apache/solr/search/TopDocsSlice.java | 8 ++++----
.../solr/search/DistributedReRankExplainTest.java | 12 +++++------
.../solr/search/TestReRankQParserPlugin.java | 12 +++++------
.../query-guide/pages/query-re-ranking.adoc | 8 ++++----
10 files changed, 47 insertions(+), 41 deletions(-)
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index fc37ad18708..2e3bc6e3d52 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -21,7 +21,7 @@ New Features
* SOLR-17714: Added a FuzzyQParser to enable all FuzzyQuery customizations.
(Houston Putman, Siju Varghese)
-* SOLR-17678: ReRank queries can now return the matchScore (original score) in
addition to the re-ranked score. (Siju Varghese, Houston Putman)
+* SOLR-17678: ReRank queries can now return the originalScore (original score)
in addition to the re-ranked score. (Siju Varghese, Houston Putman)
* SOLR-17447: Support terminating a search early based on maxHitsAllowed per
shard. (Siju Varghese, Houston Putman, David Smiley, Gus Heck)
diff --git a/solr/core/src/java/org/apache/solr/response/DocsStreamer.java
b/solr/core/src/java/org/apache/solr/response/DocsStreamer.java
index 7f34d0e4a80..60a879c2ed7 100644
--- a/solr/core/src/java/org/apache/solr/response/DocsStreamer.java
+++ b/solr/core/src/java/org/apache/solr/response/DocsStreamer.java
@@ -60,8 +60,6 @@ public class DocsStreamer implements Iterator<SolrDocument> {
private final org.apache.solr.response.ResultContext rctx;
private final SolrDocumentFetcher docFetcher; // a collaborator of
SolrIndexSearcher
private final DocList docs;
- private boolean doScore;
- private boolean doMatchScore;
private final DocTransformer transformer;
private final DocIterator docIterator;
diff --git
a/solr/core/src/java/org/apache/solr/response/transform/MatchScoreAugmenter.java
b/solr/core/src/java/org/apache/solr/response/transform/OriginalScoreAugmenter.java
similarity index 85%
rename from
solr/core/src/java/org/apache/solr/response/transform/MatchScoreAugmenter.java
rename to
solr/core/src/java/org/apache/solr/response/transform/OriginalScoreAugmenter.java
index 441c18dd285..f62e98e8d63 100644
---
a/solr/core/src/java/org/apache/solr/response/transform/MatchScoreAugmenter.java
+++
b/solr/core/src/java/org/apache/solr/response/transform/OriginalScoreAugmenter.java
@@ -20,14 +20,14 @@ import org.apache.solr.common.SolrDocument;
import org.apache.solr.search.DocIterationInfo;
/**
- * Simple Augmenter that adds the matchScore
+ * Simple Augmenter that adds the originalScore
*
* @since solr 4.0
*/
-public class MatchScoreAugmenter extends DocTransformer {
+public class OriginalScoreAugmenter extends DocTransformer {
final String name;
- public MatchScoreAugmenter(String display) {
+ public OriginalScoreAugmenter(String display) {
this.name = display;
}
@@ -38,7 +38,7 @@ public class MatchScoreAugmenter extends DocTransformer {
@Override
public void transform(SolrDocument doc, int docid, DocIterationInfo docInfo)
{
- doc.setField(name, docInfo.matchScore());
+ doc.setField(name, docInfo.originalScore());
}
@Override
diff --git a/solr/core/src/java/org/apache/solr/search/DocIterationInfo.java
b/solr/core/src/java/org/apache/solr/search/DocIterationInfo.java
index d67165738c3..8d3e073d09d 100644
--- a/solr/core/src/java/org/apache/solr/search/DocIterationInfo.java
+++ b/solr/core/src/java/org/apache/solr/search/DocIterationInfo.java
@@ -28,11 +28,11 @@ public interface DocIterationInfo {
public float score();
/**
- * Returns the query match score in case of rerank queries
+ * Returns the original query match score in case of rerank queries
*
- * @return the query match score in case of a rerank query, null otherwise.
+ * @return the original query match score in case of a rerank query, null
otherwise.
*/
- public default Float matchScore() {
+ default Float originalScore() {
return null;
}
}
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 10abc972b3d..13db7d42c29 100644
--- a/solr/core/src/java/org/apache/solr/search/ReRankCollector.java
+++ b/solr/core/src/java/org/apache/solr/search/ReRankCollector.java
@@ -271,11 +271,11 @@ public class ReRankCollector extends
TopDocsCollector<ScoreDoc> {
}
static class RescoreDoc extends ScoreDoc {
- public float matchScore;
+ public float originalScore;
- public RescoreDoc(ScoreDoc scoreDoc, float matchScore) {
+ public RescoreDoc(ScoreDoc scoreDoc, float originalScore) {
super(scoreDoc.doc, scoreDoc.score, scoreDoc.shardIndex);
- this.matchScore = matchScore;
+ this.originalScore = originalScore;
}
}
}
diff --git a/solr/core/src/java/org/apache/solr/search/SolrReturnFields.java
b/solr/core/src/java/org/apache/solr/search/SolrReturnFields.java
index 16a2f6781af..939cf9b778c 100644
--- a/solr/core/src/java/org/apache/solr/search/SolrReturnFields.java
+++ b/solr/core/src/java/org/apache/solr/search/SolrReturnFields.java
@@ -37,7 +37,7 @@ import org.apache.solr.common.util.GlobPatternUtil;
import org.apache.solr.request.SolrQueryRequest;
import org.apache.solr.response.transform.DocTransformer;
import org.apache.solr.response.transform.DocTransformers;
-import org.apache.solr.response.transform.MatchScoreAugmenter;
+import org.apache.solr.response.transform.OriginalScoreAugmenter;
import org.apache.solr.response.transform.RenameFieldTransformer;
import org.apache.solr.response.transform.ScoreAugmenter;
import org.apache.solr.response.transform.TransformerFactory;
@@ -48,7 +48,8 @@ import
org.apache.solr.search.SolrDocumentFetcher.RetrieveFieldsOptimizer;
public class SolrReturnFields extends ReturnFields {
// Special Field Keys
public static final String SCORE = "score";
- public static final String MATCH_SCORE = "matchScore";
+ public static final String ORIGINAL_SCORE_NAME = "originalScore";
+ public static final String ORIGINAL_SCORE = "originalScore()";
private final List<String> globs = new ArrayList<>(1);
@@ -313,6 +314,19 @@ public class SolrReturnFields extends ReturnFields {
globs.add(field);
}
continue;
+ } else if (ORIGINAL_SCORE_NAME.equals(field) && sp.opt("(") &&
sp.opt(")")) {
+ // TODO: Remove this in
https://issues.apache.org/jira/browse/SOLR-17784 when
+ // originalScore() becomes a true function
+ ch = sp.ch();
+ if (Character.isWhitespace(ch) || ch == ',' || ch == 0) {
+ _wantsScore = true;
+
+ String disp = (key == null) ? ORIGINAL_SCORE : key;
+ augmenters.addTransformer(new OriginalScoreAugmenter(disp));
+ scoreDependentFields.put(disp, disp.equals(ORIGINAL_SCORE) ? ""
: ORIGINAL_SCORE);
+ addField(ORIGINAL_SCORE, disp, augmenters, true);
+ continue;
+ }
}
// an invalid glob
@@ -501,12 +515,6 @@ public class SolrReturnFields extends ReturnFields {
String disp = (key == null) ? field : key;
augmenters.addTransformer(new ScoreAugmenter(disp));
scoreDependentFields.put(disp, disp.equals(SCORE) ? "" : SCORE);
- } else if (MATCH_SCORE.equals(field)) {
- _wantsScore = true;
-
- String disp = (key == null) ? field : key;
- augmenters.addTransformer(new MatchScoreAugmenter(disp));
- scoreDependentFields.put(disp, disp.equals(MATCH_SCORE) ? "" :
MATCH_SCORE);
}
}
diff --git a/solr/core/src/java/org/apache/solr/search/TopDocsSlice.java
b/solr/core/src/java/org/apache/solr/search/TopDocsSlice.java
index d6141e156cd..daf37a20cf5 100644
--- a/solr/core/src/java/org/apache/solr/search/TopDocsSlice.java
+++ b/solr/core/src/java/org/apache/solr/search/TopDocsSlice.java
@@ -79,9 +79,9 @@ public class TopDocsSlice extends DocSlice {
@Override
public DocIterator iterator() {
- boolean hasMatchScore =
+ boolean hasOriginalScore =
topDocs.scoreDocs.length > 0 && topDocs.scoreDocs[0] instanceof
ReRankCollector.RescoreDoc;
- if (hasMatchScore) {
+ if (hasOriginalScore) {
return new ReRankedTopDocsIterator();
} else {
return new TopDocsIterator();
@@ -123,9 +123,9 @@ public class TopDocsSlice extends DocSlice {
class ReRankedTopDocsIterator extends TopDocsIterator {
@Override
- public Float matchScore() {
+ public Float originalScore() {
try {
- return ((ReRankCollector.RescoreDoc) topDocs.scoreDocs[pos -
1]).matchScore;
+ return ((ReRankCollector.RescoreDoc) topDocs.scoreDocs[pos -
1]).originalScore;
} catch (ClassCastException e) {
return null;
}
diff --git
a/solr/core/src/test/org/apache/solr/search/DistributedReRankExplainTest.java
b/solr/core/src/test/org/apache/solr/search/DistributedReRankExplainTest.java
index 6597f1b2c85..152b1ba9a93 100644
---
a/solr/core/src/test/org/apache/solr/search/DistributedReRankExplainTest.java
+++
b/solr/core/src/test/org/apache/solr/search/DistributedReRankExplainTest.java
@@ -161,18 +161,18 @@ public class DistributedReRankExplainTest extends
SolrCloudTestCase {
CommonParams.Q,
"test_s:hello",
"fl",
- "id,test_s,score,originalScore:matchScore,matchScore")));
+
"id,test_s,score,matchScore:originalScore(),originalScore()")));
final QueryResponse queryResponse = queryRequest.process(client,
COLLECTIONORALIAS);
for (SolrDocument doc : queryResponse.getResults()) {
assertNotNull("test_s", doc.getFieldValue("test_s"));
+ assertNotNull("originalScore()", doc.getFieldValue("originalScore()"));
+ assertTrue(queryResponse.toString(),
doc.getFieldValue("originalScore()") instanceof Float);
assertNotNull("matchScore", doc.getFieldValue("matchScore"));
- assertTrue(queryResponse.toString(), doc.getFieldValue("matchScore")
instanceof Float);
- assertNotNull("originalScore", doc.getFieldValue("originalScore"));
assertTrue(
- doc.getFieldValue("originalScore").toString(),
- doc.getFieldValue("originalScore") instanceof Float);
- assertEquals(doc.getFieldValue("matchScore"),
doc.getFieldValue("originalScore"));
+ doc.getFieldValue("matchScore").toString(),
+ doc.getFieldValue("matchScore") instanceof Float);
+ assertEquals(doc.getFieldValue("originalScore()"),
doc.getFieldValue("matchScore"));
}
return queryResponse;
}
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 e7d457b06be..b3e05ae5cbb 100644
--- a/solr/core/src/test/org/apache/solr/search/TestReRankQParserPlugin.java
+++ b/solr/core/src/test/org/apache/solr/search/TestReRankQParserPlugin.java
@@ -65,7 +65,7 @@ public class TestReRankQParserPlugin extends SolrTestCaseJ4 {
}
@Test
- public void testRerankReturnMatchScore() throws Exception {
+ public void testRerankReturnOriginalScore() throws Exception {
assertU(delQ("*:*"));
assertU(commit());
@@ -121,17 +121,17 @@ public class TestReRankQParserPlugin extends
SolrTestCaseJ4 {
params.add("start", "0");
params.add("rows", "6");
params.add("df", "text");
- params.add("fl", "id,test_ti,score,matchScore");
+ params.add("fl", "id,test_ti,score,originalScore()");
assertQ(
req(params),
"*[count(//doc)=6]",
"//result/doc[1]/str[@name='id'][.='3']",
"//result/doc[1]/float[@name='score'][.>'10000.03']",
- "//result/doc[1]/float[@name='matchScore'][.>'0.03']",
+ "//result/doc[1]/float[@name='originalScore()'][.>'0.03']",
"//result/doc[2]/str[@name='id'][.='4']",
"//result/doc[2]/float[@name='score'][.>'1000.03']",
- "//result/doc[2]/float[@name='matchScore'][.>'0.03']",
+ "//result/doc[2]/float[@name='originalScore()'][.>'0.03']",
"//result/doc[3]/str[@name='id'][.='2']",
"//result/doc[4]/str[@name='id'][.='6']",
"//result/doc[5]/str[@name='id'][.='1']",
@@ -139,7 +139,7 @@ public class TestReRankQParserPlugin extends SolrTestCaseJ4
{
}
@Test
- public void testRerankReturnMatchScoreNotRequested() throws Exception {
+ public void testRerankReturnOriginalScoreNotRequested() throws Exception {
assertU(delQ("*:*"));
assertU(commit());
@@ -198,7 +198,7 @@ public class TestReRankQParserPlugin extends SolrTestCaseJ4
{
params.add("fl", "id,test_ti,score");
String response = JQ(req(params));
- assertFalse(response.contains("matchScore"));
+ assertFalse(response.contains("originalScore()"));
}
@Test
diff --git
a/solr/solr-ref-guide/modules/query-guide/pages/query-re-ranking.adoc
b/solr/solr-ref-guide/modules/query-guide/pages/query-re-ranking.adoc
index e4533412f5e..737ebef74af 100644
--- a/solr/solr-ref-guide/modules/query-guide/pages/query-re-ranking.adoc
+++ b/solr/solr-ref-guide/modules/query-guide/pages/query-re-ranking.adoc
@@ -107,13 +107,13 @@ q=greetings&rq={!rerank reRankQuery=$rqq reRankDocs=1000
reRankWeight=3}&rqq=(hi
----
If a document matches the original query, but does not match the re-ranking
query, the document's original score will remain.
-For reranked documents, an additional `matchScore` field in the response will
indicate the original score for a reranked doc. This
-is the score for the document prior to rerank being applied. For documents
that were not reranked, the matchScore and score fields
-will have the same value. For the example above, you would use the following
to return the match score:
+For reranked documents, an additional `originalScore()` function in the
response will indicate the original score for a reranked doc. This
+is the score for the document prior to rerank being applied. For documents
that were not reranked, the `originalScore()` and `score` fields
+will have the same value. For the example above, you would use the following
to return the original score:
[source,text]
----
-q=greetings&rq={!rerank reRankQuery=$rqq reRankDocs=1000
reRankWeight=3}&rqq=(hi+hello+hey+hiya)&fl=id,matchScore
+q=greetings&rq={!rerank reRankQuery=$rqq reRankDocs=1000
reRankWeight=3}&rqq=(hi+hello+hey+hiya)&fl=id,originalScore()
----
Setting `reRankOperator` to `multiply` will multiply the three numbers
instead. This means that other multiplying operations such as
xref:edismax-query-parser.adoc#extended-dismax-parameters[eDisMax `boost`
functions] can be converted to Re-Rank operations.