diff options
author | Geir Storli <geirst@verizonmedia.com> | 2020-07-10 13:22:17 +0000 |
---|---|---|
committer | Geir Storli <geirst@verizonmedia.com> | 2020-07-10 13:22:17 +0000 |
commit | 9d811fc606ca5aa2a18a3e5ebb30313f15aff10a (patch) | |
tree | 057b4d7251c93e22ddcb51c3df4c5e5461fb4136 | |
parent | 437d046dc3cb3bff64227008a054234fe44ff451 (diff) |
Support matched-elements-only for array and wset fields in streaming search.
4 files changed, 15 insertions, 8 deletions
diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/processing/MatchedElementsOnlyResolver.java b/config-model/src/main/java/com/yahoo/searchdefinition/processing/MatchedElementsOnlyResolver.java index d86ed265b77..77064038053 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/processing/MatchedElementsOnlyResolver.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/processing/MatchedElementsOnlyResolver.java @@ -48,11 +48,13 @@ public class MatchedElementsOnlyResolver extends Processor { if (isComplexFieldWithOnlyStructFieldAttributes(sourceField)) { field.setTransform(SummaryTransform.MATCHED_ATTRIBUTE_ELEMENTS_FILTER); } - } else if (isSupportedAttributeField(sourceField)) { - field.setTransform(SummaryTransform.MATCHED_ATTRIBUTE_ELEMENTS_FILTER); + } else if (isSupportedMultiValueField(sourceField)) { + if (sourceField.doesAttributing()) { + field.setTransform(SummaryTransform.MATCHED_ATTRIBUTE_ELEMENTS_FILTER); + } } else if (validate) { fail(summary, field, "'matched-elements-only' is not supported for this field type. " + - "Supported field types are: array attribute, weighted set attribute, " + + "Supported field types are: array of primitive, weighted set of primitive, " + "array of simple struct, map of primitive type to simple struct, " + "and map of primitive type to primitive type"); } @@ -60,10 +62,9 @@ public class MatchedElementsOnlyResolver extends Processor { // else case is handled in SummaryFieldsMustHaveValidSource } - private boolean isSupportedAttributeField(ImmutableSDField sourceField) { + private boolean isSupportedMultiValueField(ImmutableSDField sourceField) { var type = sourceField.getDataType(); - return sourceField.doesAttributing() && - (isArrayOfPrimitiveType(type) || isWeightedsetOfPrimitiveType(type)); + return (isArrayOfPrimitiveType(type) || isWeightedsetOfPrimitiveType(type)); } private boolean isArrayOfPrimitiveType(DataType type) { diff --git a/config-model/src/test/java/com/yahoo/searchdefinition/processing/MatchedElementsOnlyResolverTestCase.java b/config-model/src/test/java/com/yahoo/searchdefinition/processing/MatchedElementsOnlyResolverTestCase.java index 0ef696df6cf..ab98706fd44 100644 --- a/config-model/src/test/java/com/yahoo/searchdefinition/processing/MatchedElementsOnlyResolverTestCase.java +++ b/config-model/src/test/java/com/yahoo/searchdefinition/processing/MatchedElementsOnlyResolverTestCase.java @@ -149,10 +149,10 @@ public class MatchedElementsOnlyResolverTestCase { exceptionRule.expect(IllegalArgumentException.class); exceptionRule.expectMessage("For search 'test', document summary 'default', summary field 'my_field': " + "'matched-elements-only' is not supported for this field type. " + - "Supported field types are: array attribute, weighted set attribute, " + + "Supported field types are: array of primitive, weighted set of primitive, " + "array of simple struct, map of primitive type to simple struct, " + "and map of primitive type to primitive type"); - buildSearch(joinLines("field my_field type array<string> {", + buildSearch(joinLines("field my_field type string {", " indexing: summary", " summary: matched-elements-only", "}")); diff --git a/streamingvisitors/src/vespa/searchvisitor/matching_elements_filler.cpp b/streamingvisitors/src/vespa/searchvisitor/matching_elements_filler.cpp index fe717313ca4..d51bd57e942 100644 --- a/streamingvisitors/src/vespa/searchvisitor/matching_elements_filler.cpp +++ b/streamingvisitors/src/vespa/searchvisitor/matching_elements_filler.cpp @@ -83,6 +83,9 @@ Matcher::select_query_nodes(const MatchingElementsFields& fields, const QueryNod if (fields.has_struct_field(query_term->getIndex())) { _sub_field_terms.emplace_back(fields.get_enclosing_field(query_term->getIndex()), query_term); } + if (fields.has_field(query_term->getIndex())) { + _sub_field_terms.emplace_back(query_term->getIndex(), query_term); + } } else if (auto and_not = as<AndNotQueryNode>(query_node)) { select_query_nodes(fields, *(*and_not)[0]); } else if (auto intermediate = as<QueryConnector>(query_node)) { diff --git a/vsm/src/vespa/vsm/vsm/docsumconfig.cpp b/vsm/src/vespa/vsm/vsm/docsumconfig.cpp index 2512bea26df..fb25df83ded 100644 --- a/vsm/src/vespa/vsm/vsm/docsumconfig.cpp +++ b/vsm/src/vespa/vsm/vsm/docsumconfig.cpp @@ -26,6 +26,9 @@ void populate_fields(MatchingElementsFields& fields, VsmfieldsConfig& fields_con if (spec.name.substr(0, prefix.size()) == prefix) { fields.add_mapping(field_name, spec.name); } + if (spec.name == field_name) { + fields.add_field(field_name); + } } } |