quick_start/
quick_start.rs1use casper_client::{
2 CasperClient,
3 CreateCollectionRequest,
4 InsertRequest,
5 SearchRequest,
6 BatchUpdateRequest,
7 BatchInsertOperation,
8 CreateHNSWIndexRequest,
9 HNSWIndexConfig,
10};
11
12#[tokio::main]
13async fn main() -> Result<(), Box<dyn std::error::Error>> {
14 let client = CasperClient::new("http://localhost", 8080, 50051)?;
16
17 client
19 .create_collection("example_collection", CreateCollectionRequest {
20 dim: 128,
21 max_size: 10_000,
22 })
23 .await?;
24
25 for i in 1..=5 {
27 let vector = generate_random_vector(128, i as f32);
28 let insert_request = InsertRequest { id: i, vector };
29 client.insert_vector("example_collection", insert_request).await?;
30 }
31
32 let mut inserts = Vec::new();
34 for i in 6..=10 {
35 let vector = generate_random_vector(128, i as f32);
36 inserts.push(BatchInsertOperation { id: i, vector });
37 }
38 let batch_request = BatchUpdateRequest { insert: inserts, delete: vec![] };
39 client.batch_update("example_collection", batch_request).await?;
40
41 let hnsw_request = CreateHNSWIndexRequest {
43 hnsw: HNSWIndexConfig {
44 metric: "inner-product".to_string(),
45 quantization: "f32".to_string(),
46 m: 16,
47 m0: 32,
48 ef_construction: 200,
49 pq_name: None,
50 },
51 normalization: Some(true),
52 };
53 client.create_hnsw_index("example_collection", hnsw_request).await?;
54
55 let query_vector = generate_random_vector(128, 1.0);
57 let results = client
58 .search(
59 "example_collection",
60 30,
61 SearchRequest { vector: query_vector, limit: Some(5) },
62 )
63 .await?;
64
65 println!("Found {} results", results.len());
66
67 println!("\nDeleting collection...");
69 client.delete_collection("example_collection").await?;
70 println!("Collection 'example_collection' deleted successfully");
71
72 Ok(())
73}
74
75fn generate_random_vector(dim: usize, seed: f32) -> Vec<f32> {
76 use std::collections::hash_map::DefaultHasher;
77 use std::hash::{Hash, Hasher};
78
79 let mut vector = Vec::with_capacity(dim);
80 for i in 0..dim {
81 let mut hasher = DefaultHasher::new();
82 (seed * 1000.0 + i as f32).to_bits().hash(&mut hasher);
83 let hash = hasher.finish();
84 let value = (hash as f32 / u64::MAX as f32) * 2.0 - 1.0;
85 vector.push(value);
86 }
87 let norm: f32 = vector.iter().map(|x| x * x).sum::<f32>().sqrt();
88 if norm > 0.0 {
89 for value in &mut vector {
90 *value /= norm;
91 }
92 }
93 vector
94}