ruvector-fixed / examples /api-usage.js
Archie
Fix dimension/dimensions bug and positional insert/search args
40d7073
#!/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/');