@omendb/omendb 0.0.27 → 0.0.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/index.d.ts +119 -5
  2. package/index.js +30 -2
  3. package/package.json +6 -6
package/index.d.ts CHANGED
@@ -24,6 +24,9 @@ export declare class VectorDatabase {
24
24
  *
25
25
  * @param items - Array of {id, vector, metadata?, text?} or {id, vectors, metadata?}
26
26
  * @returns Number of vectors inserted/updated
27
+ *
28
+ * @note Batch inserts (multiple items) skip the WAL for performance. Data is not
29
+ * durable until flush() is called.
27
30
  */
28
31
  set(items: Array<SetItem>): Promise<number>
29
32
  /** Get a vector by ID. */
@@ -124,6 +127,8 @@ export declare class VectorDatabase {
124
127
  isEmpty(): boolean
125
128
  /** Get database statistics. */
126
129
  stats(): StatsResult
130
+ /** Get comprehensive database diagnostics. */
131
+ info(): InfoResult
127
132
  /** Get current ef_search value. */
128
133
  get efSearch(): number
129
134
  /** Set ef_search value. */
@@ -166,8 +171,14 @@ export declare class VectorDatabase {
166
171
  * @returns Number of nodes reordered
167
172
  */
168
173
  optimize(): number
169
- /** Merge another database into this one. */
170
- mergeFrom(other: VectorDatabase): number
174
+ /**
175
+ * Merge another database into this one.
176
+ *
177
+ * @param other - Source database to merge from
178
+ * @param keyPrefix - Optional prefix for all source IDs (e.g., "subdir/")
179
+ * @returns Number of vectors merged
180
+ */
181
+ mergeFrom(other: VectorDatabase, keyPrefix?: string | undefined | null): number
171
182
  /**
172
183
  * List all vector IDs (without loading vector data).
173
184
  *
@@ -247,9 +258,11 @@ export declare class VectorDatabase {
247
258
  /**
248
259
  * Search for k nearest neighbors.
249
260
  *
250
- * @param query - Query vector (number[] or Float32Array)
261
+ * @param query - Query vector(s): number[] or Float32Array for single-vector stores;
262
+ * number[][] or Float32Array[] for multi-vector stores
251
263
  * @param k - Number of results to return
252
- * @param options - Optional search options: {filter?, ef?, maxDistance?}
264
+ * @param options - Optional search options. Single-vector: {filter?, ef?, maxDistance?}.
265
+ * Multi-vector: {rerank?, rerankFactor?}
253
266
  * @returns Array of {id, distance, score, metadata}
254
267
  *
255
268
  * @example
@@ -260,9 +273,12 @@ export declare class VectorDatabase {
260
273
  * // With options
261
274
  * db.search([1, 0, 0, 0], 10, { filter: { category: "A" }, ef: 200 });
262
275
  * db.search([1, 0, 0, 0], 10, { maxDistance: 0.5 });
276
+ *
277
+ * // Multi-vector search
278
+ * db.search([[0.1, 0.2], [0.3, 0.4]], 5, { rerank: true, rerankFactor: 8 });
263
279
  * ```
264
280
  */
265
- search(query: Array<number> | Float32Array | string, k: number, options?: { filter?: Record<string, unknown>; ef?: number; maxDistance?: number } | undefined): Promise<Array<SearchResult>>
281
+ search(query: Array<number> | Float32Array | string | Array<Array<number>> | Array<Float32Array>, k: number, options?: { filter?: Record<string, unknown>; ef?: number; maxDistance?: number; rerank?: boolean; rerankFactor?: number } | undefined): Promise<Array<SearchResult>>
266
282
  /**
267
283
  * Search multi-vector store with query tokens.
268
284
  *
@@ -282,6 +298,73 @@ export declare class VectorDatabase {
282
298
  * keeping the Node.js event loop free.
283
299
  */
284
300
  searchBatch(queries: Array<Array<number> | Float32Array>, k: number, ef?: number | undefined | null): Promise<Array<Array<SearchResult>>>
301
+ /**
302
+ * Enable sparse vector indexing for SPLADE-style retrieval.
303
+ *
304
+ * Called automatically by setSparse() and setHybridSparse().
305
+ * Call explicitly before sparseSearch() on an empty index.
306
+ */
307
+ enableSparse(): void
308
+ /** Check if sparse indexing is enabled. */
309
+ get hasSparse(): boolean
310
+ /**
311
+ * Insert or update a sparse vector.
312
+ *
313
+ * @param id - Unique identifier
314
+ * @param sparse - Sparse vector as {indices: number[], values: number[]} or {dim: weight}
315
+ * @param metadata - Optional metadata
316
+ *
317
+ * @example
318
+ * ```javascript
319
+ * db.setSparse("doc1", {indices: [10, 42], values: [0.5, 1.2]}, {title: "Hello"});
320
+ * db.setSparse("doc2", {"10": 0.5, "42": 1.2}, {title: "World"});
321
+ * ```
322
+ */
323
+ setSparse(id: string, sparse: { indices: number[]; values: number[] } | Record<string, number>, metadata?: Record<string, unknown> | undefined): void
324
+ /**
325
+ * Insert or update both dense and sparse vectors together.
326
+ *
327
+ * @param id - Unique identifier
328
+ * @param vector - Dense vector
329
+ * @param sparse - Sparse vector
330
+ * @param metadata - Optional metadata
331
+ */
332
+ setHybridSparse(id: string, vector: Array<number> | Float32Array, sparse: { indices: number[]; values: number[] } | Record<string, number>, metadata?: Record<string, unknown> | undefined): void
333
+ /**
334
+ * Search sparse vectors by dot product similarity.
335
+ *
336
+ * @param query - Sparse query vector
337
+ * @param k - Number of results
338
+ * @param options - Optional: {filter?}
339
+ * @returns Array of {id, score, metadata} sorted by score descending
340
+ *
341
+ * @example
342
+ * ```javascript
343
+ * const results = db.sparseSearch({indices: [10, 42], values: [1.0, 0.5]}, 5);
344
+ * const results = db.sparseSearch({"10": 1.0, "42": 0.5}, 5);
345
+ * ```
346
+ */
347
+ sparseSearch(query: { indices: number[]; values: number[] } | Record<string, number>, k: number, options?: { filter?: Record<string, unknown> } | undefined): Array<SparseSearchResult>
348
+ /**
349
+ * Hybrid dense + sparse search with Reciprocal Rank Fusion (RRF).
350
+ *
351
+ * @param queryVector - Dense query vector
352
+ * @param sparseQuery - Sparse query vector
353
+ * @param k - Number of results
354
+ * @param options - Optional: {alpha?, filter?}
355
+ * @returns Array of {id, score, metadata}
356
+ *
357
+ * @example
358
+ * ```javascript
359
+ * const results = db.hybridSparseSearch(
360
+ * [1, 0, 0],
361
+ * {indices: [10, 42], values: [1.0, 0.5]},
362
+ * 10,
363
+ * { alpha: 0.5 }
364
+ * );
365
+ * ```
366
+ */
367
+ hybridSparseSearch(queryVector: Array<number> | Float32Array, sparseQuery: { indices: number[]; values: number[] } | Record<string, number>, k: number, options?: { alpha?: number; filter?: Record<string, unknown> } | undefined): Array<SparseSearchResult>
285
368
  }
286
369
 
287
370
  export interface GetResult {
@@ -300,6 +383,25 @@ export interface HybridSearchResult {
300
383
  semanticScore?: number
301
384
  }
302
385
 
386
+ export interface InfoResult {
387
+ vectorCount: number
388
+ deletedCount: number
389
+ dimensions: number
390
+ metric: string
391
+ frozenSegmentCount: number
392
+ mutableSegmentVectors: number
393
+ vectorBytes: number
394
+ graphBytes: number
395
+ totalMemoryBytes: number
396
+ walEntries: number
397
+ isPersistent: boolean
398
+ hnswM: number
399
+ hnswEfConstruction: number
400
+ hnswEfSearch: number
401
+ quantization: boolean
402
+ segmentCapacity: number
403
+ }
404
+
303
405
  /**
304
406
  * Open or create a vector database.
305
407
  *
@@ -366,6 +468,10 @@ export interface OpenOptions {
366
468
  * - false/null: Disabled (default, single-vector mode)
367
469
  */
368
470
  multiVector?: boolean | { repetitions?: number; partitionBits?: number; seed?: number; dProj?: number | null } | null | undefined
471
+ /** SQ8 refiner: rescore with full precision (default: true when quantized) */
472
+ rescore?: boolean
473
+ /** Candidate multiplier for rescoring (default: 3.0) */
474
+ oversample?: number
369
475
  }
370
476
 
371
477
  export interface SearchResult {
@@ -391,6 +497,14 @@ export interface SetItem {
391
497
  document?: string
392
498
  }
393
499
 
500
+ /** Sparse search result returned from sparseSearch / hybridSparseSearch. */
501
+ export interface SparseSearchResult {
502
+ id: string
503
+ /** Dot product score (higher = more similar) */
504
+ score: number
505
+ metadata: Record<string, unknown>
506
+ }
507
+
394
508
  export interface StatsResult {
395
509
  dimensions: number
396
510
  count: number
package/index.js CHANGED
@@ -314,8 +314,12 @@ class VectorDatabase {
314
314
  return this._native.optimize();
315
315
  }
316
316
 
317
- mergeFrom(other) {
318
- return this._native.mergeFrom(other._native);
317
+ mergeFrom(other, keyPrefix) {
318
+ return this._native.mergeFrom(other._native, keyPrefix);
319
+ }
320
+
321
+ info() {
322
+ return this._native.info();
319
323
  }
320
324
 
321
325
  ids() {
@@ -337,6 +341,30 @@ class VectorDatabase {
337
341
  compact() {
338
342
  return this._native.compact();
339
343
  }
344
+
345
+ enableSparse() {
346
+ return this._native.enableSparse();
347
+ }
348
+
349
+ get hasSparse() {
350
+ return this._native.hasSparse;
351
+ }
352
+
353
+ setSparse(id, sparse, metadata) {
354
+ return this._native.setSparse(id, sparse, metadata);
355
+ }
356
+
357
+ setHybridSparse(id, vector, sparse, metadata) {
358
+ return this._native.setHybridSparse(id, vector, sparse, metadata);
359
+ }
360
+
361
+ sparseSearch(query, k, options) {
362
+ return this._native.sparseSearch(query, k, options);
363
+ }
364
+
365
+ hybridSparseSearch(queryVector, sparseQuery, k, options) {
366
+ return this._native.hybridSparseSearch(queryVector, sparseQuery, k, options);
367
+ }
340
368
  }
341
369
 
342
370
  function open(path, options, embeddingFn) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@omendb/omendb",
3
- "version": "0.0.27",
3
+ "version": "0.0.29",
4
4
  "description": "Fast embedded vector database with HNSW + ACORN-1 filtered search",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",
@@ -50,10 +50,10 @@
50
50
  "omendb.node"
51
51
  ],
52
52
  "optionalDependencies": {
53
- "@omendb/omendb-darwin-x64": "0.0.27",
54
- "@omendb/omendb-darwin-arm64": "0.0.27",
55
- "@omendb/omendb-linux-x64-gnu": "0.0.27",
56
- "@omendb/omendb-linux-arm64-gnu": "0.0.27",
57
- "@omendb/omendb-win32-x64-msvc": "0.0.27"
53
+ "@omendb/omendb-darwin-x64": "0.0.29",
54
+ "@omendb/omendb-darwin-arm64": "0.0.29",
55
+ "@omendb/omendb-linux-x64-gnu": "0.0.29",
56
+ "@omendb/omendb-linux-arm64-gnu": "0.0.29",
57
+ "@omendb/omendb-win32-x64-msvc": "0.0.29"
58
58
  }
59
59
  }