From 8008037130efe0a2522fe76bc946740df0aef63d Mon Sep 17 00:00:00 2001 From: Jim Ferenczi Date: Mon, 2 Apr 2018 16:58:00 +0200 Subject: [PATCH 1/2] Fixed quote_field_suffix in query_string This change fixes the handling of the `quote_field_suffix` option on `query_string` query. The expansion was not applied to default fields query. Closes #29324 --- .../index/search/QueryStringQueryParser.java | 11 +++++++ .../query/QueryStringQueryBuilderTests.java | 31 +++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/server/src/main/java/org/elasticsearch/index/search/QueryStringQueryParser.java b/server/src/main/java/org/elasticsearch/index/search/QueryStringQueryParser.java index 0612853cd502f..c0d35b6341be8 100644 --- a/server/src/main/java/org/elasticsearch/index/search/QueryStringQueryParser.java +++ b/server/src/main/java/org/elasticsearch/index/search/QueryStringQueryParser.java @@ -59,6 +59,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -264,6 +265,16 @@ private Map extractMultiFields(String field, boolean quoted) { // Filters unsupported fields if a pattern is requested // Filters metadata fields if all fields are requested return resolveMappingField(context, field, 1.0f, !allFields, !multiFields, quoted ? quoteFieldSuffix : null); + } else if (quoted && quoteFieldSuffix != null) { + Map newFields = new HashMap<>(fieldsAndWeights.size()); + for (Map.Entry entry : fieldsAndWeights.entrySet()) { + String fieldName = entry.getKey(); + if (context.fieldMapper(entry.getKey() + quoteFieldSuffix) != null) { + fieldName += quoteFieldSuffix; + } + newFields.put(fieldName, entry.getValue()); + } + return newFields; } else { return fieldsAndWeights; } diff --git a/server/src/test/java/org/elasticsearch/index/query/QueryStringQueryBuilderTests.java b/server/src/test/java/org/elasticsearch/index/query/QueryStringQueryBuilderTests.java index 939f1add0094f..aba7836a5a325 100644 --- a/server/src/test/java/org/elasticsearch/index/query/QueryStringQueryBuilderTests.java +++ b/server/src/test/java/org/elasticsearch/index/query/QueryStringQueryBuilderTests.java @@ -1040,6 +1040,37 @@ public void testQuoteAnalyzer() throws Exception { assertEquals(expectedQuery, query); } + public void testQuoteFieldSuffix() throws IOException { + assumeTrue("test runs only when at least a type is registered", getCurrentTypes().length > 0); + QueryShardContext context = createShardContext(); + assertEquals(new TermQuery(new Term(STRING_FIELD_NAME, "bar")), + new QueryStringQueryBuilder("bar") + .quoteFieldSuffix("_2") + .field(STRING_FIELD_NAME) + .doToQuery(context) + ); + assertEquals(new TermQuery(new Term(STRING_FIELD_NAME_2, "bar")), + new QueryStringQueryBuilder("\"bar\"") + .quoteFieldSuffix("_2") + .field(STRING_FIELD_NAME) + .doToQuery(context) + ); + + // Now check what happens if the quote field does not exist + assertEquals(new TermQuery(new Term(STRING_FIELD_NAME, "bar")), + new QueryStringQueryBuilder("bar") + .quoteFieldSuffix(".quote") + .field(STRING_FIELD_NAME) + .doToQuery(context) + ); + assertEquals(new TermQuery(new Term(STRING_FIELD_NAME, "bar")), + new QueryStringQueryBuilder("\"bar\"") + .quoteFieldSuffix(".quote") + .field(STRING_FIELD_NAME) + .doToQuery(context) + ); + } + public void testToFuzzyQuery() throws Exception { assumeTrue("test runs only when at least a type is registered", getCurrentTypes().length > 0); From 0abf44c2e0dded87f69b1fdf67dc7820f13cb433 Mon Sep 17 00:00:00 2001 From: Jim Ferenczi Date: Wed, 4 Apr 2018 08:32:06 +0200 Subject: [PATCH 2/2] address review --- .../index/search/QueryStringQueryParser.java | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/server/src/main/java/org/elasticsearch/index/search/QueryStringQueryParser.java b/server/src/main/java/org/elasticsearch/index/search/QueryStringQueryParser.java index c0d35b6341be8..398f2240a5c43 100644 --- a/server/src/main/java/org/elasticsearch/index/search/QueryStringQueryParser.java +++ b/server/src/main/java/org/elasticsearch/index/search/QueryStringQueryParser.java @@ -59,7 +59,6 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Collections; -import java.util.HashMap; import java.util.List; import java.util.Map; @@ -67,6 +66,7 @@ import static org.elasticsearch.common.lucene.search.Queries.newLenientFieldQuery; import static org.elasticsearch.common.lucene.search.Queries.newUnmappedFieldQuery; import static org.elasticsearch.index.search.QueryParserHelper.resolveMappingField; +import static org.elasticsearch.index.search.QueryParserHelper.resolveMappingFields; /** * A {@link XQueryParser} that uses the {@link MapperService} in order to build smarter @@ -266,15 +266,7 @@ private Map extractMultiFields(String field, boolean quoted) { // Filters metadata fields if all fields are requested return resolveMappingField(context, field, 1.0f, !allFields, !multiFields, quoted ? quoteFieldSuffix : null); } else if (quoted && quoteFieldSuffix != null) { - Map newFields = new HashMap<>(fieldsAndWeights.size()); - for (Map.Entry entry : fieldsAndWeights.entrySet()) { - String fieldName = entry.getKey(); - if (context.fieldMapper(entry.getKey() + quoteFieldSuffix) != null) { - fieldName += quoteFieldSuffix; - } - newFields.put(fieldName, entry.getValue()); - } - return newFields; + return resolveMappingFields(context, fieldsAndWeights, quoteFieldSuffix); } else { return fieldsAndWeights; }