Skip to content

Commit 042725e

Browse files
committed
Fix analyzed prefix query in query_string (#35756)
This change fixes analyzed prefix queries in `query_string` to be ignored if all terms are removed during the analysis. Closes #31702
1 parent ff93f22 commit 042725e

File tree

2 files changed

+18
-4
lines changed

2 files changed

+18
-4
lines changed

server/src/main/java/org/elasticsearch/index/search/QueryStringQueryParser.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -490,10 +490,13 @@ protected Query getPrefixQuery(String field, String termStr) throws ParseExcepti
490490
List<Query> queries = new ArrayList<>();
491491
for (Map.Entry<String, Float> entry : fields.entrySet()) {
492492
Query q = getPrefixQuerySingle(entry.getKey(), termStr);
493-
assert q != null;
494-
queries.add(applyBoost(q, entry.getValue()));
493+
if (q != null) {
494+
queries.add(applyBoost(q, entry.getValue()));
495+
}
495496
}
496-
if (queries.size() == 1) {
497+
if (queries.isEmpty()) {
498+
return null;
499+
} else if (queries.size() == 1) {
497500
return queries.get(0);
498501
} else {
499502
float tiebreaker = groupTieBreaker == null ? type.tieBreaker() : groupTieBreaker;
@@ -567,7 +570,7 @@ private Query getPossiblyAnalyzedPrefixQuery(String field, String termStr) throw
567570
}
568571

569572
if (tlist.size() == 0) {
570-
return super.getPrefixQuery(field, termStr);
573+
return null;
571574
}
572575

573576
if (tlist.size() == 1 && tlist.get(0).size() == 1) {

server/src/test/java/org/elasticsearch/index/query/QueryStringQueryBuilderTests.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1431,6 +1431,17 @@ public void testCrossFields() throws Exception {
14311431
}
14321432
}
14331433

1434+
public void testAnalyzedPrefix() throws Exception {
1435+
assumeTrue("test runs only when at least a type is registered", getCurrentTypes().length > 0);
1436+
Query query = new QueryStringQueryBuilder("quick* @&*")
1437+
.field(STRING_FIELD_NAME)
1438+
.analyzer("standard")
1439+
.analyzeWildcard(true)
1440+
.toQuery(createShardContext());
1441+
Query expected = new PrefixQuery(new Term(STRING_FIELD_NAME, "quick"));
1442+
assertEquals(expected, query);
1443+
}
1444+
14341445
private static IndexMetaData newIndexMeta(String name, Settings oldIndexSettings, Settings indexSettings) {
14351446
Settings build = Settings.builder().put(oldIndexSettings)
14361447
.put(indexSettings)

0 commit comments

Comments
 (0)