From 4564a38ae7d94ce36cc3a20a34b59bea6162d534 Mon Sep 17 00:00:00 2001 From: Louis Dureuil Date: Thu, 28 Mar 2024 12:06:59 +0100 Subject: [PATCH] Bail earlier when the experimental feature is not enabled --- .../src/routes/indexes/facet_search.rs | 4 ++-- meilisearch/src/routes/indexes/search.rs | 21 ++++++++++++------- meilisearch/src/routes/multi_search.rs | 13 ++++++------ meilisearch/src/search.rs | 17 ++------------- 4 files changed, 24 insertions(+), 31 deletions(-) diff --git a/meilisearch/src/routes/indexes/facet_search.rs b/meilisearch/src/routes/indexes/facet_search.rs index 56880a472..4d6950988 100644 --- a/meilisearch/src/routes/indexes/facet_search.rs +++ b/meilisearch/src/routes/indexes/facet_search.rs @@ -74,10 +74,10 @@ pub async fn search( let index = index_scheduler.index(&index_uid)?; let features = index_scheduler.features(); - let search_kind = search_kind(&search_query, &index_scheduler, &index)?; + let search_kind = search_kind(&search_query, &index_scheduler, &index, features)?; let _permit = search_queue.try_get_search_permit().await?; let search_result = tokio::task::spawn_blocking(move || { - perform_facet_search(&index, search_query, facet_query, facet_name, features, search_kind) + perform_facet_search(&index, search_query, facet_query, facet_name, search_kind) }) .await?; diff --git a/meilisearch/src/routes/indexes/search.rs b/meilisearch/src/routes/indexes/search.rs index a5fe3c5d6..0f7d3b1ee 100644 --- a/meilisearch/src/routes/indexes/search.rs +++ b/meilisearch/src/routes/indexes/search.rs @@ -1,7 +1,7 @@ use actix_web::web::Data; use actix_web::{web, HttpRequest, HttpResponse}; use deserr::actix_web::{AwebJson, AwebQueryParameter}; -use index_scheduler::IndexScheduler; +use index_scheduler::{IndexScheduler, RoFeatures}; use meilisearch_types::deserr::query_params::Param; use meilisearch_types::deserr::{DeserrJsonError, DeserrQueryParamError}; use meilisearch_types::error::deserr_codes::*; @@ -204,12 +204,11 @@ pub async fn search_with_url_query( let index = index_scheduler.index(&index_uid)?; let features = index_scheduler.features(); - let search_kind = search_kind(&query, index_scheduler.get_ref(), &index)?; + let search_kind = search_kind(&query, index_scheduler.get_ref(), &index, features)?; let _permit = search_queue.try_get_search_permit().await?; let search_result = - tokio::task::spawn_blocking(move || perform_search(&index, query, features, search_kind)) - .await?; + tokio::task::spawn_blocking(move || perform_search(&index, query, search_kind)).await?; if let Ok(ref search_result) = search_result { aggregate.succeed(search_result); } @@ -245,12 +244,11 @@ pub async fn search_with_post( let features = index_scheduler.features(); - let search_kind = search_kind(&query, index_scheduler.get_ref(), &index)?; + let search_kind = search_kind(&query, index_scheduler.get_ref(), &index, features)?; let _permit = search_queue.try_get_search_permit().await?; let search_result = - tokio::task::spawn_blocking(move || perform_search(&index, query, features, search_kind)) - .await?; + tokio::task::spawn_blocking(move || perform_search(&index, query, search_kind)).await?; if let Ok(ref search_result) = search_result { aggregate.succeed(search_result); if search_result.degraded { @@ -269,7 +267,16 @@ pub fn search_kind( query: &SearchQuery, index_scheduler: &IndexScheduler, index: &milli::Index, + features: RoFeatures, ) -> Result { + if query.vector.is_some() { + features.check_vector("Passing `vector` as a query parameter")?; + } + + if query.hybrid.is_some() { + features.check_vector("Passing `hybrid` as a query parameter")?; + } + // regardless of anything, always do a semantic search when we don't have a vector and the query is whitespace or missing if query.vector.is_none() { match &query.q { diff --git a/meilisearch/src/routes/multi_search.rs b/meilisearch/src/routes/multi_search.rs index 04cd3f637..7b7cbd265 100644 --- a/meilisearch/src/routes/multi_search.rs +++ b/meilisearch/src/routes/multi_search.rs @@ -81,14 +81,13 @@ pub async fn multi_search_with_post( }) .with_index(query_index)?; - let search_kind = - search_kind(&query, index_scheduler.get_ref(), &index).with_index(query_index)?; + let search_kind = search_kind(&query, index_scheduler.get_ref(), &index, features) + .with_index(query_index)?; - let search_result = tokio::task::spawn_blocking(move || { - perform_search(&index, query, features, search_kind) - }) - .await - .with_index(query_index)?; + let search_result = + tokio::task::spawn_blocking(move || perform_search(&index, query, search_kind)) + .await + .with_index(query_index)?; search_results.push(SearchResultWithIndex { index_uid: index_uid.into_inner(), diff --git a/meilisearch/src/search.rs b/meilisearch/src/search.rs index 2a22cb2ce..7cb860f2e 100644 --- a/meilisearch/src/search.rs +++ b/meilisearch/src/search.rs @@ -6,7 +6,6 @@ use std::time::{Duration, Instant}; use deserr::Deserr; use either::Either; -use index_scheduler::RoFeatures; use indexmap::IndexMap; use meilisearch_auth::IndexSearchRules; use meilisearch_types::deserr::DeserrJsonError; @@ -448,21 +447,12 @@ fn prepare_search<'t>( index: &'t Index, rtxn: &'t RoTxn, query: &'t SearchQuery, - features: RoFeatures, search_kind: &SearchKind, time_budget: TimeBudget, ) -> Result<(milli::Search<'t>, bool, usize, usize), MeilisearchHttpError> { let mut search = index.search(rtxn); search.time_budget(time_budget); - if query.vector.is_some() { - features.check_vector("Passing `vector` as a query parameter")?; - } - - if query.hybrid.is_some() { - features.check_vector("Passing `hybrid` as a query parameter")?; - } - match search_kind { SearchKind::KeywordOnly => { if let Some(q) = &query.q { @@ -551,7 +541,6 @@ fn prepare_search<'t>( pub fn perform_search( index: &Index, query: SearchQuery, - features: RoFeatures, search_kind: SearchKind, ) -> Result { let before_search = Instant::now(); @@ -562,7 +551,7 @@ pub fn perform_search( }; let (search, is_finite_pagination, max_total_hits, offset) = - prepare_search(index, &rtxn, &query, features, &search_kind, time_budget)?; + prepare_search(index, &rtxn, &query, &search_kind, time_budget)?; let milli::SearchResult { documents_ids, @@ -780,7 +769,6 @@ pub fn perform_facet_search( search_query: SearchQuery, facet_query: Option, facet_name: String, - features: RoFeatures, search_kind: SearchKind, ) -> Result { let before_search = Instant::now(); @@ -790,8 +778,7 @@ pub fn perform_facet_search( None => TimeBudget::default(), }; - let (search, _, _, _) = - prepare_search(index, &rtxn, &search_query, features, &search_kind, time_budget)?; + let (search, _, _, _) = prepare_search(index, &rtxn, &search_query, &search_kind, time_budget)?; let mut facet_search = SearchForFacetValues::new( facet_name, search,