aboutsummaryrefslogtreecommitdiffstats
path: root/container-search/src/main/java/com
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/src/main/java/com
parent2f4511677d4da29e615f3543fd167d4bbce8588e (diff)
Configure signficance searcher through `SchemaInfo`
Diffstat (limited to 'container-search/src/main/java/com')
-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
2 files changed, 35 insertions, 16 deletions
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);