Skip to content

Commit f9859da

Browse files
committed
Handle specialized term queries in MappedFieldType.extractTerm(TermQuery) (#21889)
For some fields we have a specialized implementation of a TermQuery that is specific for the field. When these kind of fields are used in a wildcard query or a span term query it fails with an exception because they don't recognize the specialized form. The impacted fields are [_all] and [_type] and the impacted queries are [span_term] and [wilcard]. This change handles these forms and correctly extracts the term inside them for further use. Fixes #21882
1 parent 77e897f commit f9859da

File tree

4 files changed

+31
-2
lines changed

4 files changed

+31
-2
lines changed

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import org.elasticsearch.action.fieldstats.FieldStats;
3636
import org.elasticsearch.common.Nullable;
3737
import org.elasticsearch.common.joda.DateMathParser;
38+
import org.elasticsearch.common.lucene.all.AllTermQuery;
3839
import org.elasticsearch.common.unit.Fuzziness;
3940
import org.elasticsearch.index.analysis.NamedAnalyzer;
4041
import org.elasticsearch.index.fielddata.IndexFieldData;
@@ -462,6 +463,11 @@ public static Term extractTerm(Query termQuery) {
462463
while (termQuery instanceof BoostQuery) {
463464
termQuery = ((BoostQuery) termQuery).getQuery();
464465
}
466+
if (termQuery instanceof AllTermQuery) {
467+
return ((AllTermQuery) termQuery).getTerm();
468+
} else if (termQuery instanceof TypeFieldMapper.TypeQuery) {
469+
return new Term(TypeFieldMapper.NAME, ((TypeFieldMapper.TypeQuery) termQuery).getTerm());
470+
}
465471
if (termQuery instanceof TermQuery == false) {
466472
throw new IllegalArgumentException("Cannot extract a term from a query of type "
467473
+ termQuery.getClass() + ": " + termQuery);

core/src/main/java/org/elasticsearch/index/mapper/TypeFieldMapper.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,10 @@ public TypeQuery(BytesRef type) {
172172
this.type = Objects.requireNonNull(type);
173173
}
174174

175+
public BytesRef getTerm() {
176+
return type;
177+
}
178+
175179
@Override
176180
public Query rewrite(IndexReader reader) throws IOException {
177181
Term term = new Term(CONTENT_TYPE, type);

core/src/test/java/org/elasticsearch/index/query/SpanTermQueryBuilderTests.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,15 @@
1919

2020
package org.elasticsearch.index.query;
2121

22+
import com.fasterxml.jackson.core.io.JsonStringEncoder;
2223
import org.apache.lucene.index.Term;
2324
import org.apache.lucene.search.Query;
2425
import org.apache.lucene.search.TermQuery;
2526
import org.apache.lucene.search.spans.SpanTermQuery;
2627
import org.elasticsearch.common.ParsingException;
2728
import org.elasticsearch.common.lucene.BytesRefs;
2829
import org.elasticsearch.index.mapper.MappedFieldType;
29-
3030
import com.fasterxml.jackson.core.io.JsonStringEncoder;
31-
3231
import java.io.IOException;
3332

3433
import static org.hamcrest.CoreMatchers.equalTo;
@@ -131,4 +130,13 @@ public void testParseFailsWithMultipleFields() throws IOException {
131130
assertEquals("[span_term] query doesn't support multiple fields, found [message1] and [message2]", e.getMessage());
132131
}
133132

133+
public void testWithMetaDataField() throws IOException {
134+
QueryShardContext context = createShardContext();
135+
for (String field : new String[]{"_type", "_all"}) {
136+
SpanTermQueryBuilder spanTermQueryBuilder = new SpanTermQueryBuilder(field, "toto");
137+
Query query = spanTermQueryBuilder.toQuery(context);
138+
Query expected = new SpanTermQuery(new Term(field, "toto"));
139+
assertEquals(expected, query);
140+
}
141+
}
134142
}

core/src/test/java/org/elasticsearch/index/query/WildcardQueryBuilderTests.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
package org.elasticsearch.index.query;
2121

22+
import org.apache.lucene.index.Term;
2223
import org.apache.lucene.search.Query;
2324
import org.apache.lucene.search.WildcardQuery;
2425
import org.elasticsearch.common.ParsingException;
@@ -124,4 +125,14 @@ public void testParseFailsWithMultipleFields() throws IOException {
124125
e = expectThrows(ParsingException.class, () -> parseQuery(shortJson));
125126
assertEquals("[wildcard] query doesn't support multiple fields, found [user1] and [user2]", e.getMessage());
126127
}
128+
129+
public void testWithMetaDataField() throws IOException {
130+
QueryShardContext context = createShardContext();
131+
for (String field : new String[]{"_type", "_all"}) {
132+
WildcardQueryBuilder wildcardQueryBuilder = new WildcardQueryBuilder(field, "toto");
133+
Query query = wildcardQueryBuilder.toQuery(context);
134+
Query expected = new WildcardQuery(new Term(field, "toto"));
135+
assertEquals(expected, query);
136+
}
137+
}
127138
}

0 commit comments

Comments
 (0)