summaryrefslogtreecommitdiffstats
path: root/container-search
diff options
context:
space:
mode:
authorBjørn Christian Seime <bjorncs@vespa.ai>2024-05-06 11:25:02 +0200
committerBjørn Christian Seime <bjorncs@vespa.ai>2024-05-06 11:25:02 +0200
commit633782b31fed623d6d2f2a48d8bebbc5b9840be0 (patch)
treed8d129174c76a5a9bc038c11dec103ea9b5a7ad8 /container-search
parent2f4511677d4da29e615f3543fd167d4bbce8588e (diff)
Configure signficance searcher through `SchemaInfo`
Diffstat (limited to 'container-search')
-rw-r--r--container-search/abi-spec.json2
-rw-r--r--container-search/src/main/java/com/yahoo/search/schema/RankProfile.java11
-rw-r--r--container-search/src/main/java/com/yahoo/search/significance/SignificanceSearcher.java40
-rw-r--r--container-search/src/main/resources/configdefinitions/container.search.schema-info.def1
-rw-r--r--container-search/src/test/java/com/yahoo/search/significance/test/SignificanceSearcherTest.java22
-rw-r--r--container-search/src/test/resources/config/with_significance/rank-profiles.cfg3
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