Skip to content

Commit 14042d0

Browse files
committed
Rewrite more queries to match_none when they target an unmapped field
Closes #97129
1 parent f63e9e5 commit 14042d0

File tree

14 files changed

+113
-13
lines changed

14 files changed

+113
-13
lines changed

server/src/main/java/org/elasticsearch/index/query/AbstractGeometryQueryBuilder.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -460,6 +460,15 @@ protected QueryBuilder doRewrite(QueryRewriteContext queryRewriteContext) throws
460460
});
461461
return newShapeQueryBuilder(this.fieldName, supplier::get, this.indexedShapeId).relation(relation);
462462
}
463+
return super.doRewrite(queryRewriteContext);
464+
}
465+
466+
@Override
467+
protected QueryBuilder doIndexMetadataRewrite(QueryRewriteContext context) throws IOException {
468+
MappedFieldType fieldType = context.getFieldType(fieldName);
469+
if (fieldType == null) {
470+
return new MatchNoneQueryBuilder("The \"" + getName() + "\" query was rewritten to a \"match_none\" query.");
471+
}
463472
return this;
464473
}
465474

server/src/main/java/org/elasticsearch/index/query/BaseTermQueryBuilder.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import org.elasticsearch.common.Strings;
1414
import org.elasticsearch.common.io.stream.StreamInput;
1515
import org.elasticsearch.common.io.stream.StreamOutput;
16+
import org.elasticsearch.index.mapper.MappedFieldType;
1617
import org.elasticsearch.xcontent.ParseField;
1718
import org.elasticsearch.xcontent.XContentBuilder;
1819

@@ -161,4 +162,17 @@ protected int doHashCode() {
161162
protected boolean doEquals(QB other) {
162163
return Objects.equals(fieldName, other.fieldName) && Objects.equals(value, other.value);
163164
}
165+
166+
@Override
167+
protected final QueryBuilder doIndexMetadataRewrite(QueryRewriteContext context) throws IOException {
168+
MappedFieldType fieldType = context.getFieldType(this.fieldName);
169+
if (fieldType == null) {
170+
return new MatchNoneQueryBuilder("The \"" + getName() + "\" query is against a field that does not exist");
171+
}
172+
return doIndexMetadataRewrite(context, fieldType);
173+
}
174+
175+
protected QueryBuilder doIndexMetadataRewrite(QueryRewriteContext context, MappedFieldType fieldType) throws IOException {
176+
return this;
177+
}
164178
}

server/src/main/java/org/elasticsearch/index/query/FuzzyQueryBuilder.java

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -253,15 +253,12 @@ public String getWriteableName() {
253253
}
254254

255255
@Override
256-
protected QueryBuilder doRewrite(QueryRewriteContext queryRewriteContext) throws IOException {
257-
SearchExecutionContext context = queryRewriteContext.convertToSearchExecutionContext();
258-
if (context != null) {
259-
MappedFieldType fieldType = context.getFieldType(fieldName);
260-
if (fieldType == null) {
261-
return new MatchNoneQueryBuilder("The \"" + getName() + "\" query was rewritten to a \"match_none\" query.");
262-
}
256+
protected QueryBuilder doIndexMetadataRewrite(QueryRewriteContext context) throws IOException {
257+
MappedFieldType fieldType = context.getFieldType(fieldName);
258+
if (fieldType == null) {
259+
return new MatchNoneQueryBuilder("The \"" + getName() + "\" query was rewritten to a \"match_none\" query.");
263260
}
264-
return super.doRewrite(context);
261+
return this;
265262
}
266263

267264
@Override

server/src/main/java/org/elasticsearch/index/query/GeoBoundingBoxQueryBuilder.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,4 +384,13 @@ public String getWriteableName() {
384384
public TransportVersion getMinimalSupportedVersion() {
385385
return TransportVersions.ZERO;
386386
}
387+
388+
@Override
389+
protected QueryBuilder doIndexMetadataRewrite(QueryRewriteContext context) throws IOException {
390+
MappedFieldType fieldType = context.getFieldType(fieldName);
391+
if (fieldType == null) {
392+
return new MatchNoneQueryBuilder("The \"" + getName() + "\" query was rewritten to a \"match_none\" query.");
393+
}
394+
return this;
395+
}
387396
}

server/src/main/java/org/elasticsearch/index/query/GeoDistanceQueryBuilder.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -387,4 +387,13 @@ public String getWriteableName() {
387387
public TransportVersion getMinimalSupportedVersion() {
388388
return TransportVersions.ZERO;
389389
}
390+
391+
@Override
392+
protected QueryBuilder doIndexMetadataRewrite(QueryRewriteContext context) throws IOException {
393+
MappedFieldType fieldType = context.getFieldType(fieldName);
394+
if (fieldType == null) {
395+
return new MatchNoneQueryBuilder("The \"" + getName() + "\" query was rewritten to a \"match_none\" query.");
396+
}
397+
return this;
398+
}
390399
}

server/src/main/java/org/elasticsearch/index/query/GeoPolygonQueryBuilder.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,4 +321,13 @@ public String getWriteableName() {
321321
public TransportVersion getMinimalSupportedVersion() {
322322
return TransportVersions.ZERO;
323323
}
324+
325+
@Override
326+
protected QueryBuilder doIndexMetadataRewrite(QueryRewriteContext context) throws IOException {
327+
MappedFieldType fieldType = context.getFieldType(fieldName);
328+
if (fieldType == null) {
329+
return new MatchNoneQueryBuilder("The \"" + getName() + "\" query was rewritten to a \"match_none\" query.");
330+
}
331+
return this;
332+
}
324333
}

server/src/main/java/org/elasticsearch/index/query/MatchPhrasePrefixQueryBuilder.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import org.elasticsearch.common.ParsingException;
1717
import org.elasticsearch.common.io.stream.StreamInput;
1818
import org.elasticsearch.common.io.stream.StreamOutput;
19+
import org.elasticsearch.index.mapper.MappedFieldType;
1920
import org.elasticsearch.index.search.MatchQueryParser;
2021
import org.elasticsearch.xcontent.ParseField;
2122
import org.elasticsearch.xcontent.XContentBuilder;
@@ -288,4 +289,13 @@ public static MatchPhrasePrefixQueryBuilder fromXContent(XContentParser parser)
288289
public TransportVersion getMinimalSupportedVersion() {
289290
return TransportVersions.ZERO;
290291
}
292+
293+
@Override
294+
protected QueryBuilder doIndexMetadataRewrite(QueryRewriteContext context) throws IOException {
295+
MappedFieldType fieldType = context.getFieldType(fieldName);
296+
if (fieldType == null) {
297+
return new MatchNoneQueryBuilder("The \"" + getName() + "\" query was rewritten to a \"match_none\" query.");
298+
}
299+
return this;
300+
}
291301
}

server/src/main/java/org/elasticsearch/index/query/MatchPhraseQueryBuilder.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,10 @@ protected void doXContent(XContentBuilder builder, Params params) throws IOExcep
165165

166166
@Override
167167
protected QueryBuilder doIndexMetadataRewrite(QueryRewriteContext context) throws IOException {
168+
MappedFieldType fieldType = context.getFieldType(fieldName);
169+
if (fieldType == null) {
170+
return new MatchNoneQueryBuilder("The \"" + getName() + "\" query is against a field that does not exist");
171+
}
168172
// If we're using the default keyword analyzer then we can rewrite this to a TermQueryBuilder
169173
// and possibly shortcut
170174
// If we're using a keyword analyzer then we can rewrite this to a TermQueryBuilder

server/src/main/java/org/elasticsearch/index/query/MatchQueryBuilder.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,10 @@ public void doXContent(XContentBuilder builder, Params params) throws IOExceptio
366366

367367
@Override
368368
protected QueryBuilder doIndexMetadataRewrite(QueryRewriteContext context) throws IOException {
369+
MappedFieldType fieldType = context.getFieldType(fieldName);
370+
if (fieldType == null) {
371+
return new MatchNoneQueryBuilder("The \"" + getName() + "\" query is against a field that does not exist");
372+
}
369373
if (fuzziness != null || lenient) {
370374
// Term queries can be neither fuzzy nor lenient, so don't rewrite under these conditions
371375
return this;

server/src/main/java/org/elasticsearch/index/query/RangeQueryBuilder.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -481,6 +481,15 @@ protected MappedFieldType.Relation getRelation(final SearchExecutionContext sear
481481
);
482482
}
483483

484+
@Override
485+
protected QueryBuilder doIndexMetadataRewrite(QueryRewriteContext context) throws IOException {
486+
MappedFieldType fieldType = context.getFieldType(fieldName);
487+
if (fieldType == null) {
488+
return new MatchNoneQueryBuilder("The \"" + getName() + "\" query was rewritten to a \"match_none\" query.");
489+
}
490+
return this;
491+
}
492+
484493
@Override
485494
protected QueryBuilder doCoordinatorRewrite(final CoordinatorRewriteContext coordinatorRewriteContext) {
486495
return toQueryBuilder(getRelation(coordinatorRewriteContext));

0 commit comments

Comments
 (0)