diff options
author | Alexey Chernyshev <aleksei@spotify.com> | 2022-04-04 16:23:07 +0200 |
---|---|---|
committer | Alexey Chernyshev <aleksei@spotify.com> | 2022-04-07 14:44:30 +0200 |
commit | 7e9b33401201db9a9e22971dd419247e268bbfaa (patch) | |
tree | f5032a82e9fa74247b2fdeb3dcde4dc6cf98ce89 /container-search/src/main/java/com/yahoo/search/yql | |
parent | ad7cc1d11f0c19baa2344a643377576c559555f7 (diff) |
Propagating annotations for fuzzy query
Diffstat (limited to 'container-search/src/main/java/com/yahoo/search/yql')
-rw-r--r-- | container-search/src/main/java/com/yahoo/search/yql/VespaSerializer.java | 29 | ||||
-rw-r--r-- | container-search/src/main/java/com/yahoo/search/yql/YqlParser.java | 21 |
2 files changed, 48 insertions, 2 deletions
diff --git a/container-search/src/main/java/com/yahoo/search/yql/VespaSerializer.java b/container-search/src/main/java/com/yahoo/search/yql/VespaSerializer.java index e778798b0e5..4b511df5e5f 100644 --- a/container-search/src/main/java/com/yahoo/search/yql/VespaSerializer.java +++ b/container-search/src/main/java/com/yahoo/search/yql/VespaSerializer.java @@ -21,6 +21,7 @@ import static com.yahoo.search.yql.YqlParser.GEO_LOCATION; import static com.yahoo.search.yql.YqlParser.HIT_LIMIT; import static com.yahoo.search.yql.YqlParser.IMPLICIT_TRANSFORMS; import static com.yahoo.search.yql.YqlParser.LABEL; +import static com.yahoo.search.yql.YqlParser.MAX_EDIT_DISTANCE; import static com.yahoo.search.yql.YqlParser.NEAR; import static com.yahoo.search.yql.YqlParser.NEAREST_NEIGHBOR; import static com.yahoo.search.yql.YqlParser.NORMALIZE_CASE; @@ -31,6 +32,7 @@ import static com.yahoo.search.yql.YqlParser.ORIGIN_OFFSET; import static com.yahoo.search.yql.YqlParser.ORIGIN_ORIGINAL; import static com.yahoo.search.yql.YqlParser.PHRASE; import static com.yahoo.search.yql.YqlParser.PREFIX; +import static com.yahoo.search.yql.YqlParser.PREFIX_LENGTH; import static com.yahoo.search.yql.YqlParser.RANGE; import static com.yahoo.search.yql.YqlParser.RANK; import static com.yahoo.search.yql.YqlParser.RANKED; @@ -526,7 +528,8 @@ public class VespaSerializer { @Override boolean serialize(StringBuilder destination, FuzzyItem fuzzy) { - String annotations = leafAnnotations(fuzzy); + String annotations = fuzzyAnnotations(fuzzy); + destination.append(normalizeIndexName(fuzzy.getIndexName())).append(" contains "); if (annotations.length() > 0) { @@ -543,6 +546,30 @@ public class VespaSerializer { } return false; } + + static String fuzzyAnnotations(FuzzyItem fuzzyItem) { + boolean isMaxEditDistanceSet = fuzzyItem.getMaxEditDistance() != FuzzyItem.DefaultMaxEditDistance; + boolean isPrefixLengthSet = fuzzyItem.getPrefixLength() != FuzzyItem.DefaultPrefixLength; + boolean anyAnnotationSet = isMaxEditDistanceSet || isPrefixLengthSet; + + StringBuilder builder = new StringBuilder(); + if (anyAnnotationSet) { + builder.append("[{"); + } + if (isMaxEditDistanceSet) { + builder.append(MAX_EDIT_DISTANCE + ":").append(fuzzyItem.getMaxEditDistance()); + } + if (isMaxEditDistanceSet && isPrefixLengthSet) { + builder.append(","); + } + if (isPrefixLengthSet) { + builder.append(PREFIX_LENGTH + ":").append(fuzzyItem.getPrefixLength()); + } + if (anyAnnotationSet) { + builder.append("}]"); + } + return builder.toString(); + } } private static class ONearSerializer extends Serializer<ONearItem> { diff --git a/container-search/src/main/java/com/yahoo/search/yql/YqlParser.java b/container-search/src/main/java/com/yahoo/search/yql/YqlParser.java index 06ee0e706f3..fcb19dde10d 100644 --- a/container-search/src/main/java/com/yahoo/search/yql/YqlParser.java +++ b/container-search/src/main/java/com/yahoo/search/yql/YqlParser.java @@ -126,6 +126,8 @@ public class YqlParser implements Parser { private static final String RANKED_DESCRIPTION = "setting for whether to use term for ranking"; private static final String STEM_DESCRIPTION = "setting for whether to use stem if field implies it"; private static final String USE_POSITION_DATA_DESCRIPTION = "setting for whether to use position data for ranking this item"; + private static final String MAX_EDIT_DISTANCE_DESCRIPTION = "setting for an inclusive upper bound for a fuzzy edit-distance search"; + private static final String PREFIX_LENGTH_DESCRIPTION = "setting for a prefix length that is considered frozen for a fuzzy search"; private static final String USER_INPUT_ALLOW_EMPTY = "allowEmpty"; private static final String USER_INPUT_DEFAULT_INDEX = "defaultIndex"; private static final String USER_INPUT_GRAMMAR = "grammar"; @@ -194,6 +196,9 @@ public class YqlParser implements Parser { public static final String WEIGHT = "weight"; public static final String WEIGHTED_SET = "weightedSet"; public static final String FUZZY = "fuzzy"; + public static final String MAX_EDIT_DISTANCE = "maxEditDistance"; + public static final String PREFIX_LENGTH = "prefixLength"; + private final IndexFacts indexFacts; private final List<ConnectedItem> connectedItems = new ArrayList<>(); @@ -1313,7 +1318,21 @@ public class YqlParser implements Parser { String wordData = getStringContents(args.get(0)); - FuzzyItem fuzzy = new FuzzyItem(field, true, wordData); + Integer maxEditDistance = getAnnotation( + ast, + MAX_EDIT_DISTANCE, + Integer.class, + FuzzyItem.DefaultMaxEditDistance, + MAX_EDIT_DISTANCE_DESCRIPTION); + + Integer prefixLength = getAnnotation( + ast, + PREFIX_LENGTH, + Integer.class, + FuzzyItem.DefaultPrefixLength, + PREFIX_LENGTH_DESCRIPTION); + + FuzzyItem fuzzy = new FuzzyItem(field, true, wordData, maxEditDistance, prefixLength); return leafStyleSettings(ast, fuzzy); } |