Skip to content

Commit 9cfdaa5

Browse files
committed
Fix errors in fuzziness / boosting
1 parent 6c9d17d commit 9cfdaa5

File tree

3 files changed

+22
-9
lines changed

3 files changed

+22
-9
lines changed

x-pack/plugin/esql-core/src/main/java/org/elasticsearch/xpack/esql/core/expression/Expression.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,6 @@ public TypeResolution and(TypeResolution other) {
6565
return failed ? this : other;
6666
}
6767

68-
public TypeResolution or(TypeResolution other) {
69-
return resolved() ? this : other;
70-
}
71-
7268
public TypeResolution and(Supplier<TypeResolution> other) {
7369
return failed ? this : other.get();
7470
}

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/expression/function/fulltext/Match.java

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
package org.elasticsearch.xpack.esql.expression.function.fulltext;
99

10+
import org.apache.lucene.util.BytesRef;
1011
import org.elasticsearch.ElasticsearchParseException;
1112
import org.elasticsearch.TransportVersions;
1213
import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
@@ -23,6 +24,7 @@
2324
import org.elasticsearch.xpack.esql.core.tree.NodeInfo;
2425
import org.elasticsearch.xpack.esql.core.tree.Source;
2526
import org.elasticsearch.xpack.esql.core.type.DataType;
27+
import org.elasticsearch.xpack.esql.core.type.DataTypeConverter;
2628
import org.elasticsearch.xpack.esql.expression.function.Example;
2729
import org.elasticsearch.xpack.esql.expression.function.FunctionInfo;
2830
import org.elasticsearch.xpack.esql.expression.function.Param;
@@ -33,6 +35,7 @@
3335
import java.util.ArrayList;
3436
import java.util.List;
3537

38+
import static org.elasticsearch.common.logging.LoggerMessageFormat.format;
3639
import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.ParamOrdinal.FIRST;
3740
import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.ParamOrdinal.FOURTH;
3841
import static org.elasticsearch.xpack.esql.core.expression.TypeResolutions.ParamOrdinal.SECOND;
@@ -143,14 +146,14 @@ protected TypeResolution resolveNonQueryParamTypes() {
143146
.and(super.resolveNonQueryParamTypes());
144147
if (boost != null) {
145148
typeResolution = typeResolution.and(
146-
isNotNull(boost, sourceText(), THIRD).and(isNumeric(field, sourceText(), THIRD).and(isFoldable(field, sourceText(), THIRD)))
149+
isNotNull(boost, sourceText(), THIRD).and(isNumeric(boost, sourceText(), THIRD).and(isFoldable(boost, sourceText(), THIRD)))
147150
);
148151
}
149152
if (fuzziness != null) {
150153
typeResolution = typeResolution.and(
151154
isNotNull(fuzziness, sourceText(), FOURTH).and(
152-
isType(fuzziness, dt -> dt == DataType.INTEGER, sourceText(), FOURTH, "integer,keyword").or(
153-
isString(fuzziness, sourceText(), FOURTH).and(isFoldable(fuzziness, sourceText(), FOURTH))
155+
isType(fuzziness, dt -> dt == DataType.INTEGER || dt == DataType.KEYWORD, sourceText(), FOURTH, "integer,keyword").and(
156+
isFoldable(fuzziness, sourceText(), FOURTH)
154157
)
155158
)
156159
);
@@ -206,14 +209,24 @@ public Double boost() {
206209
if (boost == null) {
207210
return null;
208211
}
209-
return (Double) boost.fold();
212+
return (Double) DataTypeConverter.convert(boost.fold(), DataType.DOUBLE);
210213
}
211214

212215
public Fuzziness fuzziness() {
213216
if (fuzziness == null) {
214217
return null;
215218
}
216-
return Fuzziness.fromString(fuzziness.fold().toString());
219+
220+
Object fuzinessAsObject = fuzziness.fold();
221+
if (fuzinessAsObject instanceof BytesRef bytesRefValue) {
222+
return Fuzziness.fromString(bytesRefValue.utf8ToString());
223+
} else if (fuzinessAsObject instanceof Integer intValue) {
224+
return Fuzziness.fromEdits(intValue);
225+
}
226+
227+
throw new IllegalArgumentException(
228+
format(null, "{} argument in {} {} needs to be resolved to a string or integer", THIRD, functionName(), functionType())
229+
);
217230
}
218231

219232
@Override

x-pack/plugin/esql/src/main/java/org/elasticsearch/xpack/esql/parser/ExpressionBuilder.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -925,6 +925,10 @@ String unresolvedAttributeNameInParam(ParserRuleContext ctx, Expression param) {
925925
public Expression visitMatchBooleanExpression(EsqlBaseParser.MatchBooleanExpressionContext ctx) {
926926
Expression boostExp = visitBoostExpression(ctx.boostExpression());
927927
Expression fuzzinessExp = visitFuzzinessExpression(ctx.fuzzinessExpression());
928+
// If fuzziness is set, but boost is not, set boost to 1 to fill the optional parameter
929+
if (fuzzinessExp != null && boostExp == null) {
930+
boostExp = new Literal(source(ctx), 1, DataType.INTEGER);
931+
}
928932
return Match.operator(source(ctx), expression(ctx.fieldExp), expression(ctx.queryString), boostExp, fuzzinessExp);
929933
}
930934

0 commit comments

Comments
 (0)