diff options
author | Bjørn Christian Seime <bjorncs@vespa.ai> | 2024-05-06 11:25:02 +0200 |
---|---|---|
committer | Bjørn Christian Seime <bjorncs@vespa.ai> | 2024-05-06 11:25:02 +0200 |
commit | 633782b31fed623d6d2f2a48d8bebbc5b9840be0 (patch) | |
tree | d8d129174c76a5a9bc038c11dec103ea9b5a7ad8 /container-search | |
parent | 2f4511677d4da29e615f3543fd167d4bbce8588e (diff) |
Configure signficance searcher through `SchemaInfo`
Diffstat (limited to 'container-search')
6 files changed, 48 insertions, 31 deletions
diff --git a/container-search/abi-spec.json b/container-search/abi-spec.json index d85f1844b18..1c6c773afd9 100644 --- a/container-search/abi-spec.json +++ b/container-search/abi-spec.json @@ -8539,6 +8539,7 @@ "public com.yahoo.search.schema.RankProfile$Builder setHasSummaryFeatures(boolean)", "public com.yahoo.search.schema.RankProfile$Builder setHasRankFeatures(boolean)", "public com.yahoo.search.schema.RankProfile$Builder addInput(java.lang.String, com.yahoo.search.schema.RankProfile$InputType)", + "public com.yahoo.search.schema.RankProfile$Builder setUseSignificanceModel(boolean)", "public com.yahoo.search.schema.RankProfile build()" ], "fields" : [ ] @@ -8573,6 +8574,7 @@ "public com.yahoo.search.schema.Schema schema()", "public boolean hasSummaryFeatures()", "public boolean hasRankFeatures()", + "public boolean useSignificanceModel()", "public java.util.Map inputs()", "public boolean equals(java.lang.Object)", "public int hashCode()", diff --git a/container-search/src/main/java/com/yahoo/search/schema/RankProfile.java b/container-search/src/main/java/com/yahoo/search/schema/RankProfile.java index a5b8d328a7a..9583e9885e7 100644 --- a/container-search/src/main/java/com/yahoo/search/schema/RankProfile.java +++ b/container-search/src/main/java/com/yahoo/search/schema/RankProfile.java @@ -36,6 +36,7 @@ public class RankProfile { private final String name; private final boolean hasSummaryFeatures; private final boolean hasRankFeatures; + private final boolean useSignificanceModel; private final Map<String, InputType> inputs; // Assigned when this is added to a schema @@ -45,6 +46,7 @@ public class RankProfile { this.name = builder.name; this.hasSummaryFeatures = builder.hasSummaryFeatures; this.hasRankFeatures = builder.hasRankFeatures; + this.useSignificanceModel = builder.useSignificanceModel; this.inputs = Collections.unmodifiableMap(builder.inputs); } @@ -66,6 +68,9 @@ public class RankProfile { /** Returns true if this rank profile has rank features. */ public boolean hasRankFeatures() { return hasRankFeatures; } + /** Returns true if this rank profile should use significance models. */ + public boolean useSignificanceModel() { return useSignificanceModel; } + /** Returns the inputs explicitly declared in this rank profile. */ public Map<String, InputType> inputs() { return inputs; } @@ -76,13 +81,14 @@ public class RankProfile { if ( ! other.name.equals(this.name)) return false; if ( other.hasSummaryFeatures != this.hasSummaryFeatures) return false; if ( other.hasRankFeatures != this.hasRankFeatures) return false; + if ( other.useSignificanceModel != this.useSignificanceModel) return false; if ( ! other.inputs.equals(this.inputs)) return false; return true; } @Override public int hashCode() { - return Objects.hash(name, hasSummaryFeatures, hasRankFeatures, inputs); + return Objects.hash(name, hasSummaryFeatures, hasRankFeatures, useSignificanceModel, inputs); } @Override @@ -95,6 +101,7 @@ public class RankProfile { private final String name; private boolean hasSummaryFeatures = true; private boolean hasRankFeatures = true; + private boolean useSignificanceModel = false; private final Map<String, InputType> inputs = new LinkedHashMap<>(); public Builder(String name) { @@ -116,6 +123,8 @@ public class RankProfile { return this; } + public Builder setUseSignificanceModel(boolean use) { this.useSignificanceModel = use; return this; } + public RankProfile build() { return new RankProfile(this); } 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 6cef576f967..d2e48538eee 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 @@ -15,11 +15,17 @@ 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.schema.RankProfile; +import com.yahoo.search.schema.Schema; +import com.yahoo.search.schema.SchemaInfo; import com.yahoo.search.searchchain.Execution; import com.yahoo.vespa.config.search.RankProfilesConfig; +import java.util.Collection; import java.util.HashMap; +import java.util.Objects; import java.util.Optional; +import java.util.logging.Logger; import static com.yahoo.prelude.querytransform.StemmingSearcher.STEMMING; @@ -34,30 +40,34 @@ import static com.yahoo.prelude.querytransform.StemmingSearcher.STEMMING; 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<>(); + private static final Logger log = Logger.getLogger(SignificanceSearcher.class.getName()); + private final SignificanceModelRegistry significanceModelRegistry; + private final SchemaInfo schemaInfo; @Inject - public SignificanceSearcher(SignificanceModelRegistry significanceModelRegistry, RankProfilesConfig rankProfilesConfig) { + public SignificanceSearcher(SignificanceModelRegistry significanceModelRegistry, SchemaInfo schemaInfo) { 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())); - } - } - } + this.schemaInfo = schemaInfo; } @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); + var rankProfileName = query.getRanking().getProfile(); + var schemas = schemaInfo.newSession(query).schemas(); + var useSignficanceConfiguration = schemas.stream() + .map(schema -> schema.rankProfiles().get(rankProfileName)) + .filter(Objects::nonNull) + .map(RankProfile::useSignificanceModel) + .distinct().toList(); + if (useSignficanceConfiguration.size() != 1) { + log.fine(() -> "Inconsistent 'signficance.use-model' configuration for rank profile '%s' for schemas %s. Fallback to disabled" + .formatted(rankProfileName, schemas.stream().map(Schema::name).toList())); + return execution.search(query); + } + + if (!useSignficanceConfiguration.get(0)) return execution.search(query); Language language = query.getModel().getParsingLanguage(); Optional<SignificanceModel> model = significanceModelRegistry.getModel(language); diff --git a/container-search/src/main/resources/configdefinitions/container.search.schema-info.def b/container-search/src/main/resources/configdefinitions/container.search.schema-info.def index 989fbb16973..086b47f5ae5 100644 --- a/container-search/src/main/resources/configdefinitions/container.search.schema-info.def +++ b/container-search/src/main/resources/configdefinitions/container.search.schema-info.def @@ -28,6 +28,7 @@ schema[].summaryclass[].fields[].dynamic bool default=false schema[].rankprofile[].name string schema[].rankprofile[].hasSummaryFeatures bool default=true schema[].rankprofile[].hasRankFeatures bool default=true +schema[].rankprofile[].significance.useModel bool default=false # The name of an input (query rank feature) accepted by this profile schema[].rankprofile[].input[].name string # The tensor type of an input (query rank feature) accepted by this profile 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 ed67798b4b1..abda1df473f 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 @@ -11,6 +11,10 @@ import com.yahoo.prelude.query.AndItem; import com.yahoo.prelude.query.WordItem; import com.yahoo.search.Query; import com.yahoo.search.Result; +import com.yahoo.search.schema.DocumentSummary; +import com.yahoo.search.schema.RankProfile; +import com.yahoo.search.schema.Schema; +import com.yahoo.search.schema.SchemaInfo; import com.yahoo.search.searchchain.Execution; import com.yahoo.search.significance.SignificanceSearcher; import com.yahoo.vespa.config.search.RankProfilesConfig; @@ -33,24 +37,18 @@ 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()); - + var schema = new Schema.Builder("music") + .add(new DocumentSummary.Builder("default").build()) + .add(new RankProfile.Builder("significance-ranking") + .setUseSignificanceModel(true) + .build()); significanceModelRegistry = new DefaultSignificanceModelRegistry(models); - 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); + searcher = new SignificanceSearcher(significanceModelRegistry, new SchemaInfo(List.of(schema.build()), List.of())); } private Execution createExecution(SignificanceSearcher searcher) { 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 deleted file mode 100644 index 1dc1be62862..00000000000 --- a/container-search/src/test/resources/config/with_significance/rank-profiles.cfg +++ /dev/null @@ -1,3 +0,0 @@ -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 |