Merge commit 'd803bfe2b1fe7f5e219e50ac20d6801a0a58ac75' as 'vendor/ruvector'
This commit is contained in:
76
vendor/ruvector/examples/rvf/scripts/rvf-node-example.mjs
vendored
Normal file
76
vendor/ruvector/examples/rvf/scripts/rvf-node-example.mjs
vendored
Normal file
@@ -0,0 +1,76 @@
|
||||
#!/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 ===');
|
||||
Reference in New Issue
Block a user