use crate::{search::*, util::*};
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
#[serde(remote = "Self")]
pub struct MatchQuery {
#[serde(skip)]
field: String,
#[serde(default, skip_serializing_if = "ShouldSkip::should_skip")]
query: Text,
#[serde(default, skip_serializing_if = "ShouldSkip::should_skip")]
analyzer: Option<String>,
#[serde(default, skip_serializing_if = "ShouldSkip::should_skip")]
auto_generate_synonyms_phrase_query: Option<bool>,
#[serde(default, skip_serializing_if = "ShouldSkip::should_skip")]
fuzziness: Option<Fuzziness>,
#[serde(default, skip_serializing_if = "ShouldSkip::should_skip")]
max_expansions: Option<u8>,
#[serde(default, skip_serializing_if = "ShouldSkip::should_skip")]
prefix_length: Option<u8>,
#[serde(default, skip_serializing_if = "ShouldSkip::should_skip")]
fuzzy_transpositions: Option<bool>,
#[serde(default, skip_serializing_if = "ShouldSkip::should_skip")]
fuzzy_rewrite: Option<Rewrite>,
#[serde(default, skip_serializing_if = "ShouldSkip::should_skip")]
lenient: Option<bool>,
#[serde(default, skip_serializing_if = "ShouldSkip::should_skip")]
operator: Option<Operator>,
#[serde(default, skip_serializing_if = "ShouldSkip::should_skip")]
minimum_should_match: Option<String>,
#[serde(default, skip_serializing_if = "ShouldSkip::should_skip")]
zero_terms_query: Option<ZeroTermsQuery>,
#[serde(default, skip_serializing_if = "ShouldSkip::should_skip")]
boost: Option<f32>,
#[serde(default, skip_serializing_if = "ShouldSkip::should_skip")]
_name: Option<String>,
}
impl Query {
pub fn r#match<T, U>(field: T, query: U) -> MatchQuery
where
T: ToString,
U: Into<Text>,
{
MatchQuery {
field: field.to_string(),
query: query.into(),
analyzer: None,
auto_generate_synonyms_phrase_query: None,
fuzziness: None,
max_expansions: None,
prefix_length: None,
fuzzy_transpositions: None,
fuzzy_rewrite: None,
lenient: None,
operator: None,
minimum_should_match: None,
zero_terms_query: None,
boost: None,
_name: None,
}
}
}
impl MatchQuery {
add_boost_and_name!();
pub fn analyzer<T>(mut self, analyzer: T) -> Self
where
T: ToString,
{
self.analyzer = Some(analyzer.to_string());
self
}
pub fn auto_generate_synonyms_phrase_query(
mut self,
auto_generate_synonyms_phrase_query: bool,
) -> Self {
self.auto_generate_synonyms_phrase_query = Some(auto_generate_synonyms_phrase_query);
self
}
pub fn fuzziness<T>(mut self, fuzziness: T) -> Self
where
T: Into<Fuzziness>,
{
self.fuzziness = Some(fuzziness.into());
self
}
pub fn max_expansions(mut self, max_expansions: u8) -> Self {
self.max_expansions = Some(max_expansions);
self
}
pub fn prefix_length(mut self, prefix_length: u8) -> Self {
self.prefix_length = Some(prefix_length);
self
}
pub fn fuzzy_transpositions(mut self, fuzzy_transpositions: bool) -> Self {
self.fuzzy_transpositions = Some(fuzzy_transpositions);
self
}
pub fn fuzzy_rewrite(mut self, fuzzy_rewrite: Rewrite) -> Self {
self.fuzzy_rewrite = Some(fuzzy_rewrite);
self
}
pub fn lenient(mut self, lenient: bool) -> Self {
self.lenient = Some(lenient);
self
}
pub fn operator(mut self, operator: Operator) -> Self {
self.operator = Some(operator);
self
}
pub fn minimum_should_match<T>(mut self, minimum_should_match: T) -> Self
where
T: ToString,
{
self.minimum_should_match = Some(minimum_should_match.to_string());
self
}
pub fn zero_terms_query(mut self, zero_terms_query: ZeroTermsQuery) -> Self {
self.zero_terms_query = Some(zero_terms_query);
self
}
}
impl ShouldSkip for MatchQuery {
fn should_skip(&self) -> bool {
self.query.should_skip()
}
}
serialize_with_root_keyed!("match": MatchQuery);
deserialize_with_root_keyed!("match": MatchQuery);
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn serialization() {
assert_serialize_query(
Query::r#match("test", "search text"),
json!({
"match": {
"test": {
"query": "search text"
}
}
}),
);
assert_serialize_query(
Query::r#match("test", "search text")
.analyzer("search_time_analyzer")
.auto_generate_synonyms_phrase_query(true)
.fuzziness(23)
.max_expansions(2)
.prefix_length(3)
.fuzzy_transpositions(false)
.fuzzy_rewrite(Rewrite::ConstantScoreBoolean)
.lenient(true)
.operator(Operator::And)
.minimum_should_match("22")
.zero_terms_query(ZeroTermsQuery::None)
.boost(2)
.name("test"),
json!({
"match": {
"test": {
"query": "search text",
"analyzer": "search_time_analyzer",
"auto_generate_synonyms_phrase_query": true,
"fuzziness": 23,
"max_expansions": 2,
"prefix_length": 3,
"fuzzy_transpositions": false,
"fuzzy_rewrite": "constant_score_boolean",
"lenient": true,
"operator": "AND",
"minimum_should_match": "22",
"zero_terms_query": "none",
"boost": 2.0,
"_name": "test"
}
}
}),
);
}
}