diff options
author | Arne Juul <arnej@yahooinc.com> | 2023-05-11 11:31:14 +0000 |
---|---|---|
committer | Arne Juul <arnej@yahooinc.com> | 2023-05-11 12:34:35 +0000 |
commit | 47b370c90715a15939474951fbdb6fad987073e9 (patch) | |
tree | 1b8fc8756d2e9b5c9c38b7ee4ca8c82a3cd25e28 /container-search | |
parent | 5693b9621d9882f0e9a66c7d6441b898cb43f6d9 (diff) |
add filtering to hide implicitly added match features
Diffstat (limited to 'container-search')
-rw-r--r-- | container-search/src/main/java/com/yahoo/search/ranking/GlobalPhaseRanker.java | 28 | ||||
-rw-r--r-- | container-search/src/main/java/com/yahoo/search/ranking/RankProfilesEvaluator.java | 11 |
2 files changed, 37 insertions, 2 deletions
diff --git a/container-search/src/main/java/com/yahoo/search/ranking/GlobalPhaseRanker.java b/container-search/src/main/java/com/yahoo/search/ranking/GlobalPhaseRanker.java index dd419d69315..2aa9fd32795 100644 --- a/container-search/src/main/java/com/yahoo/search/ranking/GlobalPhaseRanker.java +++ b/container-search/src/main/java/com/yahoo/search/ranking/GlobalPhaseRanker.java @@ -7,9 +7,15 @@ import com.yahoo.search.Result; import com.yahoo.search.query.Sorting; import com.yahoo.search.ranking.RankProfilesEvaluator.GlobalPhaseData; import com.yahoo.search.result.ErrorMessage; +import com.yahoo.search.result.FeatureData; +import com.yahoo.search.result.Hit; +import com.yahoo.search.result.HitGroup; import com.yahoo.tensor.Tensor; +import com.yahoo.data.access.helpers.MatchFeatureData; +import com.yahoo.data.access.helpers.MatchFeatureFilter; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.Optional; import java.util.function.Supplier; @@ -57,6 +63,28 @@ public class GlobalPhaseRanker { if (rerankCount < 0) rerankCount = 100; ResultReranker.rerankHits(result, new HitRescorer(supplier), rerankCount); + hideImplicitMatchFeatures(result, data.matchFeaturesToHide()); + } + + private void hideImplicitMatchFeatures(Result result, Collection<String> namesToHide) { + if (namesToHide.size() == 0) return; + var filter = new MatchFeatureFilter(namesToHide); + for (var iterator = result.hits().deepIterator(); iterator.hasNext();) { + Hit hit = iterator.next(); + if (hit.isMeta() || hit instanceof HitGroup) { + continue; + } + if (hit.getField("matchfeatures") instanceof FeatureData matchFeatures) { + if (matchFeatures.inspect() instanceof MatchFeatureData.HitValue hitValue) { + var newValue = hitValue.subsetFilter(filter); + if (newValue.fieldCount() == 0) { + hit.removeField("matchfeatures"); + } else { + hit.setField("matchfeatures", newValue); + } + } + } + } } private Optional<GlobalPhaseData> globalPhaseDataFor(Query query, String schema) { diff --git a/container-search/src/main/java/com/yahoo/search/ranking/RankProfilesEvaluator.java b/container-search/src/main/java/com/yahoo/search/ranking/RankProfilesEvaluator.java index 2ca91a3ea91..a89f0a5c3ea 100644 --- a/container-search/src/main/java/com/yahoo/search/ranking/RankProfilesEvaluator.java +++ b/container-search/src/main/java/com/yahoo/search/ranking/RankProfilesEvaluator.java @@ -14,10 +14,13 @@ import com.yahoo.vespa.config.search.core.OnnxModelsConfig; import com.yahoo.vespa.config.search.core.RankingConstantsConfig; import com.yahoo.vespa.config.search.core.RankingExpressionsConfig; +import java.util.Collection; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.Set; import java.util.function.Supplier; import java.util.logging.Logger; @@ -61,6 +64,7 @@ public class RankProfilesEvaluator extends AbstractComponent { } static record GlobalPhaseData(Supplier<FunctionEvaluator> functionEvaluatorSource, + Collection<String> matchFeaturesToHide, int rerankCount, List<String> needInputs) {} @@ -76,7 +80,7 @@ public class RankProfilesEvaluator extends AbstractComponent { Supplier<FunctionEvaluator> functionEvaluatorSource = null; int rerankCount = -1; List<String> needInputs = null; - + Set<String> namesToHide = new HashSet<>(); for (var prop : rp.fef().property()) { if (prop.name().equals("vespa.globalphase.rerankcount")) { rerankCount = Integer.valueOf(prop.value()); @@ -87,9 +91,12 @@ public class RankProfilesEvaluator extends AbstractComponent { var evaluator = functionEvaluatorSource.get(); needInputs = List.copyOf(evaluator.function().arguments()); } + if (prop.name().equals("vespa.hidden.matchfeature")) { + namesToHide.add(prop.value()); + } } if (functionEvaluatorSource != null && needInputs != null) { - profilesWithGlobalPhase.put(name, new GlobalPhaseData(functionEvaluatorSource, rerankCount, needInputs)); + profilesWithGlobalPhase.put(name, new GlobalPhaseData(functionEvaluatorSource, namesToHide, rerankCount, needInputs)); } } } |