2249: feat(all): introduce disable typos r=irevoire a=MarinPostma

Introduce the disable typo setting, that allows disabling typos for an index.

waiting on https://github.com/meilisearch/milli/pull/469

Co-authored-by: ad hoc <postma.marin@protonmail.com>
This commit is contained in:
bors[bot] 2022-04-06 16:55:46 +00:00 committed by GitHub
commit 065fe19452
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 395 additions and 221 deletions

567
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -161,6 +161,13 @@ make_setting_route!(
"displayedAttributes" "displayedAttributes"
); );
make_setting_route!(
"/typo",
meilisearch_lib::index::updates::TypoSettings,
typo,
"typo"
);
make_setting_route!( make_setting_route!(
"/searchable-attributes", "/searchable-attributes",
Vec<String>, Vec<String>,
@ -246,7 +253,8 @@ generate_configure!(
distinct_attribute, distinct_attribute,
stop_words, stop_words,
synonyms, synonyms,
ranking_rules ranking_rules,
typo
); );
pub async fn update_all( pub async fn update_all(

View File

@ -43,7 +43,7 @@ async fn get_settings() {
let (response, code) = index.settings().await; let (response, code) = index.settings().await;
assert_eq!(code, 200); assert_eq!(code, 200);
let settings = response.as_object().unwrap(); let settings = response.as_object().unwrap();
assert_eq!(settings.keys().len(), 8); assert_eq!(settings.keys().len(), 9);
assert_eq!(settings["displayedAttributes"], json!(["*"])); assert_eq!(settings["displayedAttributes"], json!(["*"]));
assert_eq!(settings["searchableAttributes"], json!(["*"])); assert_eq!(settings["searchableAttributes"], json!(["*"]));
assert_eq!(settings["filterableAttributes"], json!([])); assert_eq!(settings["filterableAttributes"], json!([]));

View File

@ -17,6 +17,7 @@ use crate::EnvSizer;
use super::error::IndexError; use super::error::IndexError;
use super::error::Result; use super::error::Result;
use super::updates::TypoSettings;
use super::{Checked, Settings}; use super::{Checked, Settings};
pub type Document = Map<String, Value>; pub type Document = Map<String, Value>;
@ -168,6 +169,10 @@ impl Index {
}) })
.collect(); .collect();
let typo_tolerance = TypoSettings {
enabled: Setting::Set(self.authorize_typos(txn)?),
};
Ok(Settings { Ok(Settings {
displayed_attributes: match displayed_attributes { displayed_attributes: match displayed_attributes {
Some(attrs) => Setting::Set(attrs), Some(attrs) => Setting::Set(attrs),
@ -186,6 +191,7 @@ impl Index {
None => Setting::Reset, None => Setting::Reset,
}, },
synonyms: Setting::Set(synonyms), synonyms: Setting::Set(synonyms),
typo: Setting::Set(typo_tolerance),
_kind: PhantomData, _kind: PhantomData,
}) })
} }

View File

@ -37,6 +37,15 @@ pub struct Checked;
#[derive(Clone, Default, Debug, Serialize, Deserialize, PartialEq)] #[derive(Clone, Default, Debug, Serialize, Deserialize, PartialEq)]
pub struct Unchecked; pub struct Unchecked;
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
#[serde(deny_unknown_fields)]
#[serde(rename_all = "camelCase")]
#[cfg_attr(test, derive(proptest_derive::Arbitrary))]
pub struct TypoSettings {
#[cfg_attr(test, proptest(strategy = "test::setting_strategy()"))]
#[serde(default, skip_serializing_if = "Setting::is_not_set")]
pub enabled: Setting<bool>,
}
/// Holds all the settings for an index. `T` can either be `Checked` if they represents settings /// Holds all the settings for an index. `T` can either be `Checked` if they represents settings
/// whose validity is guaranteed, or `Unchecked` if they need to be validated. In the later case, a /// whose validity is guaranteed, or `Unchecked` if they need to be validated. In the later case, a
/// call to `check` will return a `Settings<Checked>` from a `Settings<Unchecked>`. /// call to `check` will return a `Settings<Checked>` from a `Settings<Unchecked>`.
@ -80,6 +89,9 @@ pub struct Settings<T> {
#[serde(default, skip_serializing_if = "Setting::is_not_set")] #[serde(default, skip_serializing_if = "Setting::is_not_set")]
#[cfg_attr(test, proptest(strategy = "test::setting_strategy()"))] #[cfg_attr(test, proptest(strategy = "test::setting_strategy()"))]
pub distinct_attribute: Setting<String>, pub distinct_attribute: Setting<String>,
#[serde(default, skip_serializing_if = "Setting::is_not_set")]
#[cfg_attr(test, proptest(strategy = "test::setting_strategy()"))]
pub typo: Setting<TypoSettings>,
#[serde(skip)] #[serde(skip)]
pub _kind: PhantomData<T>, pub _kind: PhantomData<T>,
@ -96,6 +108,7 @@ impl Settings<Checked> {
stop_words: Setting::Reset, stop_words: Setting::Reset,
synonyms: Setting::Reset, synonyms: Setting::Reset,
distinct_attribute: Setting::Reset, distinct_attribute: Setting::Reset,
typo: Setting::Reset,
_kind: PhantomData, _kind: PhantomData,
} }
} }
@ -110,6 +123,7 @@ impl Settings<Checked> {
stop_words, stop_words,
synonyms, synonyms,
distinct_attribute, distinct_attribute,
typo: typo_tolerance,
.. ..
} = self; } = self;
@ -122,6 +136,7 @@ impl Settings<Checked> {
stop_words, stop_words,
synonyms, synonyms,
distinct_attribute, distinct_attribute,
typo: typo_tolerance,
_kind: PhantomData, _kind: PhantomData,
} }
} }
@ -160,6 +175,7 @@ impl Settings<Unchecked> {
stop_words: self.stop_words, stop_words: self.stop_words,
synonyms: self.synonyms, synonyms: self.synonyms,
distinct_attribute: self.distinct_attribute, distinct_attribute: self.distinct_attribute,
typo: self.typo,
_kind: PhantomData, _kind: PhantomData,
} }
} }
@ -334,6 +350,19 @@ pub fn apply_settings_to_builder(
Setting::Reset => builder.reset_distinct_field(), Setting::Reset => builder.reset_distinct_field(),
Setting::NotSet => (), Setting::NotSet => (),
} }
match settings.typo {
Setting::Set(ref value) => match value.enabled {
Setting::Set(val) => builder.set_autorize_typos(val),
Setting::Reset => builder.reset_authorize_typos(),
Setting::NotSet => (),
},
Setting::Reset => {
// all typo settings need to be reset here.
builder.reset_authorize_typos();
}
Setting::NotSet => (),
}
} }
#[cfg(test)] #[cfg(test)]
@ -362,6 +391,7 @@ pub(crate) mod test {
stop_words: Setting::NotSet, stop_words: Setting::NotSet,
synonyms: Setting::NotSet, synonyms: Setting::NotSet,
distinct_attribute: Setting::NotSet, distinct_attribute: Setting::NotSet,
typo: Setting::NotSet,
_kind: PhantomData::<Unchecked>, _kind: PhantomData::<Unchecked>,
}; };
@ -383,6 +413,7 @@ pub(crate) mod test {
stop_words: Setting::NotSet, stop_words: Setting::NotSet,
synonyms: Setting::NotSet, synonyms: Setting::NotSet,
distinct_attribute: Setting::NotSet, distinct_attribute: Setting::NotSet,
typo: Setting::NotSet,
_kind: PhantomData::<Unchecked>, _kind: PhantomData::<Unchecked>,
}; };