File size: 6,934 Bytes
40d7073
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
#!/usr/bin/env node

/**
 * ruvector API Usage Examples
 *
 * This demonstrates how to use ruvector in your Node.js applications
 */

// For this demo, we use the mock implementation
// In production, you would use: const { VectorDB } = require('ruvector');
const { VectorDB } = require('../test/mock-implementation.js');

console.log('ruvector API Examples\n');
console.log('='.repeat(60));

// Show info
console.log('\nUsing: Mock implementation (for demo purposes)');
console.log('In production: npm install ruvector\n');

// Example 1: Basic usage
console.log('Example 1: Basic Vector Operations');
console.log('-'.repeat(60));

const db = new VectorDB({
  dimension: 3,
  metric: 'cosine'
});

// Insert some vectors
db.insert({
  id: 'doc1',
  vector: [1, 0, 0],
  metadata: { title: 'First Document', category: 'A' }
});

db.insertBatch([
  { id: 'doc2', vector: [0, 1, 0], metadata: { title: 'Second Document', category: 'B' } },
  { id: 'doc3', vector: [0, 0, 1], metadata: { title: 'Third Document', category: 'C' } },
  { id: 'doc4', vector: [0.7, 0.7, 0], metadata: { title: 'Fourth Document', category: 'A' } }
]);

console.log('βœ“ Inserted 4 vectors');

// Get stats
const stats = db.stats();
console.log(`βœ“ Database has ${stats.count} vectors, dimension ${stats.dimension}`);

// Search
const results = db.search({
  vector: [1, 0, 0],
  k: 3
});

console.log(`βœ“ Search returned ${results.length} results:`);
results.forEach((result, i) => {
  console.log(`  ${i + 1}. ${result.id} (score: ${result.score.toFixed(4)}) - ${result.metadata.title}`);
});

// Get by ID
const doc = db.get('doc2');
console.log(`βœ“ Retrieved document: ${doc.metadata.title}`);

// Update metadata
db.updateMetadata('doc1', { updated: true, timestamp: Date.now() });
console.log('βœ“ Updated metadata');

// Delete
db.delete('doc3');
console.log('βœ“ Deleted doc3');
console.log(`βœ“ Database now has ${db.stats().count} vectors\n`);

// Example 2: Semantic Search Simulation
console.log('Example 2: Semantic Search Simulation');
console.log('-'.repeat(60));

const semanticDb = new VectorDB({
  dimension: 5,
  metric: 'cosine'
});

// Simulate document embeddings
const documents = [
  { id: 'machine-learning', vector: [0.9, 0.8, 0.1, 0.2, 0.1], metadata: { title: 'Introduction to Machine Learning', topic: 'AI' } },
  { id: 'deep-learning', vector: [0.85, 0.9, 0.15, 0.25, 0.1], metadata: { title: 'Deep Learning Fundamentals', topic: 'AI' } },
  { id: 'web-dev', vector: [0.1, 0.2, 0.9, 0.8, 0.1], metadata: { title: 'Web Development Guide', topic: 'Web' } },
  { id: 'react', vector: [0.15, 0.2, 0.85, 0.9, 0.1], metadata: { title: 'React Tutorial', topic: 'Web' } },
  { id: 'database', vector: [0.2, 0.3, 0.3, 0.4, 0.9], metadata: { title: 'Database Design', topic: 'Data' } }
];

semanticDb.insertBatch(documents);
console.log(`βœ“ Indexed ${documents.length} documents`);

// Search for AI-related content
const aiQuery = [0.9, 0.85, 0.1, 0.2, 0.1];
const aiResults = semanticDb.search({ vector: aiQuery, k: 2 });

console.log('\nQuery: AI-related content');
console.log('Results:');
aiResults.forEach((result, i) => {
  console.log(`  ${i + 1}. ${result.metadata.title} (score: ${result.score.toFixed(4)})`);
});

// Search for Web-related content
const webQuery = [0.1, 0.2, 0.9, 0.85, 0.1];
const webResults = semanticDb.search({ vector: webQuery, k: 2 });

console.log('\nQuery: Web-related content');
console.log('Results:');
webResults.forEach((result, i) => {
  console.log(`  ${i + 1}. ${result.metadata.title} (score: ${result.score.toFixed(4)})`);
});

// Example 3: Different Distance Metrics
console.log('\n\nExample 3: Distance Metrics Comparison');
console.log('-'.repeat(60));

const metrics = ['cosine', 'euclidean', 'dot'];
const testVectors = [
  { id: 'v1', vector: [1, 0, 0] },
  { id: 'v2', vector: [0.7, 0.7, 0] },
  { id: 'v3', vector: [0, 1, 0] }
];

metrics.forEach(metric => {
  const metricDb = new VectorDB({ dimension: 3, metric });
  metricDb.insertBatch(testVectors);

  const results = metricDb.search({ vector: [1, 0, 0], k: 3 });

  console.log(`\n${metric.toUpperCase()} metric:`);
  results.forEach((result, i) => {
    console.log(`  ${i + 1}. ${result.id}: ${result.score.toFixed(4)}`);
  });
});

// Example 4: Batch Operations Performance
console.log('\n\nExample 4: Batch Operations Performance');
console.log('-'.repeat(60));

const perfDb = new VectorDB({ dimension: 128, metric: 'cosine' });

// Generate random vectors
const numVectors = 1000;
const vectors = [];
for (let i = 0; i < numVectors; i++) {
  vectors.push({
    id: `vec_${i}`,
    vector: Array.from({ length: 128 }, () => Math.random()),
    metadata: { index: i, batch: Math.floor(i / 100) }
  });
}

console.log(`Inserting ${numVectors} vectors...`);
const insertStart = Date.now();
perfDb.insertBatch(vectors);
const insertTime = Date.now() - insertStart;

console.log(`βœ“ Inserted ${numVectors} vectors in ${insertTime}ms`);
console.log(`βœ“ Rate: ${Math.round(numVectors / (insertTime / 1000))} vectors/sec`);

// Search performance
const numQueries = 100;
console.log(`\nRunning ${numQueries} searches...`);
const searchStart = Date.now();

for (let i = 0; i < numQueries; i++) {
  const query = {
    vector: Array.from({ length: 128 }, () => Math.random()),
    k: 10
  };
  perfDb.search(query);
}

const searchTime = Date.now() - searchStart;
console.log(`βœ“ Completed ${numQueries} searches in ${searchTime}ms`);
console.log(`βœ“ Rate: ${Math.round(numQueries / (searchTime / 1000))} queries/sec`);
console.log(`βœ“ Avg latency: ${(searchTime / numQueries).toFixed(2)}ms`);

// Example 5: Persistence (conceptual, would need real implementation)
console.log('\n\nExample 5: Persistence');
console.log('-'.repeat(60));

const persistDb = new VectorDB({
  dimension: 3,
  metric: 'cosine',
  path: './my-vectors.db',
  autoPersist: true
});

persistDb.insertBatch([
  { id: 'p1', vector: [1, 0, 0], metadata: { name: 'First' } },
  { id: 'p2', vector: [0, 1, 0], metadata: { name: 'Second' } }
]);

console.log('βœ“ Created database with auto-persist enabled');
console.log('βœ“ Insert operations will automatically save to disk');
console.log('βœ“ Use db.save(path) for manual saves');
console.log('βœ“ Use db.load(path) to restore from disk');

// Summary
console.log('\n' + '='.repeat(60));
console.log('\nβœ… All examples completed successfully!');
console.log('\nKey Features Demonstrated:');
console.log('  β€’ Basic CRUD operations (insert, search, get, update, delete)');
console.log('  β€’ Batch operations for better performance');
console.log('  β€’ Multiple distance metrics (cosine, euclidean, dot)');
console.log('  β€’ Semantic search simulation');
console.log('  β€’ Performance benchmarking');
console.log('  β€’ Metadata filtering and updates');
console.log('  β€’ Persistence (save/load)');
console.log('\nFor more examples, see: /workspaces/ruvector/npm/packages/ruvector/examples/');