| | #!/usr/bin/env node |
| |
|
| | |
| | |
| | |
| | |
| | |
| |
|
| | |
| | |
| | const { VectorDB } = require('../test/mock-implementation.js'); |
| |
|
| | console.log('ruvector API Examples\n'); |
| | console.log('='.repeat(60)); |
| |
|
| | |
| | console.log('\nUsing: Mock implementation (for demo purposes)'); |
| | console.log('In production: npm install ruvector\n'); |
| |
|
| | |
| | console.log('Example 1: Basic Vector Operations'); |
| | console.log('-'.repeat(60)); |
| |
|
| | const db = new VectorDB({ |
| | dimension: 3, |
| | metric: 'cosine' |
| | }); |
| |
|
| | |
| | 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'); |
| |
|
| | |
| | const stats = db.stats(); |
| | console.log(`β Database has ${stats.count} vectors, dimension ${stats.dimension}`); |
| |
|
| | |
| | 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}`); |
| | }); |
| |
|
| | |
| | const doc = db.get('doc2'); |
| | console.log(`β Retrieved document: ${doc.metadata.title}`); |
| |
|
| | |
| | db.updateMetadata('doc1', { updated: true, timestamp: Date.now() }); |
| | console.log('β Updated metadata'); |
| |
|
| | |
| | db.delete('doc3'); |
| | console.log('β Deleted doc3'); |
| | console.log(`β Database now has ${db.stats().count} vectors\n`); |
| |
|
| | |
| | console.log('Example 2: Semantic Search Simulation'); |
| | console.log('-'.repeat(60)); |
| |
|
| | const semanticDb = new VectorDB({ |
| | dimension: 5, |
| | metric: 'cosine' |
| | }); |
| |
|
| | |
| | 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`); |
| |
|
| | |
| | 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)})`); |
| | }); |
| |
|
| | |
| | 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)})`); |
| | }); |
| |
|
| | |
| | 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)}`); |
| | }); |
| | }); |
| |
|
| | |
| | console.log('\n\nExample 4: Batch Operations Performance'); |
| | console.log('-'.repeat(60)); |
| |
|
| | const perfDb = new VectorDB({ dimension: 128, metric: 'cosine' }); |
| |
|
| | |
| | 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`); |
| |
|
| | |
| | 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`); |
| |
|
| | |
| | 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'); |
| |
|
| | |
| | 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/'); |
| |
|