59
59
import java .util .ArrayList ;
60
60
import java .util .Iterator ;
61
61
import java .util .List ;
62
+ import java .util .Set ;
62
63
import java .util .function .Supplier ;
63
64
64
65
import static org .elasticsearch .common .lucene .search .Queries .newLenientFieldQuery ;
@@ -235,6 +236,14 @@ public Query parse(Type type, String fieldName, Object value) throws IOException
235
236
if (fieldType == null ) {
236
237
return newUnmappedFieldQuery (fieldName );
237
238
}
239
+ Set <String > fields = context .simpleMatchToIndexNames (fieldName );
240
+ if (fields .contains (fieldName )) {
241
+ assert fields .size () == 1 ;
242
+ // this field is a concrete field or an alias so we use the
243
+ // field type name directly
244
+ fieldName = fieldType .name ();
245
+ }
246
+
238
247
Analyzer analyzer = getAnalyzer (fieldType , type == Type .PHRASE || type == Type .PHRASE_PREFIX );
239
248
assert analyzer != null ;
240
249
@@ -248,9 +257,9 @@ public Query parse(Type type, String fieldName, Object value) throws IOException
248
257
*/
249
258
if (analyzer == Lucene .KEYWORD_ANALYZER && type != Type .PHRASE_PREFIX ) {
250
259
final Term term = new Term (fieldName , value .toString ());
251
- if (( fieldType instanceof TextFieldMapper . TextFieldType || fieldType instanceof KeywordFieldMapper . KeywordFieldType )
252
- && type == Type . BOOLEAN_PREFIX ) {
253
- return builder .newPrefixQuery (fieldName , term );
260
+ if (type == Type . BOOLEAN_PREFIX
261
+ && ( fieldType instanceof TextFieldMapper . TextFieldType || fieldType instanceof KeywordFieldMapper . KeywordFieldType ) ) {
262
+ return builder .newPrefixQuery (term );
254
263
} else {
255
264
return builder .newTermQuery (term );
256
265
}
@@ -540,12 +549,12 @@ protected Query newTermQuery(Term term) {
540
549
/**
541
550
* Builds a new prefix query instance.
542
551
*/
543
- protected Query newPrefixQuery (String field , Term term ) {
552
+ protected Query newPrefixQuery (Term term ) {
544
553
try {
545
554
return fieldType .prefixQuery (term .text (), null , context );
546
555
} catch (RuntimeException e ) {
547
556
if (lenient ) {
548
- return newLenientFieldQuery (field , e );
557
+ return newLenientFieldQuery (term . field () , e );
549
558
}
550
559
throw e ;
551
560
}
@@ -562,7 +571,7 @@ private Query analyzeTerm(String field, TokenStream stream, boolean isPrefix) th
562
571
final Term term = new Term (field , termAtt .getBytesRef ());
563
572
int lastOffset = offsetAtt .endOffset ();
564
573
stream .end ();
565
- return isPrefix && lastOffset == offsetAtt .endOffset () ? newPrefixQuery (field , term ) : newTermQuery (term );
574
+ return isPrefix && lastOffset == offsetAtt .endOffset () ? newPrefixQuery (term ) : newTermQuery (term );
566
575
}
567
576
568
577
private void add (BooleanQuery .Builder q , String field , List <Term > current , BooleanClause .Occur operator , boolean isPrefix ) {
@@ -571,7 +580,7 @@ private void add(BooleanQuery.Builder q, String field, List<Term> current, Boole
571
580
}
572
581
if (current .size () == 1 ) {
573
582
if (isPrefix ) {
574
- q .add (newPrefixQuery (field , current .get (0 )), operator );
583
+ q .add (newPrefixQuery (current .get (0 )), operator );
575
584
} else {
576
585
q .add (newTermQuery (current .get (0 )), operator );
577
586
}
@@ -688,7 +697,7 @@ public Query next() {
688
697
Term [] terms = graph .getTerms (field , start );
689
698
assert terms .length > 0 ;
690
699
if (terms .length == 1 ) {
691
- queryPos = usePrefix ? newPrefixQuery (field , terms [0 ]) : newTermQuery (terms [0 ]);
700
+ queryPos = usePrefix ? newPrefixQuery (terms [0 ]) : newTermQuery (terms [0 ]);
692
701
} else {
693
702
// We don't apply prefix on synonyms
694
703
queryPos = newSynonymQuery (terms );
0 commit comments