aboutsummaryrefslogtreecommitdiffstats
path: root/container-search
diff options
context:
space:
mode:
authorArne Juul <arnej@yahooinc.com>2023-05-11 11:31:14 +0000
committerArne Juul <arnej@yahooinc.com>2023-05-11 12:34:35 +0000
commit47b370c90715a15939474951fbdb6fad987073e9 (patch)
tree1b8fc8756d2e9b5c9c38b7ee4ca8c82a3cd25e28 /container-search
parent5693b9621d9882f0e9a66c7d6441b898cb43f6d9 (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.java28
-rw-r--r--container-search/src/main/java/com/yahoo/search/ranking/RankProfilesEvaluator.java11
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));
}
}
}