git-subtree-dir: vendor/ruvector git-subtree-split: b64c21726f2bb37286d9ee36a7869fef60cc6900
212 lines
6.8 KiB
JavaScript
Executable File
212 lines
6.8 KiB
JavaScript
Executable File
#!/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/');
|