|
1 | 1 | import { strict as assert } from 'node:assert';
|
2 | 2 | import testUtils, { GLOBAL } from '../test-utils';
|
3 |
| -import CREATE, { SCHEMA_FIELD_TYPE, SCHEMA_TEXT_FIELD_PHONETIC, SCHEMA_VECTOR_FIELD_ALGORITHM, REDISEARCH_LANGUAGE } from './CREATE'; |
| 3 | +import CREATE, { SCHEMA_FIELD_TYPE, SCHEMA_TEXT_FIELD_PHONETIC, SCHEMA_VECTOR_FIELD_ALGORITHM, REDISEARCH_LANGUAGE, VAMANA_COMPRESSION_ALGORITHM } from './CREATE'; |
4 | 4 | import { parseArgs } from '@redis/client/lib/commands/generic-transformers';
|
5 | 5 |
|
6 | 6 | describe('FT.CREATE', () => {
|
@@ -206,6 +206,33 @@ describe('FT.CREATE', () => {
|
206 | 206 | ]
|
207 | 207 | );
|
208 | 208 | });
|
| 209 | + |
| 210 | + it('VAMANA algorithm', () => { |
| 211 | + assert.deepEqual( |
| 212 | + parseArgs(CREATE, 'index', { |
| 213 | + field: { |
| 214 | + type: SCHEMA_FIELD_TYPE.VECTOR, |
| 215 | + ALGORITHM: SCHEMA_VECTOR_FIELD_ALGORITHM.VAMANA, |
| 216 | + TYPE: "FLOAT32", |
| 217 | + COMPRESSION: VAMANA_COMPRESSION_ALGORITHM.LVQ8, |
| 218 | + DIM: 1024, |
| 219 | + DISTANCE_METRIC: 'COSINE', |
| 220 | + CONSTRUCTION_WINDOW_SIZE: 300, |
| 221 | + GRAPH_MAX_DEGREE: 128, |
| 222 | + SEARCH_WINDOW_SIZE: 20, |
| 223 | + EPSILON: 0.02, |
| 224 | + TRAINING_THRESHOLD: 20480, |
| 225 | + REDUCE: 512, |
| 226 | + } |
| 227 | + }), |
| 228 | + [ |
| 229 | + 'FT.CREATE', 'index', 'SCHEMA', 'field', 'VECTOR', 'SVS-VAMANA', '20', 'TYPE', |
| 230 | + 'FLOAT32', 'DIM', '1024', 'DISTANCE_METRIC', 'COSINE', 'COMPRESSION', 'LVQ8', |
| 231 | + 'CONSTRUCTION_WINDOW_SIZE', '300', 'GRAPH_MAX_DEGREE', '128', 'SEARCH_WINDOW_SIZE', '20', |
| 232 | + 'EPSILON', '0.02', 'TRAINING_THRESHOLD', '20480', 'REDUCE', '512' |
| 233 | + ] |
| 234 | + ); |
| 235 | + }); |
209 | 236 | });
|
210 | 237 |
|
211 | 238 | describe('GEOSHAPE', () => {
|
@@ -556,4 +583,87 @@ describe('FT.CREATE', () => {
|
556 | 583 | "OK"
|
557 | 584 | );
|
558 | 585 | }, GLOBAL.SERVERS.OPEN);
|
| 586 | + |
| 587 | + testUtils.testWithClientIfVersionWithinRange([[8, 2], 'LATEST'], 'client.ft.create vector svs-vamana', async client => { |
| 588 | + assert.equal( |
| 589 | + await client.ft.create("index_svs_vamana_min_config", { |
| 590 | + field: { |
| 591 | + type: SCHEMA_FIELD_TYPE.VECTOR, |
| 592 | + ALGORITHM: SCHEMA_VECTOR_FIELD_ALGORITHM.VAMANA, |
| 593 | + TYPE: "FLOAT32", |
| 594 | + DIM: 768, |
| 595 | + DISTANCE_METRIC: 'L2', |
| 596 | + }, |
| 597 | + }), |
| 598 | + "OK" |
| 599 | + ); |
| 600 | + |
| 601 | + assert.equal( |
| 602 | + await client.ft.create("index_svs_vamana_no_compression", { |
| 603 | + field: { |
| 604 | + type: SCHEMA_FIELD_TYPE.VECTOR, |
| 605 | + ALGORITHM: SCHEMA_VECTOR_FIELD_ALGORITHM.VAMANA, |
| 606 | + TYPE: "FLOAT32", |
| 607 | + DIM: 512, |
| 608 | + DISTANCE_METRIC: 'L2', |
| 609 | + CONSTRUCTION_WINDOW_SIZE: 200, |
| 610 | + GRAPH_MAX_DEGREE: 64, |
| 611 | + SEARCH_WINDOW_SIZE: 50, |
| 612 | + EPSILON: 0.01 |
| 613 | + }, |
| 614 | + }), |
| 615 | + "OK" |
| 616 | + ); |
| 617 | + |
| 618 | + assert.equal( |
| 619 | + await client.ft.create("index_svs_vamana_compression", { |
| 620 | + field: { |
| 621 | + type: SCHEMA_FIELD_TYPE.VECTOR, |
| 622 | + ALGORITHM: SCHEMA_VECTOR_FIELD_ALGORITHM.VAMANA, |
| 623 | + TYPE: "FLOAT32", |
| 624 | + COMPRESSION: VAMANA_COMPRESSION_ALGORITHM.LeanVec4x8, |
| 625 | + DIM: 1024, |
| 626 | + DISTANCE_METRIC: 'COSINE', |
| 627 | + CONSTRUCTION_WINDOW_SIZE: 300, |
| 628 | + GRAPH_MAX_DEGREE: 128, |
| 629 | + SEARCH_WINDOW_SIZE: 20, |
| 630 | + EPSILON: 0.02, |
| 631 | + TRAINING_THRESHOLD: 20480, |
| 632 | + REDUCE: 512, |
| 633 | + }, |
| 634 | + }), |
| 635 | + "OK" |
| 636 | + ); |
| 637 | + |
| 638 | + assert.equal( |
| 639 | + await client.ft.create("index_svs_vamana_float16", { |
| 640 | + field: { |
| 641 | + type: SCHEMA_FIELD_TYPE.VECTOR, |
| 642 | + ALGORITHM: SCHEMA_VECTOR_FIELD_ALGORITHM.VAMANA, |
| 643 | + TYPE: "FLOAT16", |
| 644 | + DIM: 128, |
| 645 | + DISTANCE_METRIC: 'IP', |
| 646 | + }, |
| 647 | + }), |
| 648 | + "OK" |
| 649 | + ); |
| 650 | + |
| 651 | + await assert.rejects( |
| 652 | + client.ft.create("index_svs_vamana_invalid_config", { |
| 653 | + field: { |
| 654 | + type: SCHEMA_FIELD_TYPE.VECTOR, |
| 655 | + ALGORITHM: SCHEMA_VECTOR_FIELD_ALGORITHM.VAMANA, |
| 656 | + TYPE: "FLOAT32", |
| 657 | + DIM: 2, |
| 658 | + DISTANCE_METRIC: 'L2', |
| 659 | + CONSTRUCTION_WINDOW_SIZE: 200, |
| 660 | + GRAPH_MAX_DEGREE: 64, |
| 661 | + SEARCH_WINDOW_SIZE: 50, |
| 662 | + EPSILON: 0.01, |
| 663 | + // TRAINING_THRESHOLD should error without COMPRESSION |
| 664 | + TRAINING_THRESHOLD: 2048 |
| 665 | + }, |
| 666 | + }), |
| 667 | + ) |
| 668 | + }, GLOBAL.SERVERS.OPEN); |
559 | 669 | });
|
0 commit comments