From 381de52fc5bfdb99cc3558d3077e1306de8ab24c Mon Sep 17 00:00:00 2001 From: Louis Dureuil Date: Mon, 1 Sep 2025 12:09:18 +0200 Subject: [PATCH] Add setting to change backend --- crates/milli/src/update/settings.rs | 62 +++++++++++++++++++++++- crates/milli/src/update/test_settings.rs | 2 + 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/crates/milli/src/update/settings.rs b/crates/milli/src/update/settings.rs index 5530ae718..6b5dbd359 100644 --- a/crates/milli/src/update/settings.rs +++ b/crates/milli/src/update/settings.rs @@ -41,6 +41,7 @@ use crate::vector::settings::{ }; use crate::vector::{ Embedder, EmbeddingConfig, RuntimeEmbedder, RuntimeEmbedders, RuntimeFragment, + VectorStoreBackend, }; use crate::{ ChannelCongestion, FieldId, FilterableAttributesRule, Index, LocalizedAttributesRule, Result, @@ -199,6 +200,7 @@ pub struct Settings<'a, 't, 'i> { prefix_search: Setting, facet_search: Setting, chat: Setting, + vector_store: Setting, } impl<'a, 't, 'i> Settings<'a, 't, 'i> { @@ -238,6 +240,7 @@ impl<'a, 't, 'i> Settings<'a, 't, 'i> { prefix_search: Setting::NotSet, facet_search: Setting::NotSet, chat: Setting::NotSet, + vector_store: Setting::NotSet, indexer_config, } } @@ -476,6 +479,14 @@ impl<'a, 't, 'i> Settings<'a, 't, 'i> { self.chat = Setting::Reset; } + pub fn set_vector_store(&mut self, value: VectorStoreBackend) { + self.vector_store = Setting::Set(value); + } + + pub fn reset_vector_store(&mut self) { + self.vector_store = Setting::Reset; + } + #[tracing::instrument( level = "trace" skip(self, progress_callback, should_abort, settings_diff, embedder_stats), @@ -1417,7 +1428,7 @@ impl<'a, 't, 'i> Settings<'a, 't, 'i> { } } - pub fn legacy_execute( + fn legacy_execute( mut self, progress_callback: FP, should_abort: FA, @@ -1486,6 +1497,51 @@ impl<'a, 't, 'i> Settings<'a, 't, 'i> { Ok(()) } + fn execute_vector_backend<'indexer, MSP>( + &mut self, + must_stop_processing: &'indexer MSP, + progress: &'indexer Progress, + ) -> Result<()> + where + MSP: Fn() -> bool + Sync, + { + let new_backend = match self.vector_store { + Setting::Set(new_backend) => { + self.index.put_vector_store(self.wtxn, new_backend)?; + new_backend + } + Setting::Reset => { + self.index.delete_vector_store(self.wtxn)?; + VectorStoreBackend::default() + } + Setting::NotSet => return Ok(()), + }; + let old_backend = self.index.get_vector_store(self.wtxn)?; + + if old_backend == new_backend { + return Ok(()); + } + + let embedding_configs = self.index.embedding_configs(); + for config in embedding_configs.embedding_configs(self.wtxn)? { + if must_stop_processing() { + return Err(crate::InternalError::AbortedIndexation.into()); + } + /// TODO use the embedder name to display progress + let quantized = config.config.quantized(); + let embedder_id = embedding_configs.embedder_id(self.wtxn, &config.name)?.unwrap(); + let mut vector_store = crate::vector::VectorStore::new( + old_backend, + self.index.vector_store, + embedder_id, + quantized, + ); + vector_store.change_backend(self.wtxn, progress.clone(), must_stop_processing)?; + } + + Ok(()) + } + pub fn execute<'indexer, MSP>( mut self, must_stop_processing: &'indexer MSP, @@ -1495,6 +1551,9 @@ impl<'a, 't, 'i> Settings<'a, 't, 'i> { where MSP: Fn() -> bool + Sync, { + // execute any pending vector store backend change + self.execute_vector_backend(must_stop_processing, progress)?; + // force the old indexer if the environment says so if self.indexer_config.experimental_no_edition_2024_for_settings { return self @@ -1536,6 +1595,7 @@ impl<'a, 't, 'i> Settings<'a, 't, 'i> { facet_search: Setting::NotSet, disable_on_numbers: Setting::NotSet, chat: Setting::NotSet, + vector_store: Setting::NotSet, wtxn: _, index: _, indexer_config: _, diff --git a/crates/milli/src/update/test_settings.rs b/crates/milli/src/update/test_settings.rs index 59e8d9ff1..9e4579667 100644 --- a/crates/milli/src/update/test_settings.rs +++ b/crates/milli/src/update/test_settings.rs @@ -898,6 +898,7 @@ fn test_correct_settings_init() { facet_search, disable_on_numbers, chat, + vector_store, } = settings; assert!(matches!(searchable_fields, Setting::NotSet)); assert!(matches!(displayed_fields, Setting::NotSet)); @@ -927,6 +928,7 @@ fn test_correct_settings_init() { assert!(matches!(facet_search, Setting::NotSet)); assert!(matches!(disable_on_numbers, Setting::NotSet)); assert!(matches!(chat, Setting::NotSet)); + assert!(matches!(vector_store, Setting::NotSet)); }) .unwrap(); }