Use media to determine search kind

This commit is contained in:
Louis Dureuil 2025-06-30 00:11:00 +02:00
parent d14184f4da
commit 2b3327ea74
No known key found for this signature in database

View file

@ -483,28 +483,30 @@ pub fn search_kind(
index_uid: String, index_uid: String,
index: &milli::Index, index: &milli::Index,
) -> Result<SearchKind, ResponseError> { ) -> Result<SearchKind, ResponseError> {
let is_placeholder_query =
if let Some(q) = query.q.as_deref() { q.trim().is_empty() } else { true };
let non_placeholder_query = !is_placeholder_query;
let is_media = query.media.is_some();
// handle with care, the order of cases matters, the semantics is subtle // handle with care, the order of cases matters, the semantics is subtle
match (query.q.as_deref(), &query.hybrid, query.vector.as_deref()) { match (is_media, non_placeholder_query, &query.hybrid, query.vector.as_deref()) {
// empty query, no vector => placeholder search // media + vector => error
(Some(q), _, None) if q.trim().is_empty() => Ok(SearchKind::KeywordOnly), (true, _, _, Some(_)) => Err(MeilisearchHttpError::MediaAndVector.into()),
// no query, no vector => placeholder search // media + !hybrid => error
(None, _, None) => Ok(SearchKind::KeywordOnly), (true, _, None, _) => Err(MeilisearchHttpError::MissingSearchHybrid.into()),
// hybrid.semantic_ratio == 1.0 => vector // vector + !hybrid => error
(_, Some(HybridQuery { semantic_ratio, embedder }), v) if **semantic_ratio == 1.0 => { (_, _, None, Some(_)) => Err(MeilisearchHttpError::MissingSearchHybrid.into()),
SearchKind::semantic(index_scheduler, index_uid, index, embedder, v.map(|v| v.len())) // hybrid S0 => keyword
} (_, _, Some(HybridQuery { semantic_ratio, embedder: _ }), _) if **semantic_ratio == 0.0 => {
// hybrid.semantic_ratio == 0.0 => keyword
(_, Some(HybridQuery { semantic_ratio, embedder: _ }), _) if **semantic_ratio == 0.0 => {
Ok(SearchKind::KeywordOnly) Ok(SearchKind::KeywordOnly)
} }
// no query, hybrid, vector => semantic // !q + !vector => placeholder search
(None, Some(HybridQuery { semantic_ratio: _, embedder }), Some(v)) => { (false, false, _, None) => Ok(SearchKind::KeywordOnly),
SearchKind::semantic(index_scheduler, index_uid, index, embedder, Some(v.len())) // hybrid S100 => semantic
(_, _, Some(HybridQuery { semantic_ratio, embedder }), v) if **semantic_ratio == 1.0 => {
SearchKind::semantic(index_scheduler, index_uid, index, embedder, v.map(|v| v.len()))
} }
// query, no hybrid, no vector => keyword // q + hybrid => hybrid
(Some(_), None, None) => Ok(SearchKind::KeywordOnly), (_, true, Some(HybridQuery { semantic_ratio, embedder }), v) => SearchKind::hybrid(
// query, hybrid, maybe vector => hybrid
(Some(_), Some(HybridQuery { semantic_ratio, embedder }), v) => SearchKind::hybrid(
index_scheduler, index_scheduler,
index_uid, index_uid,
index, index,
@ -512,7 +514,11 @@ pub fn search_kind(
**semantic_ratio, **semantic_ratio,
v.map(|v| v.len()), v.map(|v| v.len()),
), ),
// !q + hybrid => semantic
(_, None, Some(_)) => Err(MeilisearchHttpError::MissingSearchHybrid.into()), (_, false, Some(HybridQuery { semantic_ratio: _, embedder }), v) => {
SearchKind::semantic(index_scheduler, index_uid, index, embedder, v.map(|v| v.len()))
}
// q => keyword
(false, true, None, None) => Ok(SearchKind::KeywordOnly),
} }
} }