aboutsummaryrefslogtreecommitdiffstats
path: root/container-search/src/main/java/com/yahoo/search/significance
diff options
context:
space:
mode:
authorMariusArhaug <mariusarhaug@hotmail.com>2024-06-26 13:01:43 +0200
committerMariusArhaug <mariusarhaug@hotmail.com>2024-06-26 13:01:43 +0200
commitccd6b8758dee2aeebcaf4eb8b944de5b0a8c32b7 (patch)
treeefc709d5a9231b7464c56823098bd5820b1513ea /container-search/src/main/java/com/yahoo/search/significance
parent28928d915eeaddc4cd1de7a94a285e467d473d74 (diff)
Handle implicit/explicit set languages for significance searcher
Diffstat (limited to 'container-search/src/main/java/com/yahoo/search/significance')
-rw-r--r--container-search/src/main/java/com/yahoo/search/significance/SignificanceSearcher.java59
1 files changed, 52 insertions, 7 deletions
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 3f72e98f18a..8ba8f747019 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,6 +14,7 @@ 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.Significance;
import com.yahoo.search.result.ErrorMessage;
import com.yahoo.search.schema.RankProfile;
import com.yahoo.search.schema.Schema;
@@ -95,16 +96,60 @@ public class SignificanceSearcher extends Searcher {
}
private Result calculateAndSetSignificance(Query query, Execution execution) {
- Language language = query.getModel().getParsingLanguage();
- Optional<SignificanceModel> model = significanceModelRegistry.getModel(language);
- log.log(Level.FINE, () -> "Got model for language %s: %s"
- .formatted(language, model.map(SignificanceModel::getId).orElse("<none>")));
+ try {
+ var significanceModel = getSignificanceModelFromQueryLanguage(query);
+ log.log(Level.FINE, () -> "Got model for language %s: %s"
+ .formatted(query.getModel().getParsingLanguage(), significanceModel.getId()));
- if (model.isEmpty()) return execution.search(query);
+ setIDF(query.getModel().getQueryTree().getRoot(), significanceModel);
- setIDF(query.getModel().getQueryTree().getRoot(), model.get());
+ return execution.search(query);
+ } catch (IllegalArgumentException e) {
+ var result = new Result(query);
+ result.hits().addError(
+ ErrorMessage.createIllegalQuery(e.getMessage()));
+ return result;
+ }
+ }
+
+ private SignificanceModel getSignificanceModelFromQueryLanguage(Query query) throws IllegalArgumentException {
+ Language explicitLanguage = query.getModel().getLanguage();
+ Language implicitLanguage = query.getModel().getParsingLanguage();
+
+ if (explicitLanguage == null && implicitLanguage == null) {
+ throw new IllegalArgumentException("No language found in query");
+ }
+
+ if (explicitLanguage != null) {
+ if (explicitLanguage == Language.UNKNOWN) {
+ return handleFallBackToUnknownLanguage();
+ }
+ var model = significanceModelRegistry.getModel(explicitLanguage);
+ if (model.isEmpty()) {
+ throw new IllegalArgumentException("No significance model available for set language " + explicitLanguage);
+ }
+ return model.get();
+ }
+
+ if (implicitLanguage == Language.UNKNOWN) {
+ return handleFallBackToUnknownLanguage();
+ }
+ var model = significanceModelRegistry.getModel(implicitLanguage);
+ if (model.isEmpty()) {
+ throw new IllegalArgumentException("No significance model available for implicit language " + implicitLanguage);
+ }
+ return model.get();
+ }
+
+ private SignificanceModel handleFallBackToUnknownLanguage() throws IllegalArgumentException {
+ var unknownModel = significanceModelRegistry.getModel(Language.UNKNOWN);
+ var englishModel = significanceModelRegistry.getModel(Language.ENGLISH);
+
+ if (unknownModel.isEmpty() && englishModel.isEmpty()) {
+ throw new IllegalArgumentException("No significance model available for unknown or english language");
+ }
- return execution.search(query);
+ return unknownModel.orElseGet(englishModel::get);
}
private void setIDF(Item root, SignificanceModel significanceModel) {