This is an automated email from the ASF dual-hosted git repository.
cpoerschke pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/solr.git
The following commit(s) were added to refs/heads/main by this push:
new fed00c70699 SOLR-17749: linear function support for RankQParserPlugin
(#3339)
fed00c70699 is described below
commit fed00c706992854244f8139747a1750c44892124
Author: Christine Poerschke <[email protected]>
AuthorDate: Fri May 2 17:17:56 2025 +0100
SOLR-17749: linear function support for RankQParserPlugin (#3339)
---
solr/CHANGES.txt | 2 +
.../org/apache/solr/search/RankQParserPlugin.java | 11 +++++
.../apache/solr/search/RankQParserPluginTest.java | 48 ++++++++++++++++++++++
3 files changed, 61 insertions(+)
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 5501eb95017..f02a4a41c33 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -207,6 +207,8 @@ New Features
* SSOLR-17447 : Support terminating a search early based on maxHitsAllowed per
shard. (Siju Varghese, Houston Putman, David Smiley, Gus Heck)
+* SOLR-17749: Added linear function support for RankField via
RankQParserPlugin. (Christine Poerschke)
+
Improvements
---------------------
* SOLR-15751: The v2 API now has parity with the v1 "COLSTATUS" and "segments"
APIs, which can be used to fetch detailed information about
diff --git a/solr/core/src/java/org/apache/solr/search/RankQParserPlugin.java
b/solr/core/src/java/org/apache/solr/search/RankQParserPlugin.java
index 6bc40d9be6a..da695b4df3c 100644
--- a/solr/core/src/java/org/apache/solr/search/RankQParserPlugin.java
+++ b/solr/core/src/java/org/apache/solr/search/RankQParserPlugin.java
@@ -73,6 +73,17 @@ public class RankQParserPlugin extends QParserPlugin {
}
}
},
+ LINEAR {
+ @Override
+ public Query createQuery(String fieldName, SolrParams params) throws
SyntaxError {
+ float weight = params.getFloat(WEIGHT, 1f);
+ try {
+ return
FeatureField.newLinearQuery(RankField.INTERNAL_RANK_FIELD_NAME, fieldName,
weight);
+ } catch (IllegalArgumentException iae) {
+ throw new SyntaxError(iae.getMessage());
+ }
+ }
+ },
LOG {
@Override
public Query createQuery(String fieldName, SolrParams params) throws
SyntaxError {
diff --git
a/solr/core/src/test/org/apache/solr/search/RankQParserPluginTest.java
b/solr/core/src/test/org/apache/solr/search/RankQParserPluginTest.java
index 8df79b50084..1cfc840e7ef 100644
--- a/solr/core/src/test/org/apache/solr/search/RankQParserPluginTest.java
+++ b/solr/core/src/test/org/apache/solr/search/RankQParserPluginTest.java
@@ -82,6 +82,20 @@ public class RankQParserPluginTest extends SolrTestCaseJ4 {
() -> getRankQParser(params(FIELD, "id"), req()).parse());
}
+ public void testBadLinearParameters() {
+ assertSyntaxError(
+ "Expecting bad weight",
+ "weight must be in",
+ () ->
+ getRankQParser(
+ params(
+ FIELD, "rank_1",
+ FUNCTION, "linear",
+ WEIGHT, "0"),
+ req())
+ .parse());
+ }
+
public void testBadLogParameters() {
assertSyntaxError(
"Expecting bad weight",
@@ -208,6 +222,36 @@ public class RankQParserPluginTest extends SolrTestCaseJ4 {
.parse());
}
+ public void testParseLinear() throws IOException, SyntaxError {
+ assertValidRankQuery(
+ expectedFeatureQueryToString("rank_1", expectedLinearToString(), 1),
+ params(
+ FIELD, "rank_1",
+ FUNCTION, "linear",
+ WEIGHT, "1"));
+
+ assertValidRankQuery(
+ expectedFeatureQueryToString("rank_1", expectedLinearToString(), 1),
+ params(
+ FIELD, "rank_1",
+ FUNCTION, "linear",
+ WEIGHT, "1"));
+
+ assertValidRankQuery(
+ expectedFeatureQueryToString("rank_1", expectedLinearToString(), 2.5f),
+ params(
+ FIELD, "rank_1",
+ FUNCTION, "linear",
+ WEIGHT, "2.5"));
+
+ assertValidRankQuery(
+ expectedFeatureQueryToString("rank_1", expectedLinearToString(), 2.5f),
+ params(
+ FIELD, "rank_1",
+ FUNCTION, "Linear", // use different case
+ WEIGHT, "2.5"));
+ }
+
public void testParseLog() throws IOException, SyntaxError {
assertValidRankQuery(
expectedFeatureQueryToString("rank_1", expectedLogToString(1), 1),
@@ -330,6 +374,10 @@ public class RankQParserPluginTest extends SolrTestCaseJ4 {
return "(" + featureQueryStr + ")^" + boost;
}
+ private String expectedLinearToString() {
+ return "LinearFunction";
+ }
+
private String expectedLogToString(float scalingFactor) {
return "LogFunction(scalingFactor=" + scalingFactor + ")";
}