Skip to content

Commit dcd8502

Browse files
committed
Disallow wildcard queries on non-string fields.
For backwards compatibility, we maintain support on the `_index` field.
1 parent f2d621f commit dcd8502

File tree

3 files changed

+24
-10
lines changed

3 files changed

+24
-10
lines changed

server/src/main/java/org/elasticsearch/index/mapper/IndexFieldMapper.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,8 +150,17 @@ public Query termsQuery(List values, QueryShardContext context) {
150150
+ " vs. " + values);
151151
}
152152

153+
@Override
154+
public Query wildcardQuery(String value, QueryShardContext context) {
155+
if (isSameIndex(value, context.getFullyQualifiedIndex().getName())) {
156+
return Queries.newMatchAllQuery();
157+
} else {
158+
return Queries.newMatchNoDocsQuery("Index didn't match. Index queried: " + context.index().getName() + " vs. " + value);
159+
}
160+
}
161+
153162
private boolean isSameIndex(Object value, String indexName) {
154-
String pattern = value instanceof BytesRef ? pattern = ((BytesRef) value).utf8ToString() : value.toString();
163+
String pattern = value instanceof BytesRef ? ((BytesRef) value).utf8ToString() : value.toString();
155164
return Regex.simpleMatch(pattern, indexName);
156165
}
157166

server/src/main/java/org/elasticsearch/index/mapper/MappedFieldType.java

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,10 @@
3030
import org.apache.lucene.search.BooleanQuery;
3131
import org.apache.lucene.search.BoostQuery;
3232
import org.apache.lucene.search.ConstantScoreQuery;
33-
import org.apache.lucene.search.MatchAllDocsQuery;
34-
import org.apache.lucene.search.MatchNoDocsQuery;
3533
import org.apache.lucene.search.MultiTermQuery;
3634
import org.apache.lucene.search.Query;
3735
import org.apache.lucene.search.TermInSetQuery;
3836
import org.apache.lucene.search.TermQuery;
39-
import org.apache.lucene.search.WildcardQuery;
4037
import org.apache.lucene.util.BytesRef;
4138
import org.elasticsearch.ElasticsearchParseException;
4239
import org.elasticsearch.common.Nullable;
@@ -349,12 +346,7 @@ public Query prefixQuery(String value, @Nullable MultiTermQuery.RewriteMethod me
349346
}
350347

351348
public Query wildcardQuery(String value, QueryShardContext context) {
352-
Query termQuery = termQuery(value, context);
353-
if (termQuery instanceof MatchNoDocsQuery || termQuery instanceof MatchAllDocsQuery) {
354-
return termQuery;
355-
}
356-
Term term = MappedFieldType.extractTerm(termQuery);
357-
return new WildcardQuery(term);
349+
throw new QueryShardException(context, "Can only use wildcard queries on keyword and text fields - not on [" + name + "] which is of type [" + typeName() + "]");
358350
}
359351

360352
public Query regexpQuery(String value, int flags, int maxDeterminizedStates, @Nullable MultiTermQuery.RewriteMethod method, QueryShardContext context) {

server/src/main/java/org/elasticsearch/index/mapper/StringFieldType.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,16 @@
2222
import java.util.List;
2323

2424
import org.apache.lucene.index.Term;
25+
import org.apache.lucene.search.MatchAllDocsQuery;
26+
import org.apache.lucene.search.MatchNoDocsQuery;
2527
import org.apache.lucene.search.TermInSetQuery;
2628
import org.apache.lucene.search.FuzzyQuery;
2729
import org.apache.lucene.search.MultiTermQuery;
2830
import org.apache.lucene.search.PrefixQuery;
2931
import org.apache.lucene.search.Query;
3032
import org.apache.lucene.search.RegexpQuery;
3133
import org.apache.lucene.search.TermRangeQuery;
34+
import org.apache.lucene.search.WildcardQuery;
3235
import org.apache.lucene.util.BytesRef;
3336
import org.elasticsearch.common.lucene.BytesRefs;
3437
import org.elasticsearch.common.unit.Fuzziness;
@@ -74,6 +77,16 @@ public Query prefixQuery(String value, MultiTermQuery.RewriteMethod method, Quer
7477
return query;
7578
}
7679

80+
@Override
81+
public Query wildcardQuery(String value, QueryShardContext context) {
82+
Query termQuery = termQuery(value, context);
83+
if (termQuery instanceof MatchNoDocsQuery || termQuery instanceof MatchAllDocsQuery) {
84+
return termQuery;
85+
}
86+
Term term = MappedFieldType.extractTerm(termQuery);
87+
return new WildcardQuery(term);
88+
}
89+
7790
@Override
7891
public Query regexpQuery(String value, int flags, int maxDeterminizedStates,
7992
MultiTermQuery.RewriteMethod method, QueryShardContext context) {

0 commit comments

Comments
 (0)