19
19
20
20
package org .elasticsearch .index .query ;
21
21
22
- import org .apache .lucene .search .Query ;
23
22
import org .elasticsearch .common .inject .Inject ;
24
- import org .elasticsearch .common .regex .Regex ;
25
23
import org .elasticsearch .common .unit .Fuzziness ;
26
24
import org .elasticsearch .common .xcontent .XContentParser ;
27
- import org .elasticsearch .index .query .support .QueryParsers ;
28
25
import org .elasticsearch .index .search .MatchQuery ;
29
- import org .elasticsearch .index .search .MultiMatchQuery ;
30
26
31
27
import java .io .IOException ;
32
28
import java .util .HashMap ;
35
31
/**
36
32
* Same as {@link MatchQueryParser} but has support for multiple fields.
37
33
*/
38
- public class MultiMatchQueryParser extends BaseQueryParserTemp {
34
+ public class MultiMatchQueryParser extends BaseQueryParser < MultiMatchQueryBuilder > {
39
35
40
36
@ Override
41
37
public String [] names () {
@@ -45,31 +41,41 @@ public String[] names() {
45
41
}
46
42
47
43
@ Override
48
- public Query parse (QueryShardContext context ) throws IOException , QueryParsingException {
49
- QueryParseContext parseContext = context .parseContext ();
44
+ public MultiMatchQueryBuilder fromXContent (QueryParseContext parseContext ) throws IOException , QueryParsingException {
50
45
XContentParser parser = parseContext .parser ();
51
46
52
47
Object value = null ;
53
- float boost = AbstractQueryBuilder .DEFAULT_BOOST ;
54
- Float tieBreaker = null ;
55
- MultiMatchQueryBuilder .Type type = null ;
56
- MultiMatchQuery multiMatchQuery = new MultiMatchQuery (context );
48
+ Map <String , Float > fieldsBoosts = new HashMap <>();
49
+ MultiMatchQueryBuilder .Type type = MultiMatchQueryBuilder .DEFAULT_TYPE ;
50
+ String analyzer = null ;
51
+ int slop = MultiMatchQueryBuilder .DEFAULT_PHRASE_SLOP ;
52
+ Fuzziness fuzziness = null ;
53
+ int prefixLength = MultiMatchQueryBuilder .DEFAULT_PREFIX_LENGTH ;
54
+ int maxExpansions = MultiMatchQueryBuilder .DEFAULT_MAX_EXPANSIONS ;
55
+ Operator operator = MultiMatchQueryBuilder .DEFAULT_OPERATOR ;
57
56
String minimumShouldMatch = null ;
58
- Map <String , Float > fieldNameWithBoosts = new HashMap <>();
57
+ String fuzzyRewrite = null ;
58
+ Boolean useDisMax = null ;
59
+ Float tieBreaker = null ;
60
+ Float cutoffFrequency = null ;
61
+ boolean lenient = MultiMatchQueryBuilder .DEFAULT_LENIENCY ;
62
+ MatchQuery .ZeroTermsQuery zeroTermsQuery = MultiMatchQueryBuilder .DEFAULT_ZERO_TERMS_QUERY ;
63
+
64
+ float boost = AbstractQueryBuilder .DEFAULT_BOOST ;
59
65
String queryName = null ;
66
+
60
67
XContentParser .Token token ;
61
68
String currentFieldName = null ;
62
- Boolean useDisMax = null ;
63
69
while ((token = parser .nextToken ()) != XContentParser .Token .END_OBJECT ) {
64
70
if (token == XContentParser .Token .FIELD_NAME ) {
65
71
currentFieldName = parser .currentName ();
66
72
} else if ("fields" .equals (currentFieldName )) {
67
73
if (token == XContentParser .Token .START_ARRAY ) {
68
74
while ((token = parser .nextToken ()) != XContentParser .Token .END_ARRAY ) {
69
- extractFieldAndBoost ( context , parser , fieldNameWithBoosts );
75
+ parseFieldAndBoost ( parser , fieldsBoosts );
70
76
}
71
77
} else if (token .isValue ()) {
72
- extractFieldAndBoost ( context , parser , fieldNameWithBoosts );
78
+ parseFieldAndBoost ( parser , fieldsBoosts );
73
79
} else {
74
80
throw new QueryParsingException (parseContext , "[" + MultiMatchQueryBuilder .NAME + "] query does not support [" + currentFieldName + "]" );
75
81
}
@@ -79,41 +85,37 @@ public Query parse(QueryShardContext context) throws IOException, QueryParsingEx
79
85
} else if ("type" .equals (currentFieldName )) {
80
86
type = MultiMatchQueryBuilder .Type .parse (parser .text (), parseContext .parseFieldMatcher ());
81
87
} else if ("analyzer" .equals (currentFieldName )) {
82
- String analyzer = parser .text ();
83
- if (context .analysisService ().analyzer (analyzer ) == null ) {
84
- throw new QueryParsingException (parseContext , "[" + MultiMatchQueryBuilder .NAME + "] analyzer [" + parser .text () + "] not found" );
85
- }
86
- multiMatchQuery .setAnalyzer (analyzer );
88
+ analyzer = parser .text ();
87
89
} else if ("boost" .equals (currentFieldName )) {
88
90
boost = parser .floatValue ();
89
91
} else if ("slop" .equals (currentFieldName ) || "phrase_slop" .equals (currentFieldName ) || "phraseSlop" .equals (currentFieldName )) {
90
- multiMatchQuery . setPhraseSlop ( parser .intValue () );
92
+ slop = parser .intValue ();
91
93
} else if (parseContext .parseFieldMatcher ().match (currentFieldName , Fuzziness .FIELD )) {
92
- multiMatchQuery . setFuzziness ( Fuzziness .parse (parser ) );
94
+ fuzziness = Fuzziness .parse (parser );
93
95
} else if ("prefix_length" .equals (currentFieldName ) || "prefixLength" .equals (currentFieldName )) {
94
- multiMatchQuery . setFuzzyPrefixLength ( parser .intValue () );
96
+ prefixLength = parser .intValue ();
95
97
} else if ("max_expansions" .equals (currentFieldName ) || "maxExpansions" .equals (currentFieldName )) {
96
- multiMatchQuery . setMaxExpansions ( parser .intValue () );
98
+ maxExpansions = parser .intValue ();
97
99
} else if ("operator" .equals (currentFieldName )) {
98
- multiMatchQuery . setOccur ( Operator .fromString (parser .text ()). toBooleanClauseOccur ());
100
+ operator = Operator .fromString (parser .text ());
99
101
} else if ("minimum_should_match" .equals (currentFieldName ) || "minimumShouldMatch" .equals (currentFieldName )) {
100
102
minimumShouldMatch = parser .textOrNull ();
101
103
} else if ("fuzzy_rewrite" .equals (currentFieldName ) || "fuzzyRewrite" .equals (currentFieldName )) {
102
- multiMatchQuery . setFuzzyRewriteMethod ( QueryParsers . parseRewriteMethod ( parseContext . parseFieldMatcher (), parser .textOrNull (), null ) );
104
+ fuzzyRewrite = parser .textOrNull ();
103
105
} else if ("use_dis_max" .equals (currentFieldName ) || "useDisMax" .equals (currentFieldName )) {
104
106
useDisMax = parser .booleanValue ();
105
107
} else if ("tie_breaker" .equals (currentFieldName ) || "tieBreaker" .equals (currentFieldName )) {
106
- multiMatchQuery . setTieBreaker ( tieBreaker = parser .floatValue () );
108
+ tieBreaker = parser .floatValue ();
107
109
} else if ("cutoff_frequency" .equals (currentFieldName )) {
108
- multiMatchQuery . setCommonTermsCutoff ( parser .floatValue () );
110
+ cutoffFrequency = parser .floatValue ();
109
111
} else if ("lenient" .equals (currentFieldName )) {
110
- multiMatchQuery . setLenient ( parser .booleanValue () );
112
+ lenient = parser .booleanValue ();
111
113
} else if ("zero_terms_query" .equals (currentFieldName )) {
112
114
String zeroTermsDocs = parser .text ();
113
115
if ("none" .equalsIgnoreCase (zeroTermsDocs )) {
114
- multiMatchQuery . setZeroTermsQuery ( MatchQuery .ZeroTermsQuery .NONE ) ;
116
+ zeroTermsQuery = MatchQuery .ZeroTermsQuery .NONE ;
115
117
} else if ("all" .equalsIgnoreCase (zeroTermsDocs )) {
116
- multiMatchQuery . setZeroTermsQuery ( MatchQuery .ZeroTermsQuery .ALL ) ;
118
+ zeroTermsQuery = MatchQuery .ZeroTermsQuery .ALL ;
117
119
} else {
118
120
throw new QueryParsingException (parseContext , "Unsupported zero_terms_docs value [" + zeroTermsDocs + "]" );
119
121
}
@@ -129,37 +131,33 @@ public Query parse(QueryShardContext context) throws IOException, QueryParsingEx
129
131
throw new QueryParsingException (parseContext , "No text specified for multi_match query" );
130
132
}
131
133
132
- if (fieldNameWithBoosts .isEmpty ()) {
134
+ if (fieldsBoosts .isEmpty ()) {
133
135
throw new QueryParsingException (parseContext , "No fields specified for multi_match query" );
134
136
}
135
- if (type == null ) {
136
- type = MultiMatchQueryBuilder .Type .BEST_FIELDS ;
137
- }
138
- if (useDisMax != null ) { // backwards foobar
139
- boolean typeUsesDismax = type .tieBreaker () != 1.0f ;
140
- if (typeUsesDismax != useDisMax ) {
141
- if (useDisMax && tieBreaker == null ) {
142
- multiMatchQuery .setTieBreaker (0.0f );
143
- } else {
144
- multiMatchQuery .setTieBreaker (1.0f );
145
- }
146
- }
147
- }
148
- Query query = multiMatchQuery .parse (type , fieldNameWithBoosts , value , minimumShouldMatch );
149
- if (query == null ) {
150
- return null ;
151
- }
152
137
153
- query .setBoost (boost );
154
- if (queryName != null ) {
155
- context .addNamedQuery (queryName , query );
156
- }
157
- return query ;
138
+ return new MultiMatchQueryBuilder (value )
139
+ .fields (fieldsBoosts )
140
+ .type (type )
141
+ .analyzer (analyzer )
142
+ .cutoffFrequency (cutoffFrequency )
143
+ .fuzziness (fuzziness )
144
+ .fuzzyRewrite (fuzzyRewrite )
145
+ .useDisMax (useDisMax )
146
+ .lenient (lenient )
147
+ .maxExpansions (maxExpansions )
148
+ .minimumShouldMatch (minimumShouldMatch )
149
+ .operator (operator )
150
+ .prefixLength (prefixLength )
151
+ .slop (slop )
152
+ .tieBreaker (tieBreaker )
153
+ .zeroTermsQuery (zeroTermsQuery )
154
+ .boost (boost )
155
+ .queryName (queryName );
158
156
}
159
157
160
- private void extractFieldAndBoost ( QueryShardContext context , XContentParser parser , Map <String , Float > fieldNameWithBoosts ) throws IOException {
158
+ private void parseFieldAndBoost ( XContentParser parser , Map <String , Float > fieldsBoosts ) throws IOException {
161
159
String fField = null ;
162
- Float fBoost = null ;
160
+ Float fBoost = AbstractQueryBuilder . DEFAULT_BOOST ;
163
161
char [] fieldText = parser .textCharacters ();
164
162
int end = parser .textOffset () + parser .textLength ();
165
163
for (int i = parser .textOffset (); i < end ; i ++) {
@@ -173,14 +171,7 @@ private void extractFieldAndBoost(QueryShardContext context, XContentParser pars
173
171
if (fField == null ) {
174
172
fField = parser .text ();
175
173
}
176
-
177
- if (Regex .isSimpleMatchPattern (fField )) {
178
- for (String field : context .mapperService ().simpleMatchToIndexNames (fField )) {
179
- fieldNameWithBoosts .put (field , fBoost );
180
- }
181
- } else {
182
- fieldNameWithBoosts .put (fField , fBoost );
183
- }
174
+ fieldsBoosts .put (fField , fBoost );
184
175
}
185
176
186
177
@ Override
0 commit comments