diff --git a/docs/changelog/135776.yaml b/docs/changelog/135776.yaml new file mode 100644 index 0000000000000..76b10d7d311e5 --- /dev/null +++ b/docs/changelog/135776.yaml @@ -0,0 +1,6 @@ +pr: 135776 +summary: Fix KQL case-sensitivity for keyword fields in ES|QL +area: Search +type: bug +issues: + - 135772 diff --git a/x-pack/plugin/kql/src/main/java/org/elasticsearch/xpack/kql/query/KqlQueryBuilder.java b/x-pack/plugin/kql/src/main/java/org/elasticsearch/xpack/kql/query/KqlQueryBuilder.java index a77e1453e66ca..3bde135d15cab 100644 --- a/x-pack/plugin/kql/src/main/java/org/elasticsearch/xpack/kql/query/KqlQueryBuilder.java +++ b/x-pack/plugin/kql/src/main/java/org/elasticsearch/xpack/kql/query/KqlQueryBuilder.java @@ -71,7 +71,7 @@ public class KqlQueryBuilder extends AbstractQueryBuilder { } private final String query; - private boolean caseInsensitive = true; + private boolean caseInsensitive = false; private ZoneId timeZone; private String defaultField; @@ -152,7 +152,7 @@ protected void doXContent(XContentBuilder builder, Params params) throws IOExcep } @Override - protected QueryBuilder doIndexMetadataRewrite(QueryRewriteContext context) throws IOException { + protected QueryBuilder doIndexMetadataRewrite(QueryRewriteContext context) { try { KqlParser parser = new KqlParser(); QueryBuilder rewrittenQuery = parser.parseKqlQuery(query, createKqlParserContext(context)); diff --git a/x-pack/plugin/kql/src/test/java/org/elasticsearch/xpack/kql/query/KqlQueryBuilderTests.java b/x-pack/plugin/kql/src/test/java/org/elasticsearch/xpack/kql/query/KqlQueryBuilderTests.java index 2643e95df8946..53020ddbb426f 100644 --- a/x-pack/plugin/kql/src/test/java/org/elasticsearch/xpack/kql/query/KqlQueryBuilderTests.java +++ b/x-pack/plugin/kql/src/test/java/org/elasticsearch/xpack/kql/query/KqlQueryBuilderTests.java @@ -170,7 +170,7 @@ public void testCaseInsensitiveWildcardQuery() throws IOException { for (boolean caseInsensitive : List.of(true, false)) { KqlQueryBuilder kqlQuery = new KqlQueryBuilder(KEYWORD_FIELD_NAME + ": foo*"); // Check case case_insensitive is true by default - assertThat(kqlQuery.caseInsensitive(), equalTo(true)); + assertThat(kqlQuery.caseInsensitive(), equalTo(false)); kqlQuery.caseInsensitive(caseInsensitive); @@ -190,7 +190,7 @@ public void testCaseInsensitiveTermQuery() throws IOException { for (boolean caseInsensitive : List.of(true, false)) { KqlQueryBuilder kqlQuery = new KqlQueryBuilder(KEYWORD_FIELD_NAME + ": foo"); // Check case case_insensitive is true by default - assertThat(kqlQuery.caseInsensitive(), equalTo(true)); + assertThat(kqlQuery.caseInsensitive(), equalTo(false)); kqlQuery.caseInsensitive(caseInsensitive); diff --git a/x-pack/plugin/kql/src/yamlRestTest/resources/rest-api-spec/test/kql/20_kql_match_query.yml b/x-pack/plugin/kql/src/yamlRestTest/resources/rest-api-spec/test/kql/20_kql_match_query.yml index 2e40c73ecf829..8255cd147d950 100644 --- a/x-pack/plugin/kql/src/yamlRestTest/resources/rest-api-spec/test/kql/20_kql_match_query.yml +++ b/x-pack/plugin/kql/src/yamlRestTest/resources/rest-api-spec/test/kql/20_kql_match_query.yml @@ -51,6 +51,17 @@ setup: - match: { hits.total: 1 } - match: { hits.hits.0._id: "doc-1" } + - do: + search: + index: test-index + rest_total_hits_as_int: true + body: > + { + "query": { "kql": { "query": "text_field: Bar" } } + } + - match: { hits.total: 1 } + - match: { hits.hits.0._id: "doc-1" } + - do: search: index: test-index @@ -93,6 +104,16 @@ setup: - match: { hits.total: 1 } - match: { hits.hits.0._id: "doc-1" } + - do: + search: + index: test-index + rest_total_hits_as_int: true + body: > + { + "query": { "kql": { "query": "text_field: Bar*" } } + } + - match: { hits.total: 1 } + - match: { hits.hits.0._id: "doc-1" } --- "KQL match term queries (integer field)": @@ -184,6 +205,16 @@ setup: - match: { hits.total: 1 } - match: { hits.hits.0._id: "doc-1" } + - do: + search: + index: test-index + rest_total_hits_as_int: true + body: > + { + "query": { "kql": { "query": "keyword_field: Foo bar" } } + } + - match: { hits.total: 0 } + - do: search: index: test-index @@ -205,6 +236,15 @@ setup: } - match: { hits.total: 2 } + - do: + search: + index: test-index + rest_total_hits_as_int: true + body: > + { + "query": { "kql": { "query": "keyword_field: Foo ba*" } } + } + - match: { hits.total: 0 } --- "KQL match term queries (date field)":