@omendb/omendb 0.0.27 → 0.0.28

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 +87 -2
  2. package/index.js +24 -0
  3. package/package.json +6 -6
package/index.d.ts CHANGED
@@ -166,8 +166,14 @@ export declare class VectorDatabase {
166
166
  * @returns Number of nodes reordered
167
167
  */
168
168
  optimize(): number
169
- /** Merge another database into this one. */
170
- mergeFrom(other: VectorDatabase): number
169
+ /**
170
+ * Merge another database into this one.
171
+ *
172
+ * @param other - Source database to merge from
173
+ * @param keyPrefix - Optional prefix for all source IDs (e.g., "subdir/")
174
+ * @returns Number of vectors merged
175
+ */
176
+ mergeFrom(other: VectorDatabase, keyPrefix?: string | undefined | null): number
171
177
  /**
172
178
  * List all vector IDs (without loading vector data).
173
179
  *
@@ -282,6 +288,73 @@ export declare class VectorDatabase {
282
288
  * keeping the Node.js event loop free.
283
289
  */
284
290
  searchBatch(queries: Array<Array<number> | Float32Array>, k: number, ef?: number | undefined | null): Promise<Array<Array<SearchResult>>>
291
+ /**
292
+ * Enable sparse vector indexing for SPLADE-style retrieval.
293
+ *
294
+ * Called automatically by setSparse() and setHybridSparse().
295
+ * Call explicitly before sparseSearch() on an empty index.
296
+ */
297
+ enableSparse(): void
298
+ /** Check if sparse indexing is enabled. */
299
+ get hasSparse(): boolean
300
+ /**
301
+ * Insert or update a sparse vector.
302
+ *
303
+ * @param id - Unique identifier
304
+ * @param sparse - Sparse vector as {indices: number[], values: number[]} or {dim: weight}
305
+ * @param metadata - Optional metadata
306
+ *
307
+ * @example
308
+ * ```javascript
309
+ * db.setSparse("doc1", {indices: [10, 42], values: [0.5, 1.2]}, {title: "Hello"});
310
+ * db.setSparse("doc2", {"10": 0.5, "42": 1.2}, {title: "World"});
311
+ * ```
312
+ */
313
+ setSparse(id: string, sparse: { indices: number[]; values: number[] } | Record<string, number>, metadata?: Record<string, unknown> | undefined): void
314
+ /**
315
+ * Insert or update both dense and sparse vectors together.
316
+ *
317
+ * @param id - Unique identifier
318
+ * @param vector - Dense vector
319
+ * @param sparse - Sparse vector
320
+ * @param metadata - Optional metadata
321
+ */
322
+ setHybridSparse(id: string, vector: Array<number> | Float32Array, sparse: { indices: number[]; values: number[] } | Record<string, number>, metadata?: Record<string, unknown> | undefined): void
323
+ /**
324
+ * Search sparse vectors by dot product similarity.
325
+ *
326
+ * @param query - Sparse query vector
327
+ * @param k - Number of results
328
+ * @param options - Optional: {filter?}
329
+ * @returns Array of {id, score, metadata} sorted by score descending
330
+ *
331
+ * @example
332
+ * ```javascript
333
+ * const results = db.sparseSearch({indices: [10, 42], values: [1.0, 0.5]}, 5);
334
+ * const results = db.sparseSearch({"10": 1.0, "42": 0.5}, 5);
335
+ * ```
336
+ */
337
+ sparseSearch(query: { indices: number[]; values: number[] } | Record<string, number>, k: number, options?: { filter?: Record<string, unknown> } | undefined): Array<SparseSearchResult>
338
+ /**
339
+ * Hybrid dense + sparse search with Reciprocal Rank Fusion (RRF).
340
+ *
341
+ * @param queryVector - Dense query vector
342
+ * @param sparseQuery - Sparse query vector
343
+ * @param k - Number of results
344
+ * @param options - Optional: {alpha?, filter?}
345
+ * @returns Array of {id, score, metadata}
346
+ *
347
+ * @example
348
+ * ```javascript
349
+ * const results = db.hybridSparseSearch(
350
+ * [1, 0, 0],
351
+ * {indices: [10, 42], values: [1.0, 0.5]},
352
+ * 10,
353
+ * { alpha: 0.5 }
354
+ * );
355
+ * ```
356
+ */
357
+ 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
358
  }
286
359
 
287
360
  export interface GetResult {
@@ -366,6 +439,10 @@ export interface OpenOptions {
366
439
  * - false/null: Disabled (default, single-vector mode)
367
440
  */
368
441
  multiVector?: boolean | { repetitions?: number; partitionBits?: number; seed?: number; dProj?: number | null } | null | undefined
442
+ /** SQ8 refiner: rescore with full precision (default: true when quantized) */
443
+ rescore?: boolean
444
+ /** Candidate multiplier for rescoring (default: 3.0) */
445
+ oversample?: number
369
446
  }
370
447
 
371
448
  export interface SearchResult {
@@ -391,6 +468,14 @@ export interface SetItem {
391
468
  document?: string
392
469
  }
393
470
 
471
+ /** Sparse search result returned from sparseSearch / hybridSparseSearch. */
472
+ export interface SparseSearchResult {
473
+ id: string
474
+ /** Dot product score (higher = more similar) */
475
+ score: number
476
+ metadata: Record<string, unknown>
477
+ }
478
+
394
479
  export interface StatsResult {
395
480
  dimensions: number
396
481
  count: number
package/index.js CHANGED
@@ -337,6 +337,30 @@ class VectorDatabase {
337
337
  compact() {
338
338
  return this._native.compact();
339
339
  }
340
+
341
+ enableSparse() {
342
+ return this._native.enableSparse();
343
+ }
344
+
345
+ get hasSparse() {
346
+ return this._native.hasSparse;
347
+ }
348
+
349
+ setSparse(id, sparse, metadata) {
350
+ return this._native.setSparse(id, sparse, metadata);
351
+ }
352
+
353
+ setHybridSparse(id, vector, sparse, metadata) {
354
+ return this._native.setHybridSparse(id, vector, sparse, metadata);
355
+ }
356
+
357
+ sparseSearch(query, k, options) {
358
+ return this._native.sparseSearch(query, k, options);
359
+ }
360
+
361
+ hybridSparseSearch(queryVector, sparseQuery, k, options) {
362
+ return this._native.hybridSparseSearch(queryVector, sparseQuery, k, options);
363
+ }
340
364
  }
341
365
 
342
366
  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.28",
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.28",
54
+ "@omendb/omendb-darwin-arm64": "0.0.28",
55
+ "@omendb/omendb-linux-x64-gnu": "0.0.28",
56
+ "@omendb/omendb-linux-arm64-gnu": "0.0.28",
57
+ "@omendb/omendb-win32-x64-msvc": "0.0.28"
58
58
  }
59
59
  }