quick_start/
quick_start.rs

1use 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    // host (with scheme) + HTTP and gRPC ports
15    let client = CasperClient::new("http://localhost", 8080, 50051)?;
16
17    // 1 Create a collection
18    client
19        .create_collection("example_collection", CreateCollectionRequest {
20            dim: 128,
21            max_size: 10_000,
22        })
23        .await?;
24
25    // 2 Insert some vectors
26    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    // 3 Batch insert more vectors
33    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    // 4 Create HNSW index
42    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    // 5 Search for similar vectors
56    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    // 6 Delete the collection
68    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}