pub struct VectorStoreWriter { /* private fields */ }Expand description
Stages appends, deletes, and compactions of one store, and publishes them
together on commit.
Nothing a reader sees changes before a commit. Appending a document that is already present replaces it; deleting one that is not present does nothing. A commit with nothing staged still advances the time readers report as fresh, so an idle writer can keep a store within a reader’s allowed lag. One writer writes a store at a time.
Implementations§
Source§impl VectorStoreWriter
impl VectorStoreWriter
Sourcepub fn create(
path: impl AsRef<Path>,
encoding: Encoding,
corpus: impl Into<String>,
representation: Representation,
) -> Result<Self>
pub fn create( path: impl AsRef<Path>, encoding: Encoding, corpus: impl Into<String>, representation: Representation, ) -> Result<Self>
Writes an empty store at path, which must not exist.
Examples found in repository?
76fn main() -> Result<()> {
77 let representation = Representation::new("toy-encoder", "1", DIMENSION, true)?;
78 let directory = std::env::temp_dir().join(format!("lateweave-example-{}", std::process::id()));
79 let path = directory.join("vectors");
80
81 // The indexing side: one token per word, the axis standing in for what
82 // a real encoder produces.
83 let mut writer =
84 VectorStoreWriter::create(&path, Encoding::Float32, "fruit", representation.clone())?;
85 let embeddings = [unit(0), unit(2), unit(1), unit(2), unit(0), unit(3)].concat();
86 writer.append(["a", "b", "c"], &embeddings, DIMENSION, &[2, 2, 2], None)?;
87 writer.commit()?;
88
89 // The serving side.
90 let gatherer = TermGatherer {
91 requires: BTreeMap::new(),
92 documents: vec![("a", "red apple"), ("b", "green apple"), ("c", "red car")],
93 indexed_at: SystemTime::now(),
94 };
95 let store = Arc::new(VectorStore::open(&path)?) as Arc<dyn MultiVectorSource>;
96 let reranker = MaxSimReranker::new([store], DEFAULT_FEATURE)?;
97 let pipeline = SearchPipeline::new(Arc::new(gatherer), Some(Arc::new(reranker)));
98
99 let query = Query::new("apple").with_feature(
100 DEFAULT_FEATURE,
101 Feature::lazy(representation, || {
102 TokenMatrix::new(unit(1).to_vec(), DIMENSION)
103 }),
104 );
105 let request = SearchRequest::new(10, 2).with_budget(ResourceBudget::new(4096, 64, Some(1))?);
106
107 let print = |label: &str| -> Result<()> {
108 let result = pipeline.search(&query, &request)?;
109 println!("{label}:");
110 for document in &result.documents {
111 println!(
112 " #{} {:?} score {}",
113 document.rank, document.key, document.score
114 );
115 }
116 println!(" {:?}", result.diagnostics);
117 Ok(())
118 };
119 print("before the delete")?;
120
121 // The indexing side deletes "b" from the vectors; the gatherer still
122 // finds it, and the pipeline drops it.
123 writer.delete(["b"]);
124 writer.commit()?;
125 print("after the delete")?;
126
127 std::fs::remove_dir_all(directory)?;
128 Ok(())
129}pub fn open(path: impl AsRef<Path>) -> Result<Self>
pub fn path(&self) -> &Path
pub fn corpus(&self) -> &str
pub fn encoding(&self) -> Encoding
pub fn representation(&self) -> &Representation
Sourcepub fn append<I>(
&mut self,
document_ids: I,
embeddings: &[f32],
dimension: usize,
lengths: &[usize],
threads: Option<usize>,
) -> Result<()>
pub fn append<I>( &mut self, document_ids: I, embeddings: &[f32], dimension: usize, lengths: &[usize], threads: Option<usize>, ) -> Result<()>
Stages documents as a new segment. embeddings is a row-major float32
[sum(lengths), dimension] matrix packed by document in the order of
document_ids.
Examples found in repository?
76fn main() -> Result<()> {
77 let representation = Representation::new("toy-encoder", "1", DIMENSION, true)?;
78 let directory = std::env::temp_dir().join(format!("lateweave-example-{}", std::process::id()));
79 let path = directory.join("vectors");
80
81 // The indexing side: one token per word, the axis standing in for what
82 // a real encoder produces.
83 let mut writer =
84 VectorStoreWriter::create(&path, Encoding::Float32, "fruit", representation.clone())?;
85 let embeddings = [unit(0), unit(2), unit(1), unit(2), unit(0), unit(3)].concat();
86 writer.append(["a", "b", "c"], &embeddings, DIMENSION, &[2, 2, 2], None)?;
87 writer.commit()?;
88
89 // The serving side.
90 let gatherer = TermGatherer {
91 requires: BTreeMap::new(),
92 documents: vec![("a", "red apple"), ("b", "green apple"), ("c", "red car")],
93 indexed_at: SystemTime::now(),
94 };
95 let store = Arc::new(VectorStore::open(&path)?) as Arc<dyn MultiVectorSource>;
96 let reranker = MaxSimReranker::new([store], DEFAULT_FEATURE)?;
97 let pipeline = SearchPipeline::new(Arc::new(gatherer), Some(Arc::new(reranker)));
98
99 let query = Query::new("apple").with_feature(
100 DEFAULT_FEATURE,
101 Feature::lazy(representation, || {
102 TokenMatrix::new(unit(1).to_vec(), DIMENSION)
103 }),
104 );
105 let request = SearchRequest::new(10, 2).with_budget(ResourceBudget::new(4096, 64, Some(1))?);
106
107 let print = |label: &str| -> Result<()> {
108 let result = pipeline.search(&query, &request)?;
109 println!("{label}:");
110 for document in &result.documents {
111 println!(
112 " #{} {:?} score {}",
113 document.rank, document.key, document.score
114 );
115 }
116 println!(" {:?}", result.diagnostics);
117 Ok(())
118 };
119 print("before the delete")?;
120
121 // The indexing side deletes "b" from the vectors; the gatherer still
122 // finds it, and the pipeline drops it.
123 writer.delete(["b"]);
124 writer.commit()?;
125 print("after the delete")?;
126
127 std::fs::remove_dir_all(directory)?;
128 Ok(())
129}Sourcepub fn delete<I>(&mut self, document_ids: I) -> usize
pub fn delete<I>(&mut self, document_ids: I) -> usize
Stages the deletion of every present document among document_ids,
returning how many there were.
Examples found in repository?
76fn main() -> Result<()> {
77 let representation = Representation::new("toy-encoder", "1", DIMENSION, true)?;
78 let directory = std::env::temp_dir().join(format!("lateweave-example-{}", std::process::id()));
79 let path = directory.join("vectors");
80
81 // The indexing side: one token per word, the axis standing in for what
82 // a real encoder produces.
83 let mut writer =
84 VectorStoreWriter::create(&path, Encoding::Float32, "fruit", representation.clone())?;
85 let embeddings = [unit(0), unit(2), unit(1), unit(2), unit(0), unit(3)].concat();
86 writer.append(["a", "b", "c"], &embeddings, DIMENSION, &[2, 2, 2], None)?;
87 writer.commit()?;
88
89 // The serving side.
90 let gatherer = TermGatherer {
91 requires: BTreeMap::new(),
92 documents: vec![("a", "red apple"), ("b", "green apple"), ("c", "red car")],
93 indexed_at: SystemTime::now(),
94 };
95 let store = Arc::new(VectorStore::open(&path)?) as Arc<dyn MultiVectorSource>;
96 let reranker = MaxSimReranker::new([store], DEFAULT_FEATURE)?;
97 let pipeline = SearchPipeline::new(Arc::new(gatherer), Some(Arc::new(reranker)));
98
99 let query = Query::new("apple").with_feature(
100 DEFAULT_FEATURE,
101 Feature::lazy(representation, || {
102 TokenMatrix::new(unit(1).to_vec(), DIMENSION)
103 }),
104 );
105 let request = SearchRequest::new(10, 2).with_budget(ResourceBudget::new(4096, 64, Some(1))?);
106
107 let print = |label: &str| -> Result<()> {
108 let result = pipeline.search(&query, &request)?;
109 println!("{label}:");
110 for document in &result.documents {
111 println!(
112 " #{} {:?} score {}",
113 document.rank, document.key, document.score
114 );
115 }
116 println!(" {:?}", result.diagnostics);
117 Ok(())
118 };
119 print("before the delete")?;
120
121 // The indexing side deletes "b" from the vectors; the gatherer still
122 // finds it, and the pipeline drops it.
123 writer.delete(["b"]);
124 writer.commit()?;
125 print("after the delete")?;
126
127 std::fs::remove_dir_all(directory)?;
128 Ok(())
129}Sourcepub fn compact(&mut self) -> Result<()>
pub fn compact(&mut self) -> Result<()>
Stages the store’s present documents as one segment, dropping deleted and replaced rows.
Sourcepub fn commit(&mut self) -> Result<SystemTime>
pub fn commit(&mut self) -> Result<SystemTime>
Publishes everything staged, and returns the commit time readers report for it. Files no longer named are then removed.
Examples found in repository?
76fn main() -> Result<()> {
77 let representation = Representation::new("toy-encoder", "1", DIMENSION, true)?;
78 let directory = std::env::temp_dir().join(format!("lateweave-example-{}", std::process::id()));
79 let path = directory.join("vectors");
80
81 // The indexing side: one token per word, the axis standing in for what
82 // a real encoder produces.
83 let mut writer =
84 VectorStoreWriter::create(&path, Encoding::Float32, "fruit", representation.clone())?;
85 let embeddings = [unit(0), unit(2), unit(1), unit(2), unit(0), unit(3)].concat();
86 writer.append(["a", "b", "c"], &embeddings, DIMENSION, &[2, 2, 2], None)?;
87 writer.commit()?;
88
89 // The serving side.
90 let gatherer = TermGatherer {
91 requires: BTreeMap::new(),
92 documents: vec![("a", "red apple"), ("b", "green apple"), ("c", "red car")],
93 indexed_at: SystemTime::now(),
94 };
95 let store = Arc::new(VectorStore::open(&path)?) as Arc<dyn MultiVectorSource>;
96 let reranker = MaxSimReranker::new([store], DEFAULT_FEATURE)?;
97 let pipeline = SearchPipeline::new(Arc::new(gatherer), Some(Arc::new(reranker)));
98
99 let query = Query::new("apple").with_feature(
100 DEFAULT_FEATURE,
101 Feature::lazy(representation, || {
102 TokenMatrix::new(unit(1).to_vec(), DIMENSION)
103 }),
104 );
105 let request = SearchRequest::new(10, 2).with_budget(ResourceBudget::new(4096, 64, Some(1))?);
106
107 let print = |label: &str| -> Result<()> {
108 let result = pipeline.search(&query, &request)?;
109 println!("{label}:");
110 for document in &result.documents {
111 println!(
112 " #{} {:?} score {}",
113 document.rank, document.key, document.score
114 );
115 }
116 println!(" {:?}", result.diagnostics);
117 Ok(())
118 };
119 print("before the delete")?;
120
121 // The indexing side deletes "b" from the vectors; the gatherer still
122 // finds it, and the pipeline drops it.
123 writer.delete(["b"]);
124 writer.commit()?;
125 print("after the delete")?;
126
127 std::fs::remove_dir_all(directory)?;
128 Ok(())
129}Auto Trait Implementations§
impl Freeze for VectorStoreWriter
impl RefUnwindSafe for VectorStoreWriter
impl Send for VectorStoreWriter
impl Sync for VectorStoreWriter
impl Unpin for VectorStoreWriter
impl UnsafeUnpin for VectorStoreWriter
impl UnwindSafe for VectorStoreWriter
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more