From 11da09e9bc742a9793e5296bf527fbceb42ac5e7 Mon Sep 17 00:00:00 2001 From: Lee Hinman Date: Fri, 11 Nov 2016 10:39:50 -0700 Subject: [PATCH] Allow overriding all-field leniency when `lenient` option is specified As part of #20925 and #21341 we added an "all-fields" mode to the `query_string` and `simple_query_string`. This would expand the query to all fields and automatically set `lenient` to true. However, we should still allow a user to override the `lenient` flag to whichever value they desire, should they add it in the request. This commit does that. --- .../index/query/QueryStringQueryBuilder.java | 4 ++-- .../index/query/SimpleQueryStringBuilder.java | 22 +++++++++++++++---- .../search/query/QueryStringIT.java | 9 +++++++- .../search/query/SimpleQueryStringIT.java | 12 ++++++++++ docs/reference/search/validate.asciidoc | 4 ++-- 5 files changed, 42 insertions(+), 9 deletions(-) diff --git a/core/src/main/java/org/elasticsearch/index/query/QueryStringQueryBuilder.java b/core/src/main/java/org/elasticsearch/index/query/QueryStringQueryBuilder.java index 08318874df210..f55a0c08149d7 100644 --- a/core/src/main/java/org/elasticsearch/index/query/QueryStringQueryBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/QueryStringQueryBuilder.java @@ -964,8 +964,8 @@ protected Query doToQuery(QueryShardContext context) throws IOException { this.fieldsAndWeights.size() == 0)) { // Use the automatically determined expansion of all queryable fields resolvedFields = allQueryableDefaultFields(context); - // Automatically set leniency to "true" so mismatched fields don't cause exceptions - qpSettings.lenient(true); + // Automatically set leniency to "true" if unset so mismatched fields don't cause exceptions + qpSettings.lenient(lenient == null ? true : lenient); } else { qpSettings.defaultField(this.defaultField == null ? context.defaultField() : this.defaultField); diff --git a/core/src/main/java/org/elasticsearch/index/query/SimpleQueryStringBuilder.java b/core/src/main/java/org/elasticsearch/index/query/SimpleQueryStringBuilder.java index 5bc04d13f8bbe..92c0dfdcfe777 100644 --- a/core/src/main/java/org/elasticsearch/index/query/SimpleQueryStringBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/SimpleQueryStringBuilder.java @@ -129,6 +129,8 @@ public class SimpleQueryStringBuilder extends AbstractQueryBuilder fromXContent(QueryParseContext Operator defaultOperator = null; String analyzerName = null; int flags = SimpleQueryStringFlag.ALL.value(); - boolean lenient = SimpleQueryStringBuilder.DEFAULT_LENIENT; + Boolean lenient = null; boolean analyzeWildcard = SimpleQueryStringBuilder.DEFAULT_ANALYZE_WILDCARD; String quoteFieldSuffix = null; Boolean useAllFields = null; @@ -565,7 +576,10 @@ public static Optional fromXContent(QueryParseContext SimpleQueryStringBuilder qb = new SimpleQueryStringBuilder(queryBody); qb.boost(boost).fields(fieldsAndWeights).analyzer(analyzerName).queryName(queryName).minimumShouldMatch(minimumShouldMatch); qb.flags(flags).defaultOperator(defaultOperator); - qb.lenient(lenient).analyzeWildcard(analyzeWildcard).boost(boost).quoteFieldSuffix(quoteFieldSuffix); + if (lenient != null) { + qb.lenient(lenient); + } + qb.analyzeWildcard(analyzeWildcard).boost(boost).quoteFieldSuffix(quoteFieldSuffix); qb.useAllFields(useAllFields); return Optional.of(qb); } diff --git a/core/src/test/java/org/elasticsearch/search/query/QueryStringIT.java b/core/src/test/java/org/elasticsearch/search/query/QueryStringIT.java index 540c67ae39d05..c003038c7c270 100644 --- a/core/src/test/java/org/elasticsearch/search/query/QueryStringIT.java +++ b/core/src/test/java/org/elasticsearch/search/query/QueryStringIT.java @@ -255,6 +255,14 @@ public void testBooleanStrictQuery() throws Exception { containsString("Can't parse boolean value [foo], expected [true] or [false]")); } + public void testAllFieldsWithSpecifiedLeniency() throws IOException { + Exception e = expectThrows(Exception.class, () -> + client().prepareSearch("test").setQuery( + queryStringQuery("f_date:[now-2D TO now]").lenient(false)).get()); + assertThat(ExceptionsHelper.detailedMessage(e), + containsString("unit [D] not supported for date math [-2D]")); + } + private void assertHits(SearchHits hits, String... ids) { assertThat(hits.totalHits(), equalTo((long) ids.length)); Set hitIds = new HashSet<>(); @@ -263,5 +271,4 @@ private void assertHits(SearchHits hits, String... ids) { } assertThat(hitIds, containsInAnyOrder(ids)); } - } diff --git a/core/src/test/java/org/elasticsearch/search/query/SimpleQueryStringIT.java b/core/src/test/java/org/elasticsearch/search/query/SimpleQueryStringIT.java index 60f89ab326eb7..1af3bb99b2877 100644 --- a/core/src/test/java/org/elasticsearch/search/query/SimpleQueryStringIT.java +++ b/core/src/test/java/org/elasticsearch/search/query/SimpleQueryStringIT.java @@ -564,6 +564,18 @@ public void testPhraseQueryOnFieldWithNoPositions() throws Exception { assertHitCount(resp, 1L); } + public void testAllFieldsWithSpecifiedLeniency() throws IOException { + String indexBody = copyToStringFromClasspath("/org/elasticsearch/search/query/all-query-index.json"); + prepareCreate("test").setSource(indexBody).get(); + ensureGreen("test"); + + Exception e = expectThrows(Exception.class, () -> + client().prepareSearch("test").setQuery( + simpleQueryStringQuery("foo123").lenient(false)).get()); + assertThat(ExceptionsHelper.detailedMessage(e), + containsString("NumberFormatException[For input string: \"foo123\"]")); + } + private void assertHits(SearchHits hits, String... ids) { assertThat(hits.totalHits(), equalTo((long) ids.length)); Set hitIds = new HashSet<>(); diff --git a/docs/reference/search/validate.asciidoc b/docs/reference/search/validate.asciidoc index 5b015f4e5786b..8b7b897934d1f 100644 --- a/docs/reference/search/validate.asciidoc +++ b/docs/reference/search/validate.asciidoc @@ -87,7 +87,7 @@ due to dynamic mapping, and 'foo' does not correctly parse into a date: [source,js] -------------------------------------------------- -GET twitter/tweet/_validate/query?q=post_date:foo +GET twitter/tweet/_validate/query?q=post_date:foo%5d -------------------------------------------------- // CONSOLE @@ -102,7 +102,7 @@ about why a query failed: [source,js] -------------------------------------------------- -GET twitter/tweet/_validate/query?q=post_date:foo&explain=true +GET twitter/tweet/_validate/query?q=post_date:foo%5d&explain=true -------------------------------------------------- // CONSOLE