diff --git a/crates/meilisearch/tests/search/filters.rs b/crates/meilisearch/tests/search/filters.rs index 4701e986d..1a27bdf99 100644 --- a/crates/meilisearch/tests/search/filters.rs +++ b/crates/meilisearch/tests/search/filters.rs @@ -1151,3 +1151,39 @@ async fn vector_filter_or_combination() { } "#); } + + +#[actix_rt::test] +async fn vector_filter_regenerate() { + let index = shared_index_for_fragments().await; + + for selector in ["_vectors.rest.regenerate", "_vectors.rest.fragments.basic.regenerate"] { + let (value, _code) = index + .search_post(json!({ + "filter": format!("{selector} EXISTS"), + "attributesToRetrieve": ["name"] + })) + .await; + snapshot!(value, @r#" + { + "hits": [ + { + "name": "kefir" + }, + { + "name": "intel" + }, + { + "name": "dustin" + } + ], + "query": "", + "processingTimeMs": "[duration]", + "limit": 20, + "offset": 0, + "estimatedTotalHits": 3 + } + "#); + } +} + diff --git a/crates/milli/src/search/facet/filter_vector.rs b/crates/milli/src/search/facet/filter_vector.rs index 3a0f86637..7fbd9c916 100644 --- a/crates/milli/src/search/facet/filter_vector.rs +++ b/crates/milli/src/search/facet/filter_vector.rs @@ -92,7 +92,7 @@ impl VectorFilterInner<'_> { if regenerate { let skip_regenerate = embedder_info.embedding_status.skip_regenerate_docids(); - docids &= skip_regenerate; + docids -= skip_regenerate; } Ok(docids) @@ -220,15 +220,14 @@ impl<'a> VectorFilter<'a> { /// /// Valid formats: /// - `_vectors` - /// - `_vectors.mustRegenerate` /// - `_vectors.{embedder_name}` - /// - `_vectors.{embedder_name}.mustRegenerate` + /// - `_vectors.{embedder_name}.regenerate` /// - `_vectors.{embedder_name}.userProvided` - /// - `_vectors.{embedder_name}.userProvided.mustRegenerate` + /// - `_vectors.{embedder_name}.userProvided.regenerate` /// - `_vectors.{embedder_name}.documentTemplate` - /// - `_vectors.{embedder_name}.documentTemplate.mustRegenerate` + /// - `_vectors.{embedder_name}.documentTemplate.regenerate` /// - `_vectors.{embedder_name}.fragments.{fragment_name}` - /// - `_vectors.{embedder_name}.fragments.{fragment_name}.mustRegenerate` + /// - `_vectors.{embedder_name}.fragments.{fragment_name}.regenerate` pub(super) fn parse(s: &'a Token<'a>) -> Result> { let mut split = s.split(".").peekable();