1212import org .apache .lucene .analysis .TokenStream ;
1313import org .apache .lucene .index .Term ;
1414import org .apache .lucene .queries .BlendedTermQuery ;
15+ import org .apache .lucene .search .BooleanClause ;
1516import org .apache .lucene .search .BoostQuery ;
1617import org .apache .lucene .search .DisjunctionMaxQuery ;
1718import org .apache .lucene .search .MatchNoDocsQuery ;
@@ -66,7 +67,7 @@ public Query parse(MultiMatchQueryBuilder.Type type, Map<String, Float> fieldNam
6667 break ;
6768
6869 case CROSS_FIELDS :
69- queries = buildCrossFieldQuery (type , fieldNames , value , minimumShouldMatch , tieBreaker );
70+ queries = buildCrossFieldQuery (fieldNames , value , minimumShouldMatch , tieBreaker );
7071 break ;
7172
7273 default :
@@ -108,15 +109,16 @@ private List<Query> buildFieldQueries(MultiMatchQueryBuilder.Type type, Map<Stri
108109 return queries ;
109110 }
110111
111- private List <Query > buildCrossFieldQuery (MultiMatchQueryBuilder .Type type , Map <String , Float > fieldNames ,
112- Object value , String minimumShouldMatch , float tieBreaker ) throws IOException {
112+ private List <Query > buildCrossFieldQuery (Map <String , Float > fieldNames ,
113+ Object value , String minimumShouldMatch , float tieBreaker ) {
114+
113115 Map <Analyzer , List <FieldAndBoost >> groups = new HashMap <>();
114116 List <Query > queries = new ArrayList <>();
115117 for (Map .Entry <String , Float > entry : fieldNames .entrySet ()) {
116118 String name = entry .getKey ();
117119 MappedFieldType fieldType = context .getFieldType (name );
118120 if (fieldType != null ) {
119- Analyzer actualAnalyzer = getAnalyzer (fieldType , type == MultiMatchQueryBuilder . Type . PHRASE );
121+ Analyzer actualAnalyzer = getAnalyzer (fieldType , false );
120122 if (groups .containsKey (actualAnalyzer ) == false ) {
121123 groups .put (actualAnalyzer , new ArrayList <>());
122124 }
@@ -130,7 +132,7 @@ private List<Query> buildCrossFieldQuery(MultiMatchQueryBuilder.Type type, Map<S
130132 builder = new MatchQueryBuilder (group .getKey (), group .getValue ().get (0 ).fieldType ,
131133 enablePositionIncrements , autoGenerateSynonymsPhraseQuery );
132134 } else {
133- builder = new BlendedQueryBuilder (group .getKey (), group .getValue (), tieBreaker ,
135+ builder = new CrossFieldsQueryBuilder (group .getKey (), group .getValue (), tieBreaker ,
134136 enablePositionIncrements , autoGenerateSynonymsPhraseQuery );
135137 }
136138
@@ -140,7 +142,11 @@ private List<Query> buildCrossFieldQuery(MultiMatchQueryBuilder.Type type, Map<S
140142 * fields are already grouped by their analyzers/types.
141143 */
142144 String representativeField = group .getValue ().get (0 ).fieldType .name ();
143- Query query = parseInternal (type .matchQueryType (), representativeField , builder , value );
145+ Query query = builder .createBooleanQuery (representativeField , value .toString (), occur );
146+ if (query == null ) {
147+ query = zeroTermsQuery ();
148+ }
149+
144150 query = Queries .maybeApplyMinimumShouldMatch (query , minimumShouldMatch );
145151 if (query != null ) {
146152 if (group .getValue ().size () == 1 ) {
@@ -157,17 +163,32 @@ private List<Query> buildCrossFieldQuery(MultiMatchQueryBuilder.Type type, Map<S
157163 return queries ;
158164 }
159165
160- private class BlendedQueryBuilder extends MatchQueryBuilder {
166+ private class CrossFieldsQueryBuilder extends MatchQueryBuilder {
161167 private final List <FieldAndBoost > blendedFields ;
162168 private final float tieBreaker ;
163169
164- BlendedQueryBuilder (Analyzer analyzer , List <FieldAndBoost > blendedFields , float tieBreaker ,
170+ CrossFieldsQueryBuilder (Analyzer analyzer , List <FieldAndBoost > blendedFields , float tieBreaker ,
165171 boolean enablePositionIncrements , boolean autoGenerateSynonymsPhraseQuery ) {
166172 super (analyzer , blendedFields .get (0 ).fieldType , enablePositionIncrements , autoGenerateSynonymsPhraseQuery );
167173 this .blendedFields = blendedFields ;
168174 this .tieBreaker = tieBreaker ;
169175 }
170176
177+ @ Override
178+ public Query createPhraseQuery (String field , String queryText , int phraseSlop ) {
179+ throw new IllegalArgumentException ("[multi_match] queries in [cross_fields] mode don't support phrases" );
180+ }
181+
182+ @ Override
183+ protected Query createPhrasePrefixQuery (String field , String queryText , int slop ) {
184+ throw new IllegalArgumentException ("[multi_match] queries in [cross_fields] mode don't support phrase prefix" );
185+ }
186+
187+ @ Override
188+ protected Query createBooleanPrefixQuery (String field , String queryText , BooleanClause .Occur occur ) {
189+ throw new IllegalArgumentException ("[multi_match] queries in [cross_fields] mode don't support boolean prefix" );
190+ }
191+
171192 @ Override
172193 protected Query newSynonymQuery (TermAndBoost [] terms ) {
173194 BytesRef [] values = new BytesRef [terms .length ];
@@ -184,15 +205,7 @@ protected Query newTermQuery(Term term, float boost) {
184205
185206 @ Override
186207 protected Query newPrefixQuery (Term term ) {
187- List <Query > disjunctions = new ArrayList <>();
188- for (FieldAndBoost fieldType : blendedFields ) {
189- Query query = fieldType .fieldType .prefixQuery (term .text (), null , context );
190- if (fieldType .boost != 1f ) {
191- query = new BoostQuery (query , fieldType .boost );
192- }
193- disjunctions .add (query );
194- }
195- return new DisjunctionMaxQuery (disjunctions , tieBreaker );
208+ throw new IllegalArgumentException ("[multi_match] queries in [cross_fields] mode don't support prefix" );
196209 }
197210
198211 @ Override
0 commit comments