Fix quoted _exists_ query (#33019)
This change in the `query_string` query fixes the detection of the special `_exists_` field when it is used with a quoted term. Closes #28922
This commit is contained in:
parent
15727ae8ed
commit
767c69593c
|
@ -280,14 +280,14 @@ public class QueryStringQueryParser extends XQueryParser {
|
|||
|
||||
@Override
|
||||
public Query getFieldQuery(String field, String queryText, boolean quoted) throws ParseException {
|
||||
if (quoted) {
|
||||
return getFieldQuery(field, queryText, getPhraseSlop());
|
||||
}
|
||||
|
||||
if (field != null && EXISTS_FIELD.equals(field)) {
|
||||
return existsQuery(queryText);
|
||||
}
|
||||
|
||||
if (quoted) {
|
||||
return getFieldQuery(field, queryText, getPhraseSlop());
|
||||
}
|
||||
|
||||
// Detects additional operators '<', '<=', '>', '>=' to handle range query with one side unbounded.
|
||||
// It is required to use a prefix field operator to enable the detection since they are not treated
|
||||
// as logical operator by the query parser (e.g. age:>=10).
|
||||
|
@ -333,6 +333,10 @@ public class QueryStringQueryParser extends XQueryParser {
|
|||
|
||||
@Override
|
||||
protected Query getFieldQuery(String field, String queryText, int slop) throws ParseException {
|
||||
if (field != null && EXISTS_FIELD.equals(field)) {
|
||||
return existsQuery(queryText);
|
||||
}
|
||||
|
||||
Map<String, Float> fields = extractMultiFields(field, true);
|
||||
if (fields.isEmpty()) {
|
||||
return newUnmappedFieldQuery(field);
|
||||
|
|
|
@ -998,6 +998,18 @@ public class QueryStringQueryBuilderTests extends AbstractQueryTestCase<QueryStr
|
|||
} else {
|
||||
assertThat(query, equalTo(new ConstantScoreQuery(new TermQuery(new Term("_field_names", STRING_FIELD_NAME)))));
|
||||
}
|
||||
|
||||
for (boolean quoted : new boolean[] {true, false}) {
|
||||
String value = (quoted ? "\"" : "") + STRING_FIELD_NAME + (quoted ? "\"" : "");
|
||||
queryBuilder = new QueryStringQueryBuilder("_exists_:" + value);
|
||||
query = queryBuilder.toQuery(context);
|
||||
if (context.getIndexSettings().getIndexVersionCreated().onOrAfter(Version.V_6_1_0)
|
||||
&& (context.fieldMapper(STRING_FIELD_NAME).omitNorms() == false)) {
|
||||
assertThat(query, equalTo(new ConstantScoreQuery(new NormsFieldExistsQuery(STRING_FIELD_NAME))));
|
||||
} else {
|
||||
assertThat(query, equalTo(new ConstantScoreQuery(new TermQuery(new Term("_field_names", STRING_FIELD_NAME)))));
|
||||
}
|
||||
}
|
||||
QueryShardContext contextNoType = createShardContextWithNoType();
|
||||
query = queryBuilder.toQuery(contextNoType);
|
||||
assertThat(query, equalTo(new MatchNoDocsQuery()));
|
||||
|
|
Loading…
Reference in New Issue