elasticsearch_dsl/search/queries/full_text/
match_query.rs1use crate::search::*;
2use crate::util::*;
3
4#[derive(Debug, Clone, PartialEq, Serialize)]
21#[serde(remote = "Self")]
22pub struct MatchQuery {
23 #[serde(skip)]
24 field: String,
25
26 #[serde(skip_serializing_if = "ShouldSkip::should_skip")]
27 query: Text,
28
29 #[serde(skip_serializing_if = "ShouldSkip::should_skip")]
30 analyzer: Option<String>,
31
32 #[serde(skip_serializing_if = "ShouldSkip::should_skip")]
33 auto_generate_synonyms_phrase_query: Option<bool>,
34
35 #[serde(skip_serializing_if = "ShouldSkip::should_skip")]
36 fuzziness: Option<Fuzziness>,
37
38 #[serde(skip_serializing_if = "ShouldSkip::should_skip")]
39 max_expansions: Option<u8>,
40
41 #[serde(skip_serializing_if = "ShouldSkip::should_skip")]
42 prefix_length: Option<u8>,
43
44 #[serde(skip_serializing_if = "ShouldSkip::should_skip")]
45 fuzzy_transpositions: Option<bool>,
46
47 #[serde(skip_serializing_if = "ShouldSkip::should_skip")]
48 fuzzy_rewrite: Option<Rewrite>,
49
50 #[serde(skip_serializing_if = "ShouldSkip::should_skip")]
51 lenient: Option<bool>,
52
53 #[serde(skip_serializing_if = "ShouldSkip::should_skip")]
54 operator: Option<Operator>,
55
56 #[serde(skip_serializing_if = "ShouldSkip::should_skip")]
57 minimum_should_match: Option<String>,
58
59 #[serde(skip_serializing_if = "ShouldSkip::should_skip")]
60 zero_terms_query: Option<ZeroTermsQuery>,
61
62 #[serde(skip_serializing_if = "ShouldSkip::should_skip")]
63 boost: Option<f32>,
64
65 #[serde(skip_serializing_if = "ShouldSkip::should_skip")]
66 _name: Option<String>,
67}
68
69impl Query {
70 pub fn r#match<T, U>(field: T, query: U) -> MatchQuery
82 where
83 T: ToString,
84 U: Into<Text>,
85 {
86 MatchQuery {
87 field: field.to_string(),
88 query: query.into(),
89 analyzer: None,
90 auto_generate_synonyms_phrase_query: None,
91 fuzziness: None,
92 max_expansions: None,
93 prefix_length: None,
94 fuzzy_transpositions: None,
95 fuzzy_rewrite: None,
96 lenient: None,
97 operator: None,
98 minimum_should_match: None,
99 zero_terms_query: None,
100 boost: None,
101 _name: None,
102 }
103 }
104}
105
106impl MatchQuery {
107 pub fn analyzer<T>(mut self, analyzer: T) -> Self
112 where
113 T: ToString,
114 {
115 self.analyzer = Some(analyzer.to_string());
116 self
117 }
118
119 pub fn auto_generate_synonyms_phrase_query(
126 mut self,
127 auto_generate_synonyms_phrase_query: bool,
128 ) -> Self {
129 self.auto_generate_synonyms_phrase_query = Some(auto_generate_synonyms_phrase_query);
130 self
131 }
132
133 pub fn fuzziness<T>(mut self, fuzziness: T) -> Self
139 where
140 T: Into<Fuzziness>,
141 {
142 self.fuzziness = Some(fuzziness.into());
143 self
144 }
145
146 pub fn max_expansions(mut self, max_expansions: u8) -> Self {
149 self.max_expansions = Some(max_expansions);
150 self
151 }
152
153 pub fn prefix_length(mut self, prefix_length: u8) -> Self {
156 self.prefix_length = Some(prefix_length);
157 self
158 }
159
160 pub fn fuzzy_transpositions(mut self, fuzzy_transpositions: bool) -> Self {
163 self.fuzzy_transpositions = Some(fuzzy_transpositions);
164 self
165 }
166
167 pub fn fuzzy_rewrite(mut self, fuzzy_rewrite: Rewrite) -> Self {
175 self.fuzzy_rewrite = Some(fuzzy_rewrite);
176 self
177 }
178
179 pub fn lenient(mut self, lenient: bool) -> Self {
184 self.lenient = Some(lenient);
185 self
186 }
187
188 pub fn operator(mut self, operator: Operator) -> Self {
190 self.operator = Some(operator);
191 self
192 }
193
194 pub fn minimum_should_match<T>(mut self, minimum_should_match: T) -> Self
197 where
198 T: ToString,
199 {
200 self.minimum_should_match = Some(minimum_should_match.to_string());
201 self
202 }
203
204 pub fn zero_terms_query(mut self, zero_terms_query: ZeroTermsQuery) -> Self {
207 self.zero_terms_query = Some(zero_terms_query);
208 self
209 }
210
211 add_boost_and_name!();
212}
213
214impl ShouldSkip for MatchQuery {
215 fn should_skip(&self) -> bool {
216 self.query.should_skip()
217 }
218}
219
220serialize_with_root_keyed!("match": MatchQuery);
221
222#[cfg(test)]
223mod tests {
224 use super::*;
225
226 #[test]
227 fn serialization() {
228 assert_serialize_query(
229 Query::r#match("test", "search text"),
230 json!({
231 "match": {
232 "test": {
233 "query": "search text"
234 }
235 }
236 }),
237 );
238
239 assert_serialize_query(
240 Query::r#match("test", "search text")
241 .analyzer("search_time_analyzer")
242 .auto_generate_synonyms_phrase_query(true)
243 .fuzziness(23)
244 .max_expansions(2)
245 .prefix_length(3)
246 .fuzzy_transpositions(false)
247 .fuzzy_rewrite(Rewrite::ConstantScoreBoolean)
248 .lenient(true)
249 .operator(Operator::And)
250 .minimum_should_match("22")
251 .zero_terms_query(ZeroTermsQuery::None)
252 .boost(2)
253 .name("test"),
254 json!({
255 "match": {
256 "test": {
257 "query": "search text",
258 "analyzer": "search_time_analyzer",
259 "auto_generate_synonyms_phrase_query": true,
260 "fuzziness": 23,
261 "max_expansions": 2,
262 "prefix_length": 3,
263 "fuzzy_transpositions": false,
264 "fuzzy_rewrite": "constant_score_boolean",
265 "lenient": true,
266 "operator": "AND",
267 "minimum_should_match": "22",
268 "zero_terms_query": "none",
269 "boost": 2.0,
270 "_name": "test"
271 }
272 }
273 }),
274 );
275 }
276}