diff --git a/crates/meilisearch-types/src/error.rs b/crates/meilisearch-types/src/error.rs index f64301b8c..b189004f6 100644 --- a/crates/meilisearch-types/src/error.rs +++ b/crates/meilisearch-types/src/error.rs @@ -281,6 +281,7 @@ InvalidSearchCropMarker , InvalidRequest , BAD_REQUEST ; InvalidSearchFacets , InvalidRequest , BAD_REQUEST ; InvalidSearchSemanticRatio , InvalidRequest , BAD_REQUEST ; InvalidSearchLocales , InvalidRequest , BAD_REQUEST ; +InvalidFacetSearchExhaustiveFacetCount, InvalidRequest , BAD_REQUEST ; InvalidFacetSearchFacetName , InvalidRequest , BAD_REQUEST ; InvalidSimilarId , InvalidRequest , BAD_REQUEST ; InvalidSearchFilter , InvalidRequest , BAD_REQUEST ; diff --git a/crates/meilisearch/src/routes/indexes/facet_search.rs b/crates/meilisearch/src/routes/indexes/facet_search.rs index e795a22f9..804890346 100644 --- a/crates/meilisearch/src/routes/indexes/facet_search.rs +++ b/crates/meilisearch/src/routes/indexes/facet_search.rs @@ -68,6 +68,8 @@ pub struct FacetSearchQuery { pub ranking_score_threshold: Option, #[deserr(default, error = DeserrJsonError, default)] pub locales: Option>, + #[deserr(default, error = DeserrJsonError, default)] + pub exhaustive_facet_count: Option, } #[derive(Default)] @@ -98,6 +100,7 @@ impl FacetSearchAggregator { hybrid, ranking_score_threshold, locales, + exhaustive_facet_count, } = query; Self { @@ -110,7 +113,8 @@ impl FacetSearchAggregator { || attributes_to_search_on.is_some() || hybrid.is_some() || ranking_score_threshold.is_some() - || locales.is_some(), + || locales.is_some() + || exhaustive_facet_count.is_some(), ..Default::default() } } @@ -293,13 +297,24 @@ impl From for SearchQuery { hybrid, ranking_score_threshold, locales, + exhaustive_facet_count, } = value; + // If exhaustive_facet_count is true, we need to set the page to 0 + // because the facet search is not exhaustive by default. + let page = if exhaustive_facet_count.map_or(false, |exhaustive| exhaustive) { + // setting the page to 0 will force the search to be exhaustive when computing the number of hits, + // but it will skip the bucket sort saving time. + Some(0) + } else { + None + }; + SearchQuery { q, offset: DEFAULT_SEARCH_OFFSET(), limit: DEFAULT_SEARCH_LIMIT(), - page: None, + page, hits_per_page: None, attributes_to_retrieve: None, retrieve_vectors: false,