pub struct SearchOptions {
pub ef: Option<usize>,
pub exact: bool,
pub filter: Option<Filter>,
}Fields§
§ef: Option<usize>Candidate list size; defaults to the collection’s ef_search.
exact: boolScan every record instead of using the index.
filter: Option<Filter>Implementations§
Source§impl SearchOptions
impl SearchOptions
Sourcepub fn ef(self, ef: usize) -> Self
pub fn ef(self, ef: usize) -> Self
Examples found in repository?
examples/search_bench.rs (line 41)
21fn main() {
22 let args: Vec<String> = std::env::args().skip(1).collect();
23 let db = Database::open(&args[0]).expect("index");
24 let c = db.collections().next().expect("a collection");
25 let dim = c.config().dim;
26 let queries = read(&args[1], f32::from_le_bytes);
27 let truth = read(&args[2], u32::from_le_bytes);
28 let efs: Vec<usize> = args
29 .get(3)
30 .map_or("10,20,40,80,160", String::as_str)
31 .split(',')
32 .map(|e| e.parse().unwrap())
33 .collect();
34 let n = queries.len() / dim;
35
36 println!(
37 "{:>5} {:>8} {:>9} {:>9} {:>10}",
38 "ef", "recall", "mean µs", "p50 µs", "distances"
39 );
40 for ef in efs {
41 let options = SearchOptions::default().ef(ef);
42 let (mut times, mut found, mut distances) = (Vec::with_capacity(n), 0, 0);
43 for (q, t) in queries.chunks_exact(dim).zip(truth.chunks_exact(10)) {
44 let start = Instant::now();
45 let report = c.explain(q, 10, &options).unwrap();
46 times.push(start.elapsed().as_secs_f64() * 1e6);
47 distances += report.distance_computations;
48 found += report
49 .hits
50 .iter()
51 .filter(|h| t.contains(&h.id.parse::<u32>().unwrap()))
52 .count();
53 }
54 let mean = times.iter().sum::<f64>() / n as f64;
55 times.sort_by(f64::total_cmp);
56 println!(
57 "{ef:>5} {:>8.4} {mean:>9.1} {:>9.1} {:>10}",
58 found as f64 / (n * 10) as f64,
59 times[n / 2],
60 distances / n
61 );
62 }
63}pub fn exact(self) -> Self
Sourcepub fn filter(self, filter: Filter) -> Self
pub fn filter(self, filter: Filter) -> Self
Examples found in repository?
examples/quickstart.rs (line 39)
9fn main() -> recern_vector::Result<()> {
10 let path = std::env::temp_dir().join("recern-vector-quickstart.rvec");
11 let _ = std::fs::remove_file(&path);
12
13 let mut db = Database::create(&path)?;
14 let docs = db.create_collection("docs", CollectionConfig::new(32, Metric::Cosine))?;
15
16 // Batch insert: (id, vector, metadata). Built on all cores, atomic.
17 let records: Vec<_> = (0..10_000)
18 .map(|i| {
19 let vector: Vec<f32> = (0..32).map(|d| pseudo_random(i * 32 + d)).collect();
20 let lang = ["en", "de", "fr"][i % 3];
21 (
22 format!("doc-{i}"),
23 vector,
24 Some(json!({"lang": lang, "year": 2015 + i % 10})),
25 )
26 })
27 .collect();
28 let query = records[42].1.clone();
29 docs.upsert_many(records)?;
30 println!("{} records", docs.len());
31
32 // Search with a filter; explain() returns the hits and how they were found.
33 let filter = Filter::from_json(&json!({"lang": "en", "year": {"$gte": 2020}}))?;
34 // The same filter, built in code:
35 let _same = Filter::And(vec![
36 Filter::eq("lang", "en"),
37 Filter::between("year", Some(2020.0), None),
38 ]);
39 let report = docs.explain(&query, 3, &SearchOptions::default().filter(filter))?;
40 for hit in &report.hits {
41 println!(
42 " {:<10} distance={:.4} {}",
43 hit.id,
44 hit.distance,
45 hit.metadata.as_ref().unwrap()
46 );
47 }
48 println!(
49 "strategy={} visited={} selectivity={:.1}% time={:?}",
50 report.strategy,
51 report.visited,
52 report.filter_selectivity.unwrap_or(1.0) * 100.0,
53 report.elapsed
54 );
55
56 // Index health and recall against exact search.
57 let stats = docs.stats();
58 println!(
59 "layers={:?} unreachable={}",
60 stats.nodes_per_layer, stats.unreachable
61 );
62 let recall = docs.estimate_recall(&RecallOptions {
63 ef_values: vec![16, 64],
64 ..Default::default()
65 })?;
66 for point in &recall.points {
67 println!(
68 " ef={:<3} recall@{}={:.3}",
69 point.ef, recall.k, point.recall
70 );
71 }
72
73 db.save()?;
74 let reopened = Database::open(&path)?;
75 println!("reopened: {} records", reopened.collection("docs")?.len());
76 Ok(())
77}Trait Implementations§
Source§impl Clone for SearchOptions
impl Clone for SearchOptions
Source§impl Debug for SearchOptions
impl Debug for SearchOptions
Auto Trait Implementations§
impl Freeze for SearchOptions
impl RefUnwindSafe for SearchOptions
impl Send for SearchOptions
impl Sync for SearchOptions
impl Unpin for SearchOptions
impl UnsafeUnpin for SearchOptions
impl UnwindSafe for SearchOptions
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
Mutably borrows from an owned value. Read more