From 522e79f2e0dec684cca7db9958f1851d43387db3 Mon Sep 17 00:00:00 2001 From: Alexey Shekhirin Date: Mon, 29 Mar 2021 19:07:22 +0300 Subject: [PATCH] feat(search, criteria): introduce a percentage threshold to the asc/desc --- milli/src/search/criteria/asc_desc.rs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/milli/src/search/criteria/asc_desc.rs b/milli/src/search/criteria/asc_desc.rs index 6b8afad2c..d4b85b2bf 100644 --- a/milli/src/search/criteria/asc_desc.rs +++ b/milli/src/search/criteria/asc_desc.rs @@ -19,6 +19,10 @@ use crate::search::WordDerivationsCache; use crate::{FieldsIdsMap, FieldId, Index}; use super::{Criterion, CriterionResult}; +/// If the number of candidates is lower or equal to the specified % of total number of documents, +/// use simple sort. Otherwise, use facet database. +const CANDIDATES_THRESHOLD: f64 = 0.1; + pub struct AscDesc<'t> { index: &'t Index, rtxn: &'t heed::RoTxn<'t>, @@ -237,7 +241,7 @@ fn field_id_facet_type( /// Returns an iterator over groups of the given candidates in ascending or descending order. /// -/// It will either use an iterative or a recusrsive method on the whole facet database depending +/// It will either use an iterative or a recursive method on the whole facet database depending /// on the number of candidates to rank. fn facet_ordered<'t>( index: &'t Index, @@ -248,9 +252,11 @@ fn facet_ordered<'t>( candidates: RoaringBitmap, ) -> anyhow::Result> + 't>> { + let number_of_documents = index.number_of_documents(&rtxn)? as f64; + match facet_type { FacetType::Float => { - if candidates.len() <= 1000 { + if candidates.len() / number_of_documents * 100 <= CANDIDATES_THRESHOLD { let iter = iterative_facet_ordered_iter::>( index, rtxn, field_id, ascending, candidates, )?; @@ -266,7 +272,7 @@ fn facet_ordered<'t>( } }, FacetType::Integer => { - if candidates.len() <= 1000 { + if candidates.len() / number_of_documents * 100 <= CANDIDATES_THRESHOLD { let iter = iterative_facet_ordered_iter::( index, rtxn, field_id, ascending, candidates, )?;