mirror of
				https://github.com/meilisearch/meilisearch.git
				synced 2025-10-31 07:56:28 +00:00 
			
		
		
		
	feat(all): introduce disable typos
This commit is contained in:
		
							
								
								
									
										567
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										567
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -161,6 +161,13 @@ make_setting_route!( | ||||
|     "displayedAttributes" | ||||
| ); | ||||
|  | ||||
| make_setting_route!( | ||||
|     "/typo", | ||||
|     meilisearch_lib::index::updates::TypoSettings, | ||||
|     typo, | ||||
|     "typo" | ||||
| ); | ||||
|  | ||||
| make_setting_route!( | ||||
|     "/searchable-attributes", | ||||
|     Vec<String>, | ||||
| @@ -246,7 +253,8 @@ generate_configure!( | ||||
|     distinct_attribute, | ||||
|     stop_words, | ||||
|     synonyms, | ||||
|     ranking_rules | ||||
|     ranking_rules, | ||||
|     typo | ||||
| ); | ||||
|  | ||||
| pub async fn update_all( | ||||
|   | ||||
| @@ -43,7 +43,7 @@ async fn get_settings() { | ||||
|     let (response, code) = index.settings().await; | ||||
|     assert_eq!(code, 200); | ||||
|     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["searchableAttributes"], json!(["*"])); | ||||
|     assert_eq!(settings["filterableAttributes"], json!([])); | ||||
|   | ||||
| @@ -17,6 +17,7 @@ use crate::EnvSizer; | ||||
|  | ||||
| use super::error::IndexError; | ||||
| use super::error::Result; | ||||
| use super::updates::TypoSettings; | ||||
| use super::{Checked, Settings}; | ||||
|  | ||||
| pub type Document = Map<String, Value>; | ||||
| @@ -168,6 +169,10 @@ impl Index { | ||||
|             }) | ||||
|             .collect(); | ||||
|  | ||||
|         let typo_tolerance = TypoSettings { | ||||
|             enabled: Setting::Set(self.authorize_typos(txn)?), | ||||
|         }; | ||||
|  | ||||
|         Ok(Settings { | ||||
|             displayed_attributes: match displayed_attributes { | ||||
|                 Some(attrs) => Setting::Set(attrs), | ||||
| @@ -186,6 +191,7 @@ impl Index { | ||||
|                 None => Setting::Reset, | ||||
|             }, | ||||
|             synonyms: Setting::Set(synonyms), | ||||
|             typo: Setting::Set(typo_tolerance), | ||||
|             _kind: PhantomData, | ||||
|         }) | ||||
|     } | ||||
|   | ||||
| @@ -37,6 +37,15 @@ pub struct Checked; | ||||
| #[derive(Clone, Default, Debug, Serialize, Deserialize, PartialEq)] | ||||
| 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 | ||||
| /// 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>`. | ||||
| @@ -80,6 +89,9 @@ pub struct Settings<T> { | ||||
|     #[serde(default, skip_serializing_if = "Setting::is_not_set")] | ||||
|     #[cfg_attr(test, proptest(strategy = "test::setting_strategy()"))] | ||||
|     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)] | ||||
|     pub _kind: PhantomData<T>, | ||||
| @@ -96,6 +108,7 @@ impl Settings<Checked> { | ||||
|             stop_words: Setting::Reset, | ||||
|             synonyms: Setting::Reset, | ||||
|             distinct_attribute: Setting::Reset, | ||||
|             typo: Setting::Reset, | ||||
|             _kind: PhantomData, | ||||
|         } | ||||
|     } | ||||
| @@ -110,6 +123,7 @@ impl Settings<Checked> { | ||||
|             stop_words, | ||||
|             synonyms, | ||||
|             distinct_attribute, | ||||
|             typo: typo_tolerance, | ||||
|             .. | ||||
|         } = self; | ||||
|  | ||||
| @@ -122,6 +136,7 @@ impl Settings<Checked> { | ||||
|             stop_words, | ||||
|             synonyms, | ||||
|             distinct_attribute, | ||||
|             typo: typo_tolerance, | ||||
|             _kind: PhantomData, | ||||
|         } | ||||
|     } | ||||
| @@ -160,6 +175,7 @@ impl Settings<Unchecked> { | ||||
|             stop_words: self.stop_words, | ||||
|             synonyms: self.synonyms, | ||||
|             distinct_attribute: self.distinct_attribute, | ||||
|             typo: self.typo, | ||||
|             _kind: PhantomData, | ||||
|         } | ||||
|     } | ||||
| @@ -334,6 +350,19 @@ pub fn apply_settings_to_builder( | ||||
|         Setting::Reset => builder.reset_distinct_field(), | ||||
|         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)] | ||||
| @@ -362,6 +391,7 @@ pub(crate) mod test { | ||||
|             stop_words: Setting::NotSet, | ||||
|             synonyms: Setting::NotSet, | ||||
|             distinct_attribute: Setting::NotSet, | ||||
|             typo: Setting::NotSet, | ||||
|             _kind: PhantomData::<Unchecked>, | ||||
|         }; | ||||
|  | ||||
| @@ -383,6 +413,7 @@ pub(crate) mod test { | ||||
|             stop_words: Setting::NotSet, | ||||
|             synonyms: Setting::NotSet, | ||||
|             distinct_attribute: Setting::NotSet, | ||||
|             typo: Setting::NotSet, | ||||
|             _kind: PhantomData::<Unchecked>, | ||||
|         }; | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user