62
62
import java .util .ArrayList ;
63
63
import java .util .Iterator ;
64
64
import java .util .List ;
65
+ import java .util .Set ;
65
66
import java .util .function .Supplier ;
66
67
67
68
import static org .elasticsearch .common .lucene .search .Queries .newLenientFieldQuery ;
@@ -248,6 +249,14 @@ public Query parse(Type type, String fieldName, Object value) throws IOException
248
249
if (fieldType == null ) {
249
250
return newUnmappedFieldQuery (fieldName );
250
251
}
252
+ Set <String > fields = context .simpleMatchToIndexNames (fieldName );
253
+ if (fields .contains (fieldName )) {
254
+ assert fields .size () == 1 ;
255
+ // this field is a concrete field or an alias so we use the
256
+ // field type name directly
257
+ fieldName = fieldType .name ();
258
+ }
259
+
251
260
Analyzer analyzer = getAnalyzer (fieldType , type == Type .PHRASE || type == Type .PHRASE_PREFIX );
252
261
assert analyzer != null ;
253
262
@@ -261,9 +270,9 @@ public Query parse(Type type, String fieldName, Object value) throws IOException
261
270
*/
262
271
if (analyzer == Lucene .KEYWORD_ANALYZER && type != Type .PHRASE_PREFIX ) {
263
272
final Term term = new Term (fieldName , value .toString ());
264
- if (( fieldType instanceof TextFieldMapper . TextFieldType || fieldType instanceof KeywordFieldMapper . KeywordFieldType )
265
- && type == Type . BOOLEAN_PREFIX ) {
266
- return builder .newPrefixQuery (fieldName , term );
273
+ if (type == Type . BOOLEAN_PREFIX
274
+ && ( fieldType instanceof TextFieldMapper . TextFieldType || fieldType instanceof KeywordFieldMapper . KeywordFieldType ) ) {
275
+ return builder .newPrefixQuery (term );
267
276
} else {
268
277
return builder .newTermQuery (term );
269
278
}
@@ -581,12 +590,12 @@ protected Query newTermQuery(Term term) {
581
590
/**
582
591
* Builds a new prefix query instance.
583
592
*/
584
- protected Query newPrefixQuery (String field , Term term ) {
593
+ protected Query newPrefixQuery (Term term ) {
585
594
try {
586
595
return fieldType .prefixQuery (term .text (), null , context );
587
596
} catch (RuntimeException e ) {
588
597
if (lenient ) {
589
- return newLenientFieldQuery (field , e );
598
+ return newLenientFieldQuery (term . field () , e );
590
599
}
591
600
throw e ;
592
601
}
@@ -603,7 +612,7 @@ private Query analyzeTerm(String field, TokenStream stream, boolean isPrefix) th
603
612
final Term term = new Term (field , termAtt .getBytesRef ());
604
613
int lastOffset = offsetAtt .endOffset ();
605
614
stream .end ();
606
- return isPrefix && lastOffset == offsetAtt .endOffset () ? newPrefixQuery (field , term ) : newTermQuery (term );
615
+ return isPrefix && lastOffset == offsetAtt .endOffset () ? newPrefixQuery (term ) : newTermQuery (term );
607
616
}
608
617
609
618
private void add (BooleanQuery .Builder q , String field , List <Term > current , BooleanClause .Occur operator , boolean isPrefix ) {
@@ -612,7 +621,7 @@ private void add(BooleanQuery.Builder q, String field, List<Term> current, Boole
612
621
}
613
622
if (current .size () == 1 ) {
614
623
if (isPrefix ) {
615
- q .add (newPrefixQuery (field , current .get (0 )), operator );
624
+ q .add (newPrefixQuery (current .get (0 )), operator );
616
625
} else {
617
626
q .add (newTermQuery (current .get (0 )), operator );
618
627
}
@@ -729,7 +738,7 @@ public Query next() {
729
738
Term [] terms = graph .getTerms (field , start );
730
739
assert terms .length > 0 ;
731
740
if (terms .length == 1 ) {
732
- queryPos = usePrefix ? newPrefixQuery (field , terms [0 ]) : newTermQuery (terms [0 ]);
741
+ queryPos = usePrefix ? newPrefixQuery (terms [0 ]) : newTermQuery (terms [0 ]);
733
742
} else {
734
743
// We don't apply prefix on synonyms
735
744
queryPos = newSynonymQuery (terms );
0 commit comments