From 49ca6d407eee0e88be4b9b3a1bebd7e86a00f4c0 Mon Sep 17 00:00:00 2001 From: Jim Ferenczi Date: Tue, 20 Nov 2018 22:56:20 +0100 Subject: [PATCH] Fix analyzed prefix query in query_string This change fixes analyzed prefix queries in `query_string` to be ignored if all terms are removed during the analysis. Closes #31702 --- .../index/search/QueryStringQueryParser.java | 11 +++++++---- .../index/query/QueryStringQueryBuilderTests.java | 10 ++++++++++ 2 files changed, 17 insertions(+), 4 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 bcf1e92431587..84597d4d3383c 100644 --- a/server/src/main/java/org/elasticsearch/index/search/QueryStringQueryParser.java +++ b/server/src/main/java/org/elasticsearch/index/search/QueryStringQueryParser.java @@ -484,10 +484,13 @@ protected Query getPrefixQuery(String field, String termStr) throws ParseExcepti List queries = new ArrayList<>(); for (Map.Entry entry : fields.entrySet()) { Query q = getPrefixQuerySingle(entry.getKey(), termStr); - assert q != null; - queries.add(applyBoost(q, entry.getValue())); + if (q != null) { + queries.add(applyBoost(q, entry.getValue())); + } } - if (queries.size() == 1) { + if (queries.isEmpty()) { + return null; + } else if (queries.size() == 1) { return queries.get(0); } else { float tiebreaker = groupTieBreaker == null ? type.tieBreaker() : groupTieBreaker; @@ -561,7 +564,7 @@ private Query getPossiblyAnalyzedPrefixQuery(String field, String termStr) throw } if (tlist.size() == 0) { - return super.getPrefixQuery(field, termStr); + return null; } if (tlist.size() == 1 && tlist.get(0).size() == 1) { 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 bb3f2751fa815..9ea98cebe711b 100644 --- a/server/src/test/java/org/elasticsearch/index/query/QueryStringQueryBuilderTests.java +++ b/server/src/test/java/org/elasticsearch/index/query/QueryStringQueryBuilderTests.java @@ -1422,6 +1422,16 @@ public void testPhraseSlop() throws Exception { assertEquals(expected, query); } + public void testAnalyzedPrefix() throws Exception { + Query query = new QueryStringQueryBuilder("quick* @&*") + .field(STRING_FIELD_NAME) + .analyzer("standard") + .analyzeWildcard(true) + .toQuery(createShardContext()); + Query expected = new PrefixQuery(new Term(STRING_FIELD_NAME, "quick")); + assertEquals(expected, query); + } + private static IndexMetaData newIndexMeta(String name, Settings oldIndexSettings, Settings indexSettings) { Settings build = Settings.builder().put(oldIndexSettings) .put(indexSettings)