aboutsummaryrefslogtreecommitdiffstats
path: root/container-search/src
diff options
context:
space:
mode:
authorMariusArhaug <mariusarhaug@hotmail.com>2024-04-24 13:28:41 +0200
committerMariusArhaug <mariusarhaug@hotmail.com>2024-04-30 14:42:32 +0200
commitad8bfd90c688d39315485b3748fc2d27e38daf7d (patch)
treef5f39714b005c2a1ebaf037bb4d5c65b00ce7e1a /container-search/src
parent0a20132a7a507d15cb51a51e25d2a8081bb6c94f (diff)
Add significance rank profile
Diffstat (limited to 'container-search/src')
-rw-r--r--container-search/src/main/java/com/yahoo/search/query/Ranking.java8
-rw-r--r--container-search/src/main/java/com/yahoo/search/significance/SignificanceSearcher.java20
-rw-r--r--container-search/src/test/java/com/yahoo/search/significance/test/SignificanceSearcherTest.java18
-rw-r--r--container-search/src/test/resources/config/with_significance/rank-profiles.cfg3
4 files changed, 47 insertions, 2 deletions
diff --git a/container-search/src/main/java/com/yahoo/search/query/Ranking.java b/container-search/src/main/java/com/yahoo/search/query/Ranking.java
index b1dd5624d18..a2aed7a7496 100644
--- a/container-search/src/main/java/com/yahoo/search/query/Ranking.java
+++ b/container-search/src/main/java/com/yahoo/search/query/Ranking.java
@@ -113,6 +113,8 @@ public class Ranking implements Cloneable {
private SoftTimeout softTimeout = new SoftTimeout();
+ private boolean useSignificance = false;
+
public Ranking(Query parent) {
this.parent = parent;
this.rankFeatures = new RankFeatures(this);
@@ -217,6 +219,12 @@ public class Ranking implements Cloneable {
/** Returns whether rank features should be dumped with the result of this query, default false */
public boolean getListFeatures() { return listFeatures; }
+ /** Set whether to use significance in ranking */
+ public void setUseSignificance(boolean useSignificance) { this.useSignificance = useSignificance; }
+
+ /** Returns whether to use significance in ranking */
+ public boolean getUseSignificance() { return useSignificance; }
+
/** Returns the match phase rank settings of this. This is never null. */
public MatchPhase getMatchPhase() { return matchPhase; }
diff --git a/container-search/src/main/java/com/yahoo/search/significance/SignificanceSearcher.java b/container-search/src/main/java/com/yahoo/search/significance/SignificanceSearcher.java
index 0a42bf8a259..6cef576f967 100644
--- a/container-search/src/main/java/com/yahoo/search/significance/SignificanceSearcher.java
+++ b/container-search/src/main/java/com/yahoo/search/significance/SignificanceSearcher.java
@@ -14,8 +14,11 @@ import com.yahoo.prelude.query.WordItem;
import com.yahoo.search.Query;
import com.yahoo.search.Result;
import com.yahoo.search.Searcher;
+import com.yahoo.search.query.Ranking;
import com.yahoo.search.searchchain.Execution;
+import com.yahoo.vespa.config.search.RankProfilesConfig;
+import java.util.HashMap;
import java.util.Optional;
import static com.yahoo.prelude.querytransform.StemmingSearcher.STEMMING;
@@ -32,15 +35,30 @@ public class SignificanceSearcher extends Searcher {
public final static String SIGNIFICANCE = "Significance";
private final SignificanceModelRegistry significanceModelRegistry;
+ private final RankProfilesConfig rankProfilesConfig;
+
+ private final HashMap<String, Boolean> useModel = new HashMap<>();
@Inject
- public SignificanceSearcher(SignificanceModelRegistry significanceModelRegistry) {
+ public SignificanceSearcher(SignificanceModelRegistry significanceModelRegistry, RankProfilesConfig rankProfilesConfig) {
this.significanceModelRegistry = significanceModelRegistry;
+ this.rankProfilesConfig = rankProfilesConfig;
+
+ for (RankProfilesConfig.Rankprofile profile : rankProfilesConfig.rankprofile()) {
+ for (RankProfilesConfig.Rankprofile.Fef.Property property : profile.fef().property()) {
+ if (property.name().equals("vespa.significance.use_model")) {
+ useModel.put(profile.name(), Boolean.parseBoolean(property.value()));
+ }
+ }
+ }
}
@Override
public Result search(Query query, Execution execution) {
+ Ranking ranking = query.getRanking();
+ if (!useModel.containsKey(ranking.getProfile()) || !useModel.get(ranking.getProfile())) return execution.search(query);
+
Language language = query.getModel().getParsingLanguage();
Optional<SignificanceModel> model = significanceModelRegistry.getModel(language);
diff --git a/container-search/src/test/java/com/yahoo/search/significance/test/SignificanceSearcherTest.java b/container-search/src/test/java/com/yahoo/search/significance/test/SignificanceSearcherTest.java
index ad39c49bc1b..ed67798b4b1 100644
--- a/container-search/src/test/java/com/yahoo/search/significance/test/SignificanceSearcherTest.java
+++ b/container-search/src/test/java/com/yahoo/search/significance/test/SignificanceSearcherTest.java
@@ -2,6 +2,7 @@
package com.yahoo.search.significance.test;
import com.yahoo.component.chain.Chain;
+import com.yahoo.config.subscription.ConfigGetter;
import com.yahoo.language.Language;
import com.yahoo.language.significance.SignificanceModel;
import com.yahoo.language.significance.SignificanceModelRegistry;
@@ -12,6 +13,7 @@ import com.yahoo.search.Query;
import com.yahoo.search.Result;
import com.yahoo.search.searchchain.Execution;
import com.yahoo.search.significance.SignificanceSearcher;
+import com.yahoo.vespa.config.search.RankProfilesConfig;
import org.junit.jupiter.api.Test;
import java.nio.file.Path;
@@ -31,12 +33,24 @@ public class SignificanceSearcherTest {
SignificanceModelRegistry significanceModelRegistry;
SignificanceSearcher searcher;
+ private static final String CONFIG_DIR = "src/test/resources/config/";
+
public SignificanceSearcherTest() {
List<Path> models = new ArrayList<>();
models.add( Path.of("src/test/java/com/yahoo/search/significance/model/en.json"));
+ RankProfilesConfig rpCfg = readConfig("with_significance");
+
+ assertEquals(1, rpCfg.rankprofile().size());
+
significanceModelRegistry = new DefaultSignificanceModelRegistry(models);
- searcher = new SignificanceSearcher(significanceModelRegistry);
+ searcher = new SignificanceSearcher(significanceModelRegistry, rpCfg);
+ }
+
+ @SuppressWarnings("deprecation")
+ private RankProfilesConfig readConfig(String subDir) {
+ String cfgId = "file:" + CONFIG_DIR + subDir + "/rank-profiles.cfg";
+ return ConfigGetter.getConfig(RankProfilesConfig.class, cfgId);
}
private Execution createExecution(SignificanceSearcher searcher) {
@@ -51,6 +65,7 @@ public class SignificanceSearcherTest {
void testSignificanceValueOnSimpleQuery() {
Query q = new Query();
+ q.getRanking().setProfile("significance-ranking");
AndItem root = new AndItem();
WordItem tmp;
tmp = new WordItem("Hello", true);
@@ -81,6 +96,7 @@ public class SignificanceSearcherTest {
@Test
void testSignificanceValueOnRecursiveQuery() {
Query q = new Query();
+ q.getRanking().setProfile("significance-ranking");
AndItem root = new AndItem();
WordItem child1 = new WordItem("hello", true);
diff --git a/container-search/src/test/resources/config/with_significance/rank-profiles.cfg b/container-search/src/test/resources/config/with_significance/rank-profiles.cfg
new file mode 100644
index 00000000000..1dc1be62862
--- /dev/null
+++ b/container-search/src/test/resources/config/with_significance/rank-profiles.cfg
@@ -0,0 +1,3 @@
+rankprofile[0].name "significance-ranking"
+rankprofile[0].fef.property[0].name "vespa.significance.use_model"
+rankprofile[0].fef.property[0].value "true" \ No newline at end of file