Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 57 additions & 0 deletions packages/search/lib/commands/CREATE.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,44 @@ describe('FT.CREATE', () => {
);
});

it('HNSW algorithm with RERANK', () => {
assert.deepEqual(
parseArgs(CREATE, 'index', {
field: {
type: SCHEMA_FIELD_TYPE.VECTOR,
ALGORITHM: SCHEMA_VECTOR_FIELD_ALGORITHM.HNSW,
TYPE: 'FLOAT32',
DIM: 2,
DISTANCE_METRIC: 'L2',
RERANK: true
}
}),
[
'FT.CREATE', 'index', 'SCHEMA', 'field', 'VECTOR', 'HNSW', '8', 'TYPE',
'FLOAT32', 'DIM', '2', 'DISTANCE_METRIC', 'L2', 'RERANK', 'TRUE'
]
);
});

it('HNSW algorithm with RERANK false', () => {
assert.deepEqual(
parseArgs(CREATE, 'index', {
field: {
type: SCHEMA_FIELD_TYPE.VECTOR,
ALGORITHM: SCHEMA_VECTOR_FIELD_ALGORITHM.HNSW,
TYPE: 'FLOAT32',
DIM: 2,
DISTANCE_METRIC: 'L2',
RERANK: false
}
}),
[
'FT.CREATE', 'index', 'SCHEMA', 'field', 'VECTOR', 'HNSW', '8', 'TYPE',
'FLOAT32', 'DIM', '2', 'DISTANCE_METRIC', 'L2', 'RERANK', 'FALSE'
]
);
});

it('VAMANA algorithm', () => {
assert.deepEqual(
parseArgs(CREATE, 'index', {
Expand Down Expand Up @@ -642,6 +680,25 @@ describe('FT.CREATE', () => {
);
}, GLOBAL.SERVERS.OPEN);

testUtils.testWithClientIfVersionWithinRange([[8, 10], 'LATEST'], 'client.ft.create vector hnsw rerank', async client => {
// RERANK is only valid for disk-based vector indexes, which the OSS test
// server cannot create. Assert the parameter reaches the server and is
// recognized (rejected only for the index type, not as a syntax error).
await assert.rejects(
client.ft.create('index_hnsw_rerank', {
field: {
type: SCHEMA_FIELD_TYPE.VECTOR,
ALGORITHM: SCHEMA_VECTOR_FIELD_ALGORITHM.HNSW,
TYPE: 'FLOAT32',
DIM: 5,
DISTANCE_METRIC: 'L2',
RERANK: true
},
}),
/disk-based/
);
}, 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", {
Expand Down
9 changes: 9 additions & 0 deletions packages/search/lib/commands/CREATE.ts
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,11 @@ interface SchemaHNSWVectorField extends SchemaVectorField {
M?: number;
EF_CONSTRUCTION?: number;
EF_RUNTIME?: number;
/**
* Enable reranking. Requires a disk-based vector index.
* available since 8.10
*/
RERANK?: boolean;
}

export const VAMANA_COMPRESSION_ALGORITHM = {
Expand Down Expand Up @@ -293,6 +298,10 @@ export function parseSchema(parser: CommandParser, schema: RediSearchSchema) {
args.push('EF_RUNTIME', fieldOptions.EF_RUNTIME.toString());
}

if (fieldOptions.RERANK !== undefined) {
args.push('RERANK', fieldOptions.RERANK ? 'TRUE' : 'FALSE');
}

break;

case SCHEMA_VECTOR_FIELD_ALGORITHM['VAMANA']:
Expand Down