From 69ca57e0cbf0bd6f6f58e9477ac240c0bc5e3533 Mon Sep 17 00:00:00 2001 From: Jon Bratseth Date: Fri, 27 Jan 2023 16:14:25 +0100 Subject: Keep synthetic fields --- .../java/com/yahoo/search/yql/FieldFilter.java | 13 +++++--- .../com/yahoo/search/yql/FieldFilterTestCase.java | 38 +++++++++++++--------- 2 files changed, 31 insertions(+), 20 deletions(-) (limited to 'container-search') diff --git a/container-search/src/main/java/com/yahoo/search/yql/FieldFilter.java b/container-search/src/main/java/com/yahoo/search/yql/FieldFilter.java index d5603ff0171..8cc6a1b42b9 100644 --- a/container-search/src/main/java/com/yahoo/search/yql/FieldFilter.java +++ b/container-search/src/main/java/com/yahoo/search/yql/FieldFilter.java @@ -29,6 +29,9 @@ public class FieldFilter extends Searcher { public static final CompoundName FIELD_FILTER_DISABLE = new CompoundName("FieldFilter.disable"); + /** Fields that should be kept even if not explicitly requested */ + private static final Set syntheticFields = Set.of("matchfeatures", "rankfeatures", "summaryfeatures"); + @Override public Result search(Query query, Execution execution) { Result result = execution.search(query); @@ -43,16 +46,18 @@ public class FieldFilter extends Searcher { } private void filter(Result result) { - Set requestedFields; - if (result.getQuery().properties().getBoolean(FIELD_FILTER_DISABLE)) return; if (result.getQuery().getPresentation().getSummaryFields().isEmpty()) return; - requestedFields = result.getQuery().getPresentation().getSummaryFields(); for (Iterator i = result.hits().unorderedDeepIterator(); i.hasNext();) { Hit h = i.next(); if (h.isMeta()) continue; - h.fieldKeys().retainAll(requestedFields); + for (var fields = h.fieldIterator(); fields.hasNext(); ) { + var field = fields.next(); + if ( ! result.getQuery().getPresentation().getSummaryFields().contains(field.getKey()) && + ! syntheticFields.contains(field.getKey())) + fields.remove(); + } } } diff --git a/container-search/src/test/java/com/yahoo/search/yql/FieldFilterTestCase.java b/container-search/src/test/java/com/yahoo/search/yql/FieldFilterTestCase.java index 3d4f52472a8..8b5892903de 100644 --- a/container-search/src/test/java/com/yahoo/search/yql/FieldFilterTestCase.java +++ b/container-search/src/test/java/com/yahoo/search/yql/FieldFilterTestCase.java @@ -15,6 +15,8 @@ import com.yahoo.search.result.Hit; import com.yahoo.search.searchchain.Execution; import com.yahoo.search.searchchain.testutil.DocumentSourceSearcher; +import java.util.Set; + /** * Smoketest that we remove fields in a sane manner. * @@ -25,6 +27,7 @@ public class FieldFilterTestCase { private static final String FIELD_C = "c"; private static final String FIELD_B = "b"; private static final String FIELD_A = "a"; + private static final Set syntheticFields = Set.of("matchfeatures", "rankfeatures", "summaryfeatures"); private Chain searchChain; private Execution.Context context; private Execution execution; @@ -34,8 +37,8 @@ public class FieldFilterTestCase { Query query = new Query("?query=test"); Result result = new Result(query); - Hit hit = createHit("lastHit", .1d, FIELD_A, FIELD_B, FIELD_C); - result.hits().add(hit); + result.hits().add(createHit("hit1", .1d, false, FIELD_A, FIELD_B, FIELD_C)); + result.hits().add(createHit("hit2", .1d, true, FIELD_A, FIELD_B, FIELD_C)); DocumentSourceSearcher mockBackend = new DocumentSourceSearcher(); mockBackend.addResult(query, result); @@ -46,12 +49,15 @@ public class FieldFilterTestCase { } - private Hit createHit(String id, double relevancy, String... fieldNames) { + private Hit createHit(String id, double relevancy, boolean addSyntheticFields, String... fieldNames) { Hit h = new Hit(id, relevancy); h.setFillable(); int i = 0; - for (String field : fieldNames) { + for (String field : fieldNames) h.setField(field, ++i); + if (addSyntheticFields) { + for (String field : syntheticFields) + h.setField(field, ++i); } return h; } @@ -64,25 +70,25 @@ public class FieldFilterTestCase { } @Test - final void testBasic() { - final Query query = new Query("?query=test&presentation.summaryFields=" + FIELD_B); + void testBasic() { + Query query = new Query("?query=test&presentation.summaryFields=" + FIELD_B); Result result = execution.search(query); execution.fill(result); - assertEquals(1, result.getConcreteHitCount()); - assertFalse(result.hits().get(0).fieldKeys().contains(FIELD_A)); - assertTrue(result.hits().get(0).fieldKeys().contains(FIELD_B)); - assertFalse(result.hits().get(0).fieldKeys().contains(FIELD_C)); + assertEquals(2, result.getConcreteHitCount()); + assertEquals(Set.of(FIELD_B), result.hits().get(0).fieldKeys()); + assertEquals(Set.of(FIELD_B, "matchfeatures", "rankfeatures", "summaryfeatures"), + result.hits().get(1).fieldKeys()); } @Test - final void testNoFiltering() { - final Query query = new Query("?query=test"); + void testNoFiltering() { + Query query = new Query("?query=test"); Result result = execution.search(query); execution.fill(result); - assertEquals(1, result.getConcreteHitCount()); - assertTrue(result.hits().get(0).fieldKeys().contains(FIELD_A)); - assertTrue(result.hits().get(0).fieldKeys().contains(FIELD_B)); - assertTrue(result.hits().get(0).fieldKeys().contains(FIELD_C)); + assertEquals(2, result.getConcreteHitCount()); + assertEquals(Set.of(FIELD_A, FIELD_B, FIELD_C), result.hits().get(0).fieldKeys()); + assertEquals(Set.of(FIELD_A, FIELD_B, FIELD_C, "matchfeatures", "rankfeatures", "summaryfeatures"), + result.hits().get(1).fieldKeys()); } } -- cgit v1.2.3