use serde::Serialize;
use crate::{search::*, util::*};
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
#[serde(remote = "Self")]
pub struct FuzzyQuery {
#[serde(skip)]
field: String,
value: Option<Term>,
#[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")]
transpositions: Option<bool>,
#[serde(default, skip_serializing_if = "ShouldSkip::should_skip")]
rewrite: Option<Rewrite>,
#[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 fuzzy<T, U>(field: T, value: U) -> FuzzyQuery
where
T: ToString,
U: Serialize,
{
FuzzyQuery {
field: field.to_string(),
value: Term::new(value),
fuzziness: None,
max_expansions: None,
prefix_length: None,
transpositions: None,
rewrite: None,
boost: None,
_name: None,
}
}
}
impl FuzzyQuery {
add_boost_and_name!();
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 transpositions(mut self, transpositions: bool) -> Self {
self.transpositions = Some(transpositions);
self
}
pub fn rewrite(mut self, rewrite: Rewrite) -> Self {
self.rewrite = Some(rewrite);
self
}
}
impl ShouldSkip for FuzzyQuery {
fn should_skip(&self) -> bool {
self.value.should_skip()
}
}
serialize_with_root_keyed!("fuzzy": FuzzyQuery);
deserialize_with_root_keyed!("fuzzy": FuzzyQuery);
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn serialization() {
assert_serialize_query(
Query::fuzzy("test", 123),
json!({
"fuzzy": {
"test": {
"value": 123
}
}
}),
);
assert_serialize_query(
Query::fuzzy("test", 123)
.fuzziness(Fuzziness::Auto)
.max_expansions(3)
.prefix_length(4)
.transpositions(false)
.rewrite(Rewrite::ScoringBoolean)
.boost(2)
.name("test"),
json!({
"fuzzy": {
"test": {
"value": 123,
"fuzziness": "AUTO",
"max_expansions": 3,
"prefix_length": 4,
"transpositions": false,
"rewrite": "scoring_boolean",
"boost": 2.0,
"_name": "test"
}
}
}),
);
assert_serialize_query(
Query::bool().filter(Query::fuzzy("test", None::<String>)),
json!({ "bool": {} }),
)
}
}