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

Reply via email to