diff --git a/meilisearch/src/routes/indexes/search.rs b/meilisearch/src/routes/indexes/search.rs index 7f5acbd37..348d8295c 100644 --- a/meilisearch/src/routes/indexes/search.rs +++ b/meilisearch/src/routes/indexes/search.rs @@ -83,7 +83,7 @@ pub struct SearchQueryGet { pub hybrid_embedder: Option, #[deserr(default, error = DeserrQueryParamError)] pub hybrid_semantic_ratio: Option, - #[deserr(default, error = DeserrQueryParamError, default)] + #[deserr(default, error = DeserrQueryParamError)] pub ranking_score_threshold: Option, } diff --git a/meilisearch/src/search.rs b/meilisearch/src/search.rs index 23f9d3f79..2e218c73c 100644 --- a/meilisearch/src/search.rs +++ b/meilisearch/src/search.rs @@ -709,7 +709,9 @@ fn prepare_search<'t>( ) -> Result<(milli::Search<'t>, bool, usize, usize), MeilisearchHttpError> { let mut search = index.search(rtxn); search.time_budget(time_budget); - search.ranking_score_threshold(query.ranking_score_threshold.map(|rst| rst.0)); + if let Some(ranking_score_threshold) = query.ranking_score_threshold { + search.ranking_score_threshold(ranking_score_threshold.0); + } match search_kind { SearchKind::KeywordOnly => { diff --git a/milli/src/search/mod.rs b/milli/src/search/mod.rs index f7bcf6e7b..cbdd3af39 100644 --- a/milli/src/search/mod.rs +++ b/milli/src/search/mod.rs @@ -148,11 +148,8 @@ impl<'a> Search<'a> { self } - pub fn ranking_score_threshold( - &mut self, - ranking_score_threshold: Option, - ) -> &mut Search<'a> { - self.ranking_score_threshold = ranking_score_threshold; + pub fn ranking_score_threshold(&mut self, ranking_score_threshold: f64) -> &mut Search<'a> { + self.ranking_score_threshold = Some(ranking_score_threshold); self } diff --git a/milli/src/search/new/bucket_sort.rs b/milli/src/search/new/bucket_sort.rs index b15e735d0..d937c78bf 100644 --- a/milli/src/search/new/bucket_sort.rs +++ b/milli/src/search/new/bucket_sort.rs @@ -145,7 +145,6 @@ pub fn bucket_sort<'ctx, Q: RankingRuleQueryTrait>( ctx, from, length, - ranking_score_threshold, logger, &mut valid_docids, &mut valid_scores, @@ -167,6 +166,16 @@ pub fn bucket_sort<'ctx, Q: RankingRuleQueryTrait>( let bucket = std::mem::take(&mut ranking_rule_universes[cur_ranking_rule_index]); ranking_rule_scores.push(ScoreDetails::Skipped); + // remove candidates from the universe without adding them to result if their score is below the threshold + if let Some(ranking_score_threshold) = ranking_score_threshold { + let current_score = ScoreDetails::global_score(ranking_rule_scores.iter()); + if current_score < ranking_score_threshold { + all_candidates -= bucket | &ranking_rule_universes[cur_ranking_rule_index]; + back!(); + continue; + } + } + maybe_add_to_results!(bucket); ranking_rule_scores.pop(); @@ -225,6 +234,7 @@ pub fn bucket_sort<'ctx, Q: RankingRuleQueryTrait>( ranking_rule_universes[cur_ranking_rule_index].is_superset(&next_bucket.candidates) ); + // remove candidates from the universe without adding them to result if their score is below the threshold if let Some(ranking_score_threshold) = ranking_score_threshold { let current_score = ScoreDetails::global_score(ranking_rule_scores.iter()); if current_score < ranking_score_threshold { @@ -277,7 +287,6 @@ fn maybe_add_to_results<'ctx, Q: RankingRuleQueryTrait>( ctx: &mut SearchContext<'ctx>, from: usize, length: usize, - ranking_score_threshold: Option, logger: &mut dyn SearchLogger, valid_docids: &mut Vec, @@ -295,15 +304,6 @@ fn maybe_add_to_results<'ctx, Q: RankingRuleQueryTrait>( ranking_rule_scores: &[ScoreDetails], candidates: RoaringBitmap, ) -> Result<()> { - // remove candidates from the universe without adding them to result if their score is below the threshold - if let Some(ranking_score_threshold) = ranking_score_threshold { - let score = ScoreDetails::global_score(ranking_rule_scores.iter()); - if score < ranking_score_threshold { - *all_candidates -= candidates | &ranking_rule_universes[cur_ranking_rule_index]; - return Ok(()); - } - } - // First apply the distinct rule on the candidates, reducing the universes if necessary let candidates = if let Some(distinct_fid) = distinct_fid { let DistinctOutput { remaining, excluded } =