diff --git a/CHANGELOG.md b/CHANGELOG.md index 2f4f2c168..3cfee1483 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,7 +14,7 @@ - Fix setting consistency bug (#1128) - Fix attributes to retrieve bug (#1131) - Increase default payload size (#1147) - - Improvements to code quality (#1167, #1165, #1126, #1161) + - Improvements to code quality (#1167, #1165, #1126, #1151) ## v0.17.0 - 2020-11-30 - Fix corrupted data during placeholder search (#1089) diff --git a/meilisearch-core/src/update/settings_update.rs b/meilisearch-core/src/update/settings_update.rs index e96d5702c..c9d40fa1b 100644 --- a/meilisearch-core/src/update/settings_update.rs +++ b/meilisearch-core/src/update/settings_update.rs @@ -1,7 +1,7 @@ use std::{borrow::Cow, collections::{BTreeMap, BTreeSet}}; use heed::Result as ZResult; -use fst::{set::OpBuilder, SetBuilder}; +use fst::{SetBuilder, set::OpBuilder}; use sdset::SetBuf; use meilisearch_schema::Schema; use meilisearch_tokenizer::analyzer::{Analyzer, AnalyzerConfig}; @@ -298,16 +298,23 @@ pub fn apply_synonyms_update( .tokens() .fold(String::new(), |s, t| s + t.text()) } + + // normalize synonyms and reorder them creating a BTreeMap + let synonyms: BTreeMap> = synonyms.into_iter().map( |(word, alternatives)| { + let word = normalize(&analyzer, &word); + let alternatives = alternatives.into_iter().map(|text| normalize(&analyzer, &text)).collect(); + (word, alternatives) + }).collect(); + + // index synonyms, + // synyonyms have to be ordered by key before indexation let mut synonyms_builder = SetBuilder::memory(); synonyms_store.clear(writer)?; for (word, alternatives) in synonyms { - let word = normalize(&analyzer, &word); - synonyms_builder.insert(&word)?; let alternatives = { - let alternatives = alternatives.iter().map(|text| normalize(&analyzer, &text)).collect(); let alternatives = SetBuf::from_dirty(alternatives); let mut alternatives_builder = SetBuilder::memory(); alternatives_builder.extend_iter(alternatives)?; diff --git a/meilisearch-http/src/routes/document.rs b/meilisearch-http/src/routes/document.rs index e529839c7..202575cc3 100644 --- a/meilisearch-http/src/routes/document.rs +++ b/meilisearch-http/src/routes/document.rs @@ -175,7 +175,6 @@ async fn update_multiple_documents( .ok_or(meilisearch_core::Error::SchemaMissing)?; match (params.into_inner().primary_key, schema.primary_key()) { - (Some(_), Some(_)) => return Err(meilisearch_schema::Error::PrimaryKeyAlreadyPresent.into()), (Some(key), None) => document_addition.set_primary_key(key), (None, None) => { let key = body @@ -184,7 +183,7 @@ async fn update_multiple_documents( .ok_or(meilisearch_core::Error::MissingPrimaryKey)?; document_addition.set_primary_key(key); } - (None, Some(_)) => () + _ => () } for document in body.into_inner() { diff --git a/meilisearch-http/tests/settings.rs b/meilisearch-http/tests/settings.rs index 6b125c13a..98973b56f 100644 --- a/meilisearch-http/tests/settings.rs +++ b/meilisearch-http/tests/settings.rs @@ -171,6 +171,8 @@ async fn write_all_and_update() { "synonyms": { "road": ["street", "avenue"], "street": ["avenue"], + "HP": ["Harry Potter"], + "Harry Potter": ["HP"] }, "attributesForFaceting": ["title"], }); @@ -208,6 +210,8 @@ async fn write_all_and_update() { "synonyms": { "road": ["street", "avenue"], "street": ["avenue"], + "hp": ["harry potter"], + "harry potter": ["hp"] }, "attributesForFaceting": ["title"], });