1
0
mirror of https://github.com/redis/node-redis.git synced 2025-12-12 21:21:15 +03:00

Add support svs vamana index creation (#3025)

* feat(search): add SVS-VAMANA vector index algorithm support

- Add VAMANA algorithm with compression and tuning parameters
- Include comprehensive test coverage for various configurations
- Fix parameter validation to handle falsy values correctly

* feat(search): add additional VAMANA compression algorithms

- Add LVQ4, LVQ4x4, LVQ4x8, LeanVec4x8, and LeanVec8x8 compression options
- Update test to use LeanVec4x8 compression algorithm

* chore: update Redis version from 8.2-rc1 to 8.2-rc2-pre
This commit is contained in:
Pavel Pashov
2025-08-04 12:07:18 +03:00
committed by GitHub
parent e2d4b43e39
commit 66638fc903
10 changed files with 193 additions and 16 deletions

View File

@@ -1,6 +1,6 @@
import { strict as assert } from 'node:assert';
import testUtils, { GLOBAL } from '../test-utils';
import CREATE, { SCHEMA_FIELD_TYPE, SCHEMA_TEXT_FIELD_PHONETIC, SCHEMA_VECTOR_FIELD_ALGORITHM, REDISEARCH_LANGUAGE } from './CREATE';
import CREATE, { SCHEMA_FIELD_TYPE, SCHEMA_TEXT_FIELD_PHONETIC, SCHEMA_VECTOR_FIELD_ALGORITHM, REDISEARCH_LANGUAGE, VAMANA_COMPRESSION_ALGORITHM } from './CREATE';
import { parseArgs } from '@redis/client/lib/commands/generic-transformers';
describe('FT.CREATE', () => {
@@ -206,6 +206,33 @@ describe('FT.CREATE', () => {
]
);
});
it('VAMANA algorithm', () => {
assert.deepEqual(
parseArgs(CREATE, 'index', {
field: {
type: SCHEMA_FIELD_TYPE.VECTOR,
ALGORITHM: SCHEMA_VECTOR_FIELD_ALGORITHM.VAMANA,
TYPE: "FLOAT32",
COMPRESSION: VAMANA_COMPRESSION_ALGORITHM.LVQ8,
DIM: 1024,
DISTANCE_METRIC: 'COSINE',
CONSTRUCTION_WINDOW_SIZE: 300,
GRAPH_MAX_DEGREE: 128,
SEARCH_WINDOW_SIZE: 20,
EPSILON: 0.02,
TRAINING_THRESHOLD: 20480,
REDUCE: 512,
}
}),
[
'FT.CREATE', 'index', 'SCHEMA', 'field', 'VECTOR', 'SVS-VAMANA', '20', 'TYPE',
'FLOAT32', 'DIM', '1024', 'DISTANCE_METRIC', 'COSINE', 'COMPRESSION', 'LVQ8',
'CONSTRUCTION_WINDOW_SIZE', '300', 'GRAPH_MAX_DEGREE', '128', 'SEARCH_WINDOW_SIZE', '20',
'EPSILON', '0.02', 'TRAINING_THRESHOLD', '20480', 'REDUCE', '512'
]
);
});
});
describe('GEOSHAPE', () => {
@@ -556,4 +583,87 @@ describe('FT.CREATE', () => {
"OK"
);
}, GLOBAL.SERVERS.OPEN);
testUtils.testWithClientIfVersionWithinRange([[8, 2], 'LATEST'], 'client.ft.create vector svs-vamana', async client => {
assert.equal(
await client.ft.create("index_svs_vamana_min_config", {
field: {
type: SCHEMA_FIELD_TYPE.VECTOR,
ALGORITHM: SCHEMA_VECTOR_FIELD_ALGORITHM.VAMANA,
TYPE: "FLOAT32",
DIM: 768,
DISTANCE_METRIC: 'L2',
},
}),
"OK"
);
assert.equal(
await client.ft.create("index_svs_vamana_no_compression", {
field: {
type: SCHEMA_FIELD_TYPE.VECTOR,
ALGORITHM: SCHEMA_VECTOR_FIELD_ALGORITHM.VAMANA,
TYPE: "FLOAT32",
DIM: 512,
DISTANCE_METRIC: 'L2',
CONSTRUCTION_WINDOW_SIZE: 200,
GRAPH_MAX_DEGREE: 64,
SEARCH_WINDOW_SIZE: 50,
EPSILON: 0.01
},
}),
"OK"
);
assert.equal(
await client.ft.create("index_svs_vamana_compression", {
field: {
type: SCHEMA_FIELD_TYPE.VECTOR,
ALGORITHM: SCHEMA_VECTOR_FIELD_ALGORITHM.VAMANA,
TYPE: "FLOAT32",
COMPRESSION: VAMANA_COMPRESSION_ALGORITHM.LeanVec4x8,
DIM: 1024,
DISTANCE_METRIC: 'COSINE',
CONSTRUCTION_WINDOW_SIZE: 300,
GRAPH_MAX_DEGREE: 128,
SEARCH_WINDOW_SIZE: 20,
EPSILON: 0.02,
TRAINING_THRESHOLD: 20480,
REDUCE: 512,
},
}),
"OK"
);
assert.equal(
await client.ft.create("index_svs_vamana_float16", {
field: {
type: SCHEMA_FIELD_TYPE.VECTOR,
ALGORITHM: SCHEMA_VECTOR_FIELD_ALGORITHM.VAMANA,
TYPE: "FLOAT16",
DIM: 128,
DISTANCE_METRIC: 'IP',
},
}),
"OK"
);
await assert.rejects(
client.ft.create("index_svs_vamana_invalid_config", {
field: {
type: SCHEMA_FIELD_TYPE.VECTOR,
ALGORITHM: SCHEMA_VECTOR_FIELD_ALGORITHM.VAMANA,
TYPE: "FLOAT32",
DIM: 2,
DISTANCE_METRIC: 'L2',
CONSTRUCTION_WINDOW_SIZE: 200,
GRAPH_MAX_DEGREE: 64,
SEARCH_WINDOW_SIZE: 50,
EPSILON: 0.01,
// TRAINING_THRESHOLD should error without COMPRESSION
TRAINING_THRESHOLD: 2048
},
}),
)
}, GLOBAL.SERVERS.OPEN);
});