redis-vl 0.1.0-beta.0

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 (87) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +212 -0
  3. package/dist/errors.d.ts +50 -0
  4. package/dist/errors.d.ts.map +1 -0
  5. package/dist/errors.js +87 -0
  6. package/dist/errors.js.map +1 -0
  7. package/dist/index.d.ts +21 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +25 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/indexes/search-index.d.ts +368 -0
  12. package/dist/indexes/search-index.d.ts.map +1 -0
  13. package/dist/indexes/search-index.js +475 -0
  14. package/dist/indexes/search-index.js.map +1 -0
  15. package/dist/query/base.d.ts +51 -0
  16. package/dist/query/base.d.ts.map +1 -0
  17. package/dist/query/base.js +6 -0
  18. package/dist/query/base.js.map +1 -0
  19. package/dist/query/index.d.ts +7 -0
  20. package/dist/query/index.d.ts.map +1 -0
  21. package/dist/query/index.js +7 -0
  22. package/dist/query/index.js.map +1 -0
  23. package/dist/query/vector.d.ts +199 -0
  24. package/dist/query/vector.d.ts.map +1 -0
  25. package/dist/query/vector.js +198 -0
  26. package/dist/query/vector.js.map +1 -0
  27. package/dist/redis/index-info-parser.d.ts +25 -0
  28. package/dist/redis/index-info-parser.d.ts.map +1 -0
  29. package/dist/redis/index-info-parser.js +301 -0
  30. package/dist/redis/index-info-parser.js.map +1 -0
  31. package/dist/redis/schema-types.d.ts +81 -0
  32. package/dist/redis/schema-types.d.ts.map +1 -0
  33. package/dist/redis/schema-types.js +18 -0
  34. package/dist/redis/schema-types.js.map +1 -0
  35. package/dist/redis/utils.d.ts +7 -0
  36. package/dist/redis/utils.d.ts.map +1 -0
  37. package/dist/redis/utils.js +221 -0
  38. package/dist/redis/utils.js.map +1 -0
  39. package/dist/schema/fields.d.ts +163 -0
  40. package/dist/schema/fields.d.ts.map +1 -0
  41. package/dist/schema/fields.js +304 -0
  42. package/dist/schema/fields.js.map +1 -0
  43. package/dist/schema/index.d.ts +8 -0
  44. package/dist/schema/index.d.ts.map +1 -0
  45. package/dist/schema/index.js +8 -0
  46. package/dist/schema/index.js.map +1 -0
  47. package/dist/schema/schema.d.ts +247 -0
  48. package/dist/schema/schema.d.ts.map +1 -0
  49. package/dist/schema/schema.js +403 -0
  50. package/dist/schema/schema.js.map +1 -0
  51. package/dist/schema/types.d.ts +56 -0
  52. package/dist/schema/types.d.ts.map +1 -0
  53. package/dist/schema/types.js +62 -0
  54. package/dist/schema/types.js.map +1 -0
  55. package/dist/storage/base-storage.d.ts +107 -0
  56. package/dist/storage/base-storage.d.ts.map +1 -0
  57. package/dist/storage/base-storage.js +187 -0
  58. package/dist/storage/base-storage.js.map +1 -0
  59. package/dist/storage/hash-storage.d.ts +29 -0
  60. package/dist/storage/hash-storage.d.ts.map +1 -0
  61. package/dist/storage/hash-storage.js +122 -0
  62. package/dist/storage/hash-storage.js.map +1 -0
  63. package/dist/storage/index.d.ts +4 -0
  64. package/dist/storage/index.d.ts.map +1 -0
  65. package/dist/storage/index.js +4 -0
  66. package/dist/storage/index.js.map +1 -0
  67. package/dist/storage/json-storage.d.ts +19 -0
  68. package/dist/storage/json-storage.d.ts.map +1 -0
  69. package/dist/storage/json-storage.js +81 -0
  70. package/dist/storage/json-storage.js.map +1 -0
  71. package/dist/utils/distance.d.ts +92 -0
  72. package/dist/utils/distance.d.ts.map +1 -0
  73. package/dist/utils/distance.js +98 -0
  74. package/dist/utils/distance.js.map +1 -0
  75. package/dist/vectorizers/base-vectorizer.d.ts +88 -0
  76. package/dist/vectorizers/base-vectorizer.d.ts.map +1 -0
  77. package/dist/vectorizers/base-vectorizer.js +32 -0
  78. package/dist/vectorizers/base-vectorizer.js.map +1 -0
  79. package/dist/vectorizers/huggingface-vectorizer.d.ts +103 -0
  80. package/dist/vectorizers/huggingface-vectorizer.d.ts.map +1 -0
  81. package/dist/vectorizers/huggingface-vectorizer.js +142 -0
  82. package/dist/vectorizers/huggingface-vectorizer.js.map +1 -0
  83. package/dist/vectorizers/index.d.ts +10 -0
  84. package/dist/vectorizers/index.d.ts.map +1 -0
  85. package/dist/vectorizers/index.js +10 -0
  86. package/dist/vectorizers/index.js.map +1 -0
  87. package/package.json +96 -0
@@ -0,0 +1,199 @@
1
+ import { BaseQuery } from './base.js';
2
+ import { VectorDataType, VectorDistanceMetric } from '../schema/types.js';
3
+ /**
4
+ * Hybrid policy options for vector search with filters
5
+ */
6
+ export type HybridPolicy = 'BATCHES' | 'ADHOC_BF';
7
+ /**
8
+ * USE_SEARCH_HISTORY options for SVS-VAMANA indexes
9
+ */
10
+ export type UseSearchHistory = 'OFF' | 'ON' | 'AUTO';
11
+ /**
12
+ * Configuration for VectorQuery
13
+ */
14
+ export interface VectorQueryConfig {
15
+ /** Vector to search with */
16
+ vector: number[];
17
+ /** Name of the vector field in the index */
18
+ vectorField: string;
19
+ /** Number of results to return */
20
+ numResults?: number;
21
+ /** Filter expression (e.g., '@category:{electronics}') */
22
+ filter?: string;
23
+ /** Fields to return in results */
24
+ returnFields?: string[];
25
+ /** Distance metric to use */
26
+ distanceMetric?: VectorDistanceMetric;
27
+ /**
28
+ * Vector datatype to use when serializing the query vector.
29
+ * Must match the datatype declared on the schema's vector field.
30
+ * @default 'FLOAT32'
31
+ */
32
+ datatype?: VectorDataType | string;
33
+ /** Pagination offset */
34
+ offset?: number;
35
+ /** Pagination limit */
36
+ limit?: number;
37
+ /**
38
+ * Alias for the score field in results
39
+ * @default 'vector_distance'
40
+ */
41
+ scoreAlias?: string;
42
+ /**
43
+ * HNSW ef_runtime parameter - controls recall vs speed tradeoff
44
+ * Higher values provide better recall but slower search
45
+ * @default undefined (uses index default)
46
+ */
47
+ efRuntime?: number;
48
+ /**
49
+ * HNSW epsilon parameter - range search approximation factor
50
+ * Used for range-based vector queries
51
+ * @default undefined
52
+ */
53
+ epsilon?: number;
54
+ /**
55
+ * Hybrid policy for combining vector search with filters
56
+ * - BATCHES: Process filters in batches (better for large result sets)
57
+ * - ADHOC_BF: Ad-hoc brute force (better for small result sets)
58
+ * @default undefined
59
+ */
60
+ hybridPolicy?: HybridPolicy;
61
+ /**
62
+ * Batch size when using BATCHES hybrid policy
63
+ * Controls memory usage vs performance tradeoff
64
+ * Only applies when hybridPolicy is "BATCHES"
65
+ * @default undefined
66
+ */
67
+ batchSize?: number;
68
+ /**
69
+ * Normalize vector distance to similarity score between 0 and 1
70
+ *
71
+ * Redis distance metrics have different ranges:
72
+ * - COSINE: 0 to 2
73
+ * - L2: 0 to infinity
74
+ * - IP: Depends on vector magnitude
75
+ *
76
+ * When true, converts distances to similarity scores where:
77
+ * - 1.0 = perfect match (most similar)
78
+ * - 0.0 = completely different (least similar)
79
+ *
80
+ * Note: IP (Inner Product) cannot be normalized. Use COSINE instead,
81
+ * which is normalized IP by definition.
82
+ *
83
+ * @default false
84
+ */
85
+ normalizeDistance?: boolean;
86
+ /**
87
+ * SVS-VAMANA search window size parameter
88
+ *
89
+ * Controls the size of the search window for SVS-VAMANA KNN searches.
90
+ * Increasing this value generally yields more accurate but slower search results.
91
+ *
92
+ * Only applies when using SVS-VAMANA algorithm indexes.
93
+ *
94
+ * @default undefined (uses index default)
95
+ */
96
+ searchWindowSize?: number;
97
+ /**
98
+ * SVS-VAMANA USE_SEARCH_HISTORY parameter
99
+ *
100
+ * For SVS-VAMANA indexes, controls whether to use the search buffer
101
+ * or entire search history.
102
+ *
103
+ * Options:
104
+ * - OFF: Don't use search history
105
+ * - ON: Use search history
106
+ * - AUTO: Automatically decide based on query characteristics
107
+ *
108
+ * Only applies when using SVS-VAMANA algorithm indexes.
109
+ *
110
+ * @default undefined
111
+ */
112
+ useSearchHistory?: UseSearchHistory;
113
+ /**
114
+ * SVS-VAMANA SEARCH_BUFFER_CAPACITY parameter
115
+ *
116
+ * Tuning parameter for SVS-VAMANA indexes using two-level compression.
117
+ * Determines the number of vector candidates to collect in the first level
118
+ * of search before the re-ranking level.
119
+ *
120
+ * Higher values may improve recall at the cost of performance.
121
+ *
122
+ * Only applies when using SVS-VAMANA algorithm indexes with two-level compression.
123
+ *
124
+ * @default undefined
125
+ */
126
+ searchBufferCapacity?: number;
127
+ }
128
+ /**
129
+ * Vector similarity search query using KNN (K-Nearest Neighbors)
130
+ *
131
+ * Performs semantic search by finding documents with vectors similar to the query vector.
132
+ *
133
+ * @example
134
+ * ```typescript
135
+ * import { VectorQuery } from 'redis-vl';
136
+ *
137
+ * // Basic vector search
138
+ * const query = new VectorQuery({
139
+ * vector: [0.1, 0.2, 0.3, ...],
140
+ * vectorField: 'embedding',
141
+ * numResults: 10
142
+ * });
143
+ *
144
+ * const results = await index.search(query);
145
+ * ```
146
+ *
147
+ * @example
148
+ * ```typescript
149
+ * // Vector search with metadata filtering
150
+ * const query = new VectorQuery({
151
+ * vector: embedding,
152
+ * vectorField: 'embedding',
153
+ * filter: '@category:{electronics} @price:[0 1000]',
154
+ * numResults: 5,
155
+ * returnFields: ['title', 'price']
156
+ * });
157
+ *
158
+ * const results = await index.search(query);
159
+ * ```
160
+ */
161
+ export declare class VectorQuery implements BaseQuery {
162
+ readonly vector: number[];
163
+ readonly vectorField: string;
164
+ readonly numResults: number;
165
+ readonly filter?: string;
166
+ readonly returnFields?: string[];
167
+ readonly distanceMetric: VectorDistanceMetric;
168
+ readonly datatype: VectorDataType;
169
+ readonly offset?: number;
170
+ readonly limit?: number;
171
+ readonly scoreAlias: string;
172
+ readonly efRuntime?: number;
173
+ readonly epsilon?: number;
174
+ readonly hybridPolicy?: HybridPolicy;
175
+ readonly batchSize?: number;
176
+ readonly normalizeDistance: boolean;
177
+ readonly searchWindowSize?: number;
178
+ readonly useSearchHistory?: UseSearchHistory;
179
+ readonly searchBufferCapacity?: number;
180
+ constructor(config: VectorQueryConfig);
181
+ /**
182
+ * Build the Redis KNN query string
183
+ *
184
+ * Format: (filter)=>[KNN K @vector_field $vector AS score EF_RUNTIME $ef_runtime EPSILON $epsilon]
185
+ *
186
+ * @returns Redis FT.SEARCH query string
187
+ */
188
+ buildQuery(): string;
189
+ /**
190
+ * Build query parameters for Redis FT.SEARCH
191
+ *
192
+ * Converts the vector to a binary buffer as expected by Redis.
193
+ * Includes HNSW and SVS-VAMANA parameters if provided.
194
+ *
195
+ * @returns Query parameters object with vector buffer and algorithm params
196
+ */
197
+ buildParams(): Record<string, unknown>;
198
+ }
199
+ //# sourceMappingURL=vector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vector.d.ts","sourceRoot":"","sources":["../../src/query/vector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAI1E;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,UAAU,CAAC;AAElD;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,IAAI,GAAG,MAAM,CAAC;AAErD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAC9B,4BAA4B;IAC5B,MAAM,EAAE,MAAM,EAAE,CAAC;IAEjB,4CAA4C;IAC5C,WAAW,EAAE,MAAM,CAAC;IAEpB,kCAAkC;IAClC,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,0DAA0D;IAC1D,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,kCAAkC;IAClC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IAExB,6BAA6B;IAC7B,cAAc,CAAC,EAAE,oBAAoB,CAAC;IAEtC;;;;OAIG;IACH,QAAQ,CAAC,EAAE,cAAc,GAAG,MAAM,CAAC;IAEnC,wBAAwB;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,uBAAuB;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,YAAY,CAAC;IAE5B;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;;;;;;;;;;;;;;OAgBG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAE5B;;;;;;;;;OASG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;;;;;;;;;;;;;OAcG;IACH,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IAEpC;;;;;;;;;;;;OAYG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;CACjC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,qBAAa,WAAY,YAAW,SAAS;IACzC,SAAgB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjC,SAAgB,WAAW,EAAE,MAAM,CAAC;IACpC,SAAgB,UAAU,EAAE,MAAM,CAAC;IACnC,SAAgB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChC,SAAgB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxC,SAAgB,cAAc,EAAE,oBAAoB,CAAC;IACrD,SAAgB,QAAQ,EAAE,cAAc,CAAC;IACzC,SAAgB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChC,SAAgB,KAAK,CAAC,EAAE,MAAM,CAAC;IAC/B,SAAgB,UAAU,EAAE,MAAM,CAAC;IACnC,SAAgB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnC,SAAgB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjC,SAAgB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5C,SAAgB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnC,SAAgB,iBAAiB,EAAE,OAAO,CAAC;IAC3C,SAAgB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1C,SAAgB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpD,SAAgB,oBAAoB,CAAC,EAAE,MAAM,CAAC;gBAElC,MAAM,EAAE,iBAAiB;IAuFrC;;;;;;OAMG;IACH,UAAU,IAAI,MAAM;IAmCpB;;;;;;;OAOG;IACH,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAyBzC"}
@@ -0,0 +1,198 @@
1
+ import { VectorDistanceMetric } from '../schema/types.js';
2
+ import { QueryValidationError, SchemaValidationError } from '../errors.js';
3
+ import { encodeVectorBuffer, normalizeVectorDataType } from '../redis/utils.js';
4
+ /**
5
+ * Vector similarity search query using KNN (K-Nearest Neighbors)
6
+ *
7
+ * Performs semantic search by finding documents with vectors similar to the query vector.
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * import { VectorQuery } from 'redis-vl';
12
+ *
13
+ * // Basic vector search
14
+ * const query = new VectorQuery({
15
+ * vector: [0.1, 0.2, 0.3, ...],
16
+ * vectorField: 'embedding',
17
+ * numResults: 10
18
+ * });
19
+ *
20
+ * const results = await index.search(query);
21
+ * ```
22
+ *
23
+ * @example
24
+ * ```typescript
25
+ * // Vector search with metadata filtering
26
+ * const query = new VectorQuery({
27
+ * vector: embedding,
28
+ * vectorField: 'embedding',
29
+ * filter: '@category:{electronics} @price:[0 1000]',
30
+ * numResults: 5,
31
+ * returnFields: ['title', 'price']
32
+ * });
33
+ *
34
+ * const results = await index.search(query);
35
+ * ```
36
+ */
37
+ export class VectorQuery {
38
+ vector;
39
+ vectorField;
40
+ numResults;
41
+ filter;
42
+ returnFields;
43
+ distanceMetric;
44
+ datatype;
45
+ offset;
46
+ limit;
47
+ scoreAlias;
48
+ efRuntime;
49
+ epsilon;
50
+ hybridPolicy;
51
+ batchSize;
52
+ normalizeDistance;
53
+ searchWindowSize;
54
+ useSearchHistory;
55
+ searchBufferCapacity;
56
+ constructor(config) {
57
+ // Validate vector
58
+ if (!config.vector || config.vector.length === 0) {
59
+ throw new QueryValidationError('Vector cannot be empty');
60
+ }
61
+ // Validate vectorField
62
+ if (!config.vectorField) {
63
+ throw new QueryValidationError('vectorField is required');
64
+ }
65
+ // Validate HNSW parameters
66
+ if (config.efRuntime !== undefined && config.efRuntime <= 0) {
67
+ throw new QueryValidationError('efRuntime must be positive');
68
+ }
69
+ if (config.epsilon !== undefined && config.epsilon < 0) {
70
+ throw new QueryValidationError('epsilon must be non-negative');
71
+ }
72
+ // Validate hybrid policy parameters
73
+ if (config.hybridPolicy !== undefined) {
74
+ if (config.hybridPolicy !== 'BATCHES' && config.hybridPolicy !== 'ADHOC_BF') {
75
+ throw new QueryValidationError('hybridPolicy must be either BATCHES or ADHOC_BF');
76
+ }
77
+ }
78
+ if (config.batchSize !== undefined) {
79
+ if (config.hybridPolicy === undefined) {
80
+ throw new QueryValidationError('batchSize can only be used with hybridPolicy');
81
+ }
82
+ if (config.batchSize <= 0) {
83
+ throw new QueryValidationError('batchSize must be positive');
84
+ }
85
+ }
86
+ // Validate normalizeDistance with IP metric
87
+ if (config.normalizeDistance && config.distanceMetric === VectorDistanceMetric.IP) {
88
+ console.warn('Attempting to normalize inner product distance metric. ' +
89
+ 'Use cosine distance instead which is normalized inner product by definition.');
90
+ }
91
+ // Validate SVS-VAMANA parameters
92
+ if (config.searchWindowSize !== undefined && config.searchWindowSize <= 0) {
93
+ throw new QueryValidationError('searchWindowSize must be positive');
94
+ }
95
+ if (config.useSearchHistory !== undefined) {
96
+ const validValues = ['OFF', 'ON', 'AUTO'];
97
+ if (!validValues.includes(config.useSearchHistory)) {
98
+ throw new QueryValidationError('useSearchHistory must be one of: OFF, ON, AUTO');
99
+ }
100
+ }
101
+ if (config.searchBufferCapacity !== undefined && config.searchBufferCapacity <= 0) {
102
+ throw new QueryValidationError('searchBufferCapacity must be positive');
103
+ }
104
+ this.vector = config.vector;
105
+ this.vectorField = config.vectorField;
106
+ this.numResults = config.numResults ?? 10;
107
+ this.filter = config.filter;
108
+ this.returnFields = config.returnFields;
109
+ this.distanceMetric = config.distanceMetric ?? VectorDistanceMetric.COSINE;
110
+ try {
111
+ this.datatype = normalizeVectorDataType(config.datatype);
112
+ }
113
+ catch (error) {
114
+ if (error instanceof SchemaValidationError) {
115
+ throw new QueryValidationError(error.message);
116
+ }
117
+ throw error;
118
+ }
119
+ this.offset = config.offset;
120
+ this.limit = config.limit;
121
+ this.scoreAlias = config.scoreAlias ?? 'vector_distance';
122
+ this.efRuntime = config.efRuntime;
123
+ this.epsilon = config.epsilon;
124
+ this.hybridPolicy = config.hybridPolicy;
125
+ this.batchSize = config.batchSize;
126
+ this.normalizeDistance = config.normalizeDistance ?? false;
127
+ this.searchWindowSize = config.searchWindowSize;
128
+ this.useSearchHistory = config.useSearchHistory;
129
+ this.searchBufferCapacity = config.searchBufferCapacity;
130
+ }
131
+ /**
132
+ * Build the Redis KNN query string
133
+ *
134
+ * Format: (filter)=>[KNN K @vector_field $vector AS score EF_RUNTIME $ef_runtime EPSILON $epsilon]
135
+ *
136
+ * @returns Redis FT.SEARCH query string
137
+ */
138
+ buildQuery() {
139
+ const filterPart = this.filter ? `(${this.filter})` : '*';
140
+ let knnPart = `=>[KNN ${this.numResults} @${this.vectorField} $vector AS ${this.scoreAlias}`;
141
+ // Add HNSW parameters if provided
142
+ if (this.efRuntime !== undefined) {
143
+ knnPart += ' EF_RUNTIME $ef_runtime';
144
+ }
145
+ if (this.epsilon !== undefined) {
146
+ knnPart += ' EPSILON $epsilon';
147
+ }
148
+ // Add hybrid policy parameters if provided
149
+ if (this.hybridPolicy !== undefined) {
150
+ knnPart += ` HYBRID_POLICY ${this.hybridPolicy}`;
151
+ }
152
+ if (this.batchSize !== undefined && this.hybridPolicy === 'BATCHES') {
153
+ knnPart += ` BATCH_SIZE ${this.batchSize}`;
154
+ }
155
+ // Add SVS-VAMANA parameters if provided
156
+ if (this.searchWindowSize !== undefined) {
157
+ knnPart += ' SEARCH_WINDOW_SIZE $search_window_size';
158
+ }
159
+ if (this.useSearchHistory !== undefined) {
160
+ knnPart += ` USE_SEARCH_HISTORY ${this.useSearchHistory}`;
161
+ }
162
+ if (this.searchBufferCapacity !== undefined) {
163
+ knnPart += ' SEARCH_BUFFER_CAPACITY $search_buffer_capacity';
164
+ }
165
+ knnPart += ']';
166
+ return `${filterPart}${knnPart}`;
167
+ }
168
+ /**
169
+ * Build query parameters for Redis FT.SEARCH
170
+ *
171
+ * Converts the vector to a binary buffer as expected by Redis.
172
+ * Includes HNSW and SVS-VAMANA parameters if provided.
173
+ *
174
+ * @returns Query parameters object with vector buffer and algorithm params
175
+ */
176
+ buildParams() {
177
+ const vectorBuffer = encodeVectorBuffer(this.vector, this.datatype);
178
+ const params = {
179
+ vector: vectorBuffer,
180
+ };
181
+ // Add HNSW parameters if provided
182
+ if (this.efRuntime !== undefined) {
183
+ params.ef_runtime = this.efRuntime;
184
+ }
185
+ if (this.epsilon !== undefined) {
186
+ params.epsilon = this.epsilon;
187
+ }
188
+ // Add SVS-VAMANA parameters if provided
189
+ if (this.searchWindowSize !== undefined) {
190
+ params.search_window_size = this.searchWindowSize;
191
+ }
192
+ if (this.searchBufferCapacity !== undefined) {
193
+ params.search_buffer_capacity = this.searchBufferCapacity;
194
+ }
195
+ return params;
196
+ }
197
+ }
198
+ //# sourceMappingURL=vector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vector.js","sourceRoot":"","sources":["../../src/query/vector.ts"],"names":[],"mappings":"AACA,OAAO,EAAkB,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAmJhF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,MAAM,OAAO,WAAW;IACJ,MAAM,CAAW;IACjB,WAAW,CAAS;IACpB,UAAU,CAAS;IACnB,MAAM,CAAU;IAChB,YAAY,CAAY;IACxB,cAAc,CAAuB;IACrC,QAAQ,CAAiB;IACzB,MAAM,CAAU;IAChB,KAAK,CAAU;IACf,UAAU,CAAS;IACnB,SAAS,CAAU;IACnB,OAAO,CAAU;IACjB,YAAY,CAAgB;IAC5B,SAAS,CAAU;IACnB,iBAAiB,CAAU;IAC3B,gBAAgB,CAAU;IAC1B,gBAAgB,CAAoB;IACpC,oBAAoB,CAAU;IAE9C,YAAY,MAAyB;QACjC,kBAAkB;QAClB,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/C,MAAM,IAAI,oBAAoB,CAAC,wBAAwB,CAAC,CAAC;QAC7D,CAAC;QAED,uBAAuB;QACvB,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,IAAI,oBAAoB,CAAC,yBAAyB,CAAC,CAAC;QAC9D,CAAC;QAED,2BAA2B;QAC3B,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,IAAI,MAAM,CAAC,SAAS,IAAI,CAAC,EAAE,CAAC;YAC1D,MAAM,IAAI,oBAAoB,CAAC,4BAA4B,CAAC,CAAC;QACjE,CAAC;QAED,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,IAAI,MAAM,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;YACrD,MAAM,IAAI,oBAAoB,CAAC,8BAA8B,CAAC,CAAC;QACnE,CAAC;QAED,oCAAoC;QACpC,IAAI,MAAM,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACpC,IAAI,MAAM,CAAC,YAAY,KAAK,SAAS,IAAI,MAAM,CAAC,YAAY,KAAK,UAAU,EAAE,CAAC;gBAC1E,MAAM,IAAI,oBAAoB,CAAC,iDAAiD,CAAC,CAAC;YACtF,CAAC;QACL,CAAC;QAED,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACjC,IAAI,MAAM,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;gBACpC,MAAM,IAAI,oBAAoB,CAAC,8CAA8C,CAAC,CAAC;YACnF,CAAC;YACD,IAAI,MAAM,CAAC,SAAS,IAAI,CAAC,EAAE,CAAC;gBACxB,MAAM,IAAI,oBAAoB,CAAC,4BAA4B,CAAC,CAAC;YACjE,CAAC;QACL,CAAC;QAED,4CAA4C;QAC5C,IAAI,MAAM,CAAC,iBAAiB,IAAI,MAAM,CAAC,cAAc,KAAK,oBAAoB,CAAC,EAAE,EAAE,CAAC;YAChF,OAAO,CAAC,IAAI,CACR,yDAAyD;gBACrD,8EAA8E,CACrF,CAAC;QACN,CAAC;QAED,iCAAiC;QACjC,IAAI,MAAM,CAAC,gBAAgB,KAAK,SAAS,IAAI,MAAM,CAAC,gBAAgB,IAAI,CAAC,EAAE,CAAC;YACxE,MAAM,IAAI,oBAAoB,CAAC,mCAAmC,CAAC,CAAC;QACxE,CAAC;QAED,IAAI,MAAM,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;YACxC,MAAM,WAAW,GAAuB,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;YAC9D,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBACjD,MAAM,IAAI,oBAAoB,CAAC,gDAAgD,CAAC,CAAC;YACrF,CAAC;QACL,CAAC;QAED,IAAI,MAAM,CAAC,oBAAoB,KAAK,SAAS,IAAI,MAAM,CAAC,oBAAoB,IAAI,CAAC,EAAE,CAAC;YAChF,MAAM,IAAI,oBAAoB,CAAC,uCAAuC,CAAC,CAAC;QAC5E,CAAC;QAED,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QACtC,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC;QAC1C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;QACxC,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc,IAAI,oBAAoB,CAAC,MAAM,CAAC;QAC3E,IAAI,CAAC;YACD,IAAI,CAAC,QAAQ,GAAG,uBAAuB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC7D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,KAAK,YAAY,qBAAqB,EAAE,CAAC;gBACzC,MAAM,IAAI,oBAAoB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAClD,CAAC;YACD,MAAM,KAAK,CAAC;QAChB,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC1B,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,iBAAiB,CAAC;QACzD,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;QAClC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC9B,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;QACxC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;QAClC,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,IAAI,KAAK,CAAC;QAC3D,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;QAChD,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;QAChD,IAAI,CAAC,oBAAoB,GAAG,MAAM,CAAC,oBAAoB,CAAC;IAC5D,CAAC;IAED;;;;;;OAMG;IACH,UAAU;QACN,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QAC1D,IAAI,OAAO,GAAG,UAAU,IAAI,CAAC,UAAU,KAAK,IAAI,CAAC,WAAW,eAAe,IAAI,CAAC,UAAU,EAAE,CAAC;QAE7F,kCAAkC;QAClC,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YAC/B,OAAO,IAAI,yBAAyB,CAAC;QACzC,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAC7B,OAAO,IAAI,mBAAmB,CAAC;QACnC,CAAC;QAED,2CAA2C;QAC3C,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YAClC,OAAO,IAAI,kBAAkB,IAAI,CAAC,YAAY,EAAE,CAAC;QACrD,CAAC;QACD,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YAClE,OAAO,IAAI,eAAe,IAAI,CAAC,SAAS,EAAE,CAAC;QAC/C,CAAC;QAED,wCAAwC;QACxC,IAAI,IAAI,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;YACtC,OAAO,IAAI,yCAAyC,CAAC;QACzD,CAAC;QACD,IAAI,IAAI,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;YACtC,OAAO,IAAI,uBAAuB,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC9D,CAAC;QACD,IAAI,IAAI,CAAC,oBAAoB,KAAK,SAAS,EAAE,CAAC;YAC1C,OAAO,IAAI,iDAAiD,CAAC;QACjE,CAAC;QAED,OAAO,IAAI,GAAG,CAAC;QACf,OAAO,GAAG,UAAU,GAAG,OAAO,EAAE,CAAC;IACrC,CAAC;IAED;;;;;;;OAOG;IACH,WAAW;QACP,MAAM,YAAY,GAAG,kBAAkB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEpE,MAAM,MAAM,GAA4B;YACpC,MAAM,EAAE,YAAY;SACvB,CAAC;QAEF,kCAAkC;QAClC,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YAC/B,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC;QACvC,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAC7B,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAClC,CAAC;QAED,wCAAwC;QACxC,IAAI,IAAI,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;YACtC,MAAM,CAAC,kBAAkB,GAAG,IAAI,CAAC,gBAAgB,CAAC;QACtD,CAAC;QACD,IAAI,IAAI,CAAC,oBAAoB,KAAK,SAAS,EAAE,CAAC;YAC1C,MAAM,CAAC,sBAAsB,GAAG,IAAI,CAAC,oBAAoB,CAAC;QAC9D,CAAC;QAED,OAAO,MAAM,CAAC;IAClB,CAAC;CACJ"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Parser for Redis FT.INFO output to reconstruct IndexSchema
3
+ */
4
+ import { IndexSchema } from '../schema/index.js';
5
+ import type { RedisClientType } from 'redis';
6
+ export type RawInfoReply = Awaited<ReturnType<RedisClientType['ft']['info']>>;
7
+ /**
8
+ * Input type for the index info parser.
9
+ *
10
+ * This is derived from the native Redis client `ft.info()` return type.
11
+ * We intentionally widen `index_definition` and `attributes` value types to
12
+ * reflect the runtime plain-object shape used by node-redis.
13
+ */
14
+ export type RedisIndexInfoReply = Pick<RawInfoReply, 'index_name' | 'stopwords_list'> & {
15
+ index_definition: Record<string, unknown>;
16
+ attributes: Array<Record<string, unknown>>;
17
+ };
18
+ /**
19
+ * Build RedisVL IndexSchema from Redis FT.INFO output
20
+ *
21
+ * @param info - The raw output from FT.INFO command
22
+ * @returns IndexSchema instance reconstructed from Redis index metadata
23
+ */
24
+ export declare function buildRedisVLSchemaFromRedisIndexInfo(info: RedisIndexInfoReply): IndexSchema;
25
+ //# sourceMappingURL=index-info-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-info-parser.d.ts","sourceRoot":"","sources":["../../src/redis/index-info-parser.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAA0B,MAAM,oBAAoB,CAAC;AAiBzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,OAAO,CAAC;AAO7C,MAAM,MAAM,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAE9E;;;;;;GAMG;AACH,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,YAAY,EAAE,YAAY,GAAG,gBAAgB,CAAC,GAAG;IACpF,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CAC9C,CAAC;AAMF;;;;;GAKG;AACH,wBAAgB,oCAAoC,CAAC,IAAI,EAAE,mBAAmB,GAAG,WAAW,CAgC3F"}