12
12
import org .apache .lucene .analysis .TokenStream ;
13
13
import org .apache .lucene .index .Term ;
14
14
import org .apache .lucene .queries .BlendedTermQuery ;
15
+ import org .apache .lucene .search .BooleanClause ;
15
16
import org .apache .lucene .search .BoostQuery ;
16
17
import org .apache .lucene .search .DisjunctionMaxQuery ;
17
18
import org .apache .lucene .search .MatchNoDocsQuery ;
@@ -66,7 +67,7 @@ public Query parse(MultiMatchQueryBuilder.Type type, Map<String, Float> fieldNam
66
67
break ;
67
68
68
69
case CROSS_FIELDS :
69
- queries = buildCrossFieldQuery (type , fieldNames , value , minimumShouldMatch , tieBreaker );
70
+ queries = buildCrossFieldQuery (fieldNames , value , minimumShouldMatch , tieBreaker );
70
71
break ;
71
72
72
73
default :
@@ -108,15 +109,16 @@ private List<Query> buildFieldQueries(MultiMatchQueryBuilder.Type type, Map<Stri
108
109
return queries ;
109
110
}
110
111
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
+
113
115
Map <Analyzer , List <FieldAndBoost >> groups = new HashMap <>();
114
116
List <Query > queries = new ArrayList <>();
115
117
for (Map .Entry <String , Float > entry : fieldNames .entrySet ()) {
116
118
String name = entry .getKey ();
117
119
MappedFieldType fieldType = context .getFieldType (name );
118
120
if (fieldType != null ) {
119
- Analyzer actualAnalyzer = getAnalyzer (fieldType , type == MultiMatchQueryBuilder . Type . PHRASE );
121
+ Analyzer actualAnalyzer = getAnalyzer (fieldType , false );
120
122
if (groups .containsKey (actualAnalyzer ) == false ) {
121
123
groups .put (actualAnalyzer , new ArrayList <>());
122
124
}
@@ -130,7 +132,7 @@ private List<Query> buildCrossFieldQuery(MultiMatchQueryBuilder.Type type, Map<S
130
132
builder = new MatchQueryBuilder (group .getKey (), group .getValue ().get (0 ).fieldType ,
131
133
enablePositionIncrements , autoGenerateSynonymsPhraseQuery );
132
134
} else {
133
- builder = new BlendedQueryBuilder (group .getKey (), group .getValue (), tieBreaker ,
135
+ builder = new CrossFieldsQueryBuilder (group .getKey (), group .getValue (), tieBreaker ,
134
136
enablePositionIncrements , autoGenerateSynonymsPhraseQuery );
135
137
}
136
138
@@ -140,7 +142,11 @@ private List<Query> buildCrossFieldQuery(MultiMatchQueryBuilder.Type type, Map<S
140
142
* fields are already grouped by their analyzers/types.
141
143
*/
142
144
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
+
144
150
query = Queries .maybeApplyMinimumShouldMatch (query , minimumShouldMatch );
145
151
if (query != null ) {
146
152
if (group .getValue ().size () == 1 ) {
@@ -157,17 +163,32 @@ private List<Query> buildCrossFieldQuery(MultiMatchQueryBuilder.Type type, Map<S
157
163
return queries ;
158
164
}
159
165
160
- private class BlendedQueryBuilder extends MatchQueryBuilder {
166
+ private class CrossFieldsQueryBuilder extends MatchQueryBuilder {
161
167
private final List <FieldAndBoost > blendedFields ;
162
168
private final float tieBreaker ;
163
169
164
- BlendedQueryBuilder (Analyzer analyzer , List <FieldAndBoost > blendedFields , float tieBreaker ,
170
+ CrossFieldsQueryBuilder (Analyzer analyzer , List <FieldAndBoost > blendedFields , float tieBreaker ,
165
171
boolean enablePositionIncrements , boolean autoGenerateSynonymsPhraseQuery ) {
166
172
super (analyzer , blendedFields .get (0 ).fieldType , enablePositionIncrements , autoGenerateSynonymsPhraseQuery );
167
173
this .blendedFields = blendedFields ;
168
174
this .tieBreaker = tieBreaker ;
169
175
}
170
176
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
+
171
192
@ Override
172
193
protected Query newSynonymQuery (TermAndBoost [] terms ) {
173
194
BytesRef [] values = new BytesRef [terms .length ];
@@ -184,15 +205,7 @@ protected Query newTermQuery(Term term, float boost) {
184
205
185
206
@ Override
186
207
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" );
196
209
}
197
210
198
211
@ Override
0 commit comments