77 lines
2.2 KiB
JavaScript
77 lines
2.2 KiB
JavaScript
#!/usr/bin/env node
|
|
// rvf-node-example.mjs — Node.js RVF quick start
|
|
// Usage: node scripts/rvf-node-example.mjs
|
|
// Prerequisites: npm install @ruvector/rvf-node
|
|
|
|
import { createRequire } from 'module';
|
|
const require = createRequire(import.meta.url);
|
|
|
|
let RvfDatabase;
|
|
try {
|
|
({ RvfDatabase } = require('@ruvector/rvf-node'));
|
|
} catch {
|
|
console.error('Install first: npm install @ruvector/rvf-node');
|
|
process.exit(1);
|
|
}
|
|
|
|
const path = '/tmp/rvf_node_demo.rvf';
|
|
|
|
console.log('=== RVF Node.js Quick Start ===\n');
|
|
|
|
// 1. Create store
|
|
console.log('[1/6] Creating vector store...');
|
|
const db = RvfDatabase.create(path, {
|
|
dimension: 128,
|
|
metric: 'cosine',
|
|
m: 16,
|
|
efConstruction: 200,
|
|
});
|
|
console.log(` Created: ${path} (128-dim, cosine)`);
|
|
|
|
// 2. Ingest vectors
|
|
console.log('[2/6] Ingesting vectors...');
|
|
const count = 100;
|
|
const vectors = new Float32Array(count * 128);
|
|
const ids = [];
|
|
for (let i = 0; i < count; i++) {
|
|
for (let d = 0; d < 128; d++) {
|
|
vectors[i * 128 + d] = Math.sin(i * 0.1 + d * 0.01);
|
|
}
|
|
ids.push(i + 1);
|
|
}
|
|
const result = db.ingestBatch(vectors, ids);
|
|
console.log(` Ingested: ${result.accepted} vectors, epoch ${result.epoch}`);
|
|
|
|
// 3. Query nearest neighbors
|
|
console.log('[3/6] Querying nearest neighbors...');
|
|
const query = new Float32Array(128);
|
|
query.fill(0.1);
|
|
const matches = db.query(query, 5, { efSearch: 200 });
|
|
console.log(' Top-5 results:');
|
|
for (const m of matches) {
|
|
console.log(` id=${m.id}, distance=${m.distance.toFixed(4)}`);
|
|
}
|
|
|
|
// 4. Filtered query
|
|
console.log('[4/6] Querying with metadata filter...');
|
|
const filtered = db.query(query, 3, {
|
|
filter: JSON.stringify({ op: 'gt', fieldId: 0, valueType: 'u64', value: '50' }),
|
|
});
|
|
console.log(` Filtered results: ${filtered.length} matches`);
|
|
|
|
// 5. Lineage
|
|
console.log('[5/6] Checking lineage...');
|
|
console.log(` fileId: ${db.fileId()}`);
|
|
console.log(` parentId: ${db.parentId()}`);
|
|
console.log(` lineageDepth: ${db.lineageDepth()}`);
|
|
|
|
// 6. Status
|
|
console.log('[6/6] Store status...');
|
|
const status = db.status();
|
|
console.log(` vectors: ${status.totalVectors}`);
|
|
console.log(` segments: ${status.totalSegments}`);
|
|
console.log(` file size: ${status.fileSize} bytes`);
|
|
|
|
db.close();
|
|
console.log('\n=== Done ===');
|