diff options
author | MariusArhaug <mariusarhaug@hotmail.com> | 2024-04-24 13:28:41 +0200 |
---|---|---|
committer | MariusArhaug <mariusarhaug@hotmail.com> | 2024-04-30 14:42:32 +0200 |
commit | ad8bfd90c688d39315485b3748fc2d27e38daf7d (patch) | |
tree | f5f39714b005c2a1ebaf037bb4d5c65b00ce7e1a /container-search/src | |
parent | 0a20132a7a507d15cb51a51e25d2a8081bb6c94f (diff) |
Add significance rank profile
Diffstat (limited to 'container-search/src')
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 |