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.
- package/LICENSE +22 -0
- package/README.md +212 -0
- package/dist/errors.d.ts +50 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +87 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/indexes/search-index.d.ts +368 -0
- package/dist/indexes/search-index.d.ts.map +1 -0
- package/dist/indexes/search-index.js +475 -0
- package/dist/indexes/search-index.js.map +1 -0
- package/dist/query/base.d.ts +51 -0
- package/dist/query/base.d.ts.map +1 -0
- package/dist/query/base.js +6 -0
- package/dist/query/base.js.map +1 -0
- package/dist/query/index.d.ts +7 -0
- package/dist/query/index.d.ts.map +1 -0
- package/dist/query/index.js +7 -0
- package/dist/query/index.js.map +1 -0
- package/dist/query/vector.d.ts +199 -0
- package/dist/query/vector.d.ts.map +1 -0
- package/dist/query/vector.js +198 -0
- package/dist/query/vector.js.map +1 -0
- package/dist/redis/index-info-parser.d.ts +25 -0
- package/dist/redis/index-info-parser.d.ts.map +1 -0
- package/dist/redis/index-info-parser.js +301 -0
- package/dist/redis/index-info-parser.js.map +1 -0
- package/dist/redis/schema-types.d.ts +81 -0
- package/dist/redis/schema-types.d.ts.map +1 -0
- package/dist/redis/schema-types.js +18 -0
- package/dist/redis/schema-types.js.map +1 -0
- package/dist/redis/utils.d.ts +7 -0
- package/dist/redis/utils.d.ts.map +1 -0
- package/dist/redis/utils.js +221 -0
- package/dist/redis/utils.js.map +1 -0
- package/dist/schema/fields.d.ts +163 -0
- package/dist/schema/fields.d.ts.map +1 -0
- package/dist/schema/fields.js +304 -0
- package/dist/schema/fields.js.map +1 -0
- package/dist/schema/index.d.ts +8 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +8 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/schema.d.ts +247 -0
- package/dist/schema/schema.d.ts.map +1 -0
- package/dist/schema/schema.js +403 -0
- package/dist/schema/schema.js.map +1 -0
- package/dist/schema/types.d.ts +56 -0
- package/dist/schema/types.d.ts.map +1 -0
- package/dist/schema/types.js +62 -0
- package/dist/schema/types.js.map +1 -0
- package/dist/storage/base-storage.d.ts +107 -0
- package/dist/storage/base-storage.d.ts.map +1 -0
- package/dist/storage/base-storage.js +187 -0
- package/dist/storage/base-storage.js.map +1 -0
- package/dist/storage/hash-storage.d.ts +29 -0
- package/dist/storage/hash-storage.d.ts.map +1 -0
- package/dist/storage/hash-storage.js +122 -0
- package/dist/storage/hash-storage.js.map +1 -0
- package/dist/storage/index.d.ts +4 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +4 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/json-storage.d.ts +19 -0
- package/dist/storage/json-storage.d.ts.map +1 -0
- package/dist/storage/json-storage.js +81 -0
- package/dist/storage/json-storage.js.map +1 -0
- package/dist/utils/distance.d.ts +92 -0
- package/dist/utils/distance.d.ts.map +1 -0
- package/dist/utils/distance.js +98 -0
- package/dist/utils/distance.js.map +1 -0
- package/dist/vectorizers/base-vectorizer.d.ts +88 -0
- package/dist/vectorizers/base-vectorizer.d.ts.map +1 -0
- package/dist/vectorizers/base-vectorizer.js +32 -0
- package/dist/vectorizers/base-vectorizer.js.map +1 -0
- package/dist/vectorizers/huggingface-vectorizer.d.ts +103 -0
- package/dist/vectorizers/huggingface-vectorizer.d.ts.map +1 -0
- package/dist/vectorizers/huggingface-vectorizer.js +142 -0
- package/dist/vectorizers/huggingface-vectorizer.js.map +1 -0
- package/dist/vectorizers/index.d.ts +10 -0
- package/dist/vectorizers/index.d.ts.map +1 -0
- package/dist/vectorizers/index.js +10 -0
- package/dist/vectorizers/index.js.map +1 -0
- 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":"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"}
|
|
@@ -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"}
|