From 794554c1b74d737e5971d30f3584f5f893147a0f Mon Sep 17 00:00:00 2001 From: ManyTheFish Date: Wed, 23 Jul 2025 12:13:53 +0200 Subject: [PATCH] refactor(personalization): improve Cohere reranking logic and error handling - Replace and_then() with early return for missing personalization - Simplify reranking by building new hits vector instead of swapping - Add debug logging for reranked indices - Fix potential index out-of-bounds issues in reranking --- crates/meilisearch/src/personalization/mod.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/crates/meilisearch/src/personalization/mod.rs b/crates/meilisearch/src/personalization/mod.rs index 06f22bee4..490fb78aa 100644 --- a/crates/meilisearch/src/personalization/mod.rs +++ b/crates/meilisearch/src/personalization/mod.rs @@ -23,7 +23,8 @@ impl CohereService { query: Option<&str>, ) -> Result { // Extract user context from personalization - let user_context = personalize.and_then(|p| p.user_context.as_deref()); + let Some(personalize) = personalize else { return Ok(search_result) }; + let user_context = personalize.user_context.as_deref(); // Build the prompt by merging query and user context let prompt = match (query, user_context) { @@ -64,13 +65,12 @@ impl CohereService { // Create a mapping from original index to new rank let reranked_indices: Vec = rerank_response.iter().map(|result| result.index as usize).collect(); + debug!("Reranked indices: {:?}", reranked_indices); // Reorder the hits based on Cohere's reranking - let mut reranked_hits = search_result.hits.clone(); - for (new_index, original_index) in reranked_indices.iter().enumerate() { - if *original_index < reranked_hits.len() { - reranked_hits.swap(new_index, *original_index); - } + let mut reranked_hits = Vec::new(); + for index in reranked_indices.iter() { + reranked_hits.push(search_result.hits[*index].clone()); } Ok(SearchResult { hits: reranked_hits, ..search_result })