Tair が開発した拡張データ構造である TairVector は、高性能なベクターのリアルタイムストレージと取得を提供します。
概要
TairVector は、次の図に示すように、多層ハッシュ構造を使用します。
TairVector は、階層的なナビゲート可能なスモールワールド (HNSW) とフラット検索という 2 つのインデックス作成アルゴリズムを提供します。
HNSW: グラフベースのベクターインデックスを作成し、非同期のメモリ領域の再利用をサポートして、高いクエリ精度を維持しながら、インデックス構造へのリアルタイムの更新や変更を処理できます。
フラット検索: 完全一致と高速なデータ挿入を実装します。このアルゴリズムは、小規模なデータセットに適しています。
さらに、TairVector は、ユークリッド距離、内積、コサイン距離、ジャカード距離など、複数の距離計算式をサポートしています。従来のベクター取得サービスと比較して、TairVector には次の利点があります。
すべてのデータをメモリに格納し、リアルタイムのインデックス更新をサポートして、読み取りおよび書き込みレイテンシーを削減します。
メモリ内で最適化されたデータ構造を使用して、ストレージ容量をより有効に活用します。
複雑なモジュールや依存関係なしに、シンプルで効率的なアーキテクチャですぐに使えるデータ構造として機能します。
ベクトル検索とフルテキスト検索を組み合わせたハイブリッド検索をサポートします。
タグ属性などのスカラーデータの転置インデックスを作成し、k-最近傍 (KNN) 検索機能を提供できます。取得中、TairVector はまずスカラー属性に基づいてデータセットをフィルターし、次にフィルターされた結果に KNN アルゴリズムを適用してベクトル検索を実行します。
リリースノート
TairVector は 2022 年 10 月 13 日に、Redis 6.0 と互換性のある Tair DRAM ベースのインスタンスとともにリリースされました。
2022 年 11 月 22 日の Tair 6.2.2.0 のリリースに伴い、TairVector にはジャカード距離計算式のサポートと TVS.GETINDEX コマンドの強化という 2 つの注目すべき追加が行われました。このコマンドは、
index_data_sizeおよびattribute_data_sizeパラメーターを使用して、各インデックスのメモリ使用量統計を提供できます。2022 年 12 月 26 日の Tair 6.2.3.0 のリリースに伴い、TairVector には、プロキシモードのクラスターインスタンスのサポート、FLOAT16 データ型の導入、TVS.MINDEXKNNSEARCH および TVS.MINDEXMKNNSEARCH コマンドの追加などの注目すべき追加が行われました。
2023 年 7 月 4 日の Tair 6.2.8.2 のリリースに伴い、TairVector にはコサイン距離計算式のサポートと HNSW インデックスの自動メモリ領域再利用という 2 つの注目すべき追加が行われました。
2023 年 8 月 3 日の Tair 23.8.0.0 のリリースに伴い、TairVector は、インデックス内の キー の生存時間 (TTL) を設定できる TVS.HEXPIREAT や TVS.HPEXPIREAT などのコマンドを導入し、指定されたキーに対するベクトル最近傍クエリをサポートする TVS.GETDISTANCE コマンドを導入しました。TairVector はまた、TVS.CREATEINDEX や TVS.KNNSEARCH などのコマンドを更新することで、フルテキスト検索に関する機能を強化しました。これらの強化により、ベクトル検索とフルテキスト検索を組み合わせてハイブリッド検索を実行できます。
2024 年 6 月 6 日の Tair 24.5.1.0 のリリースに伴い、TVS.KNNSEARCHFIELD および TVS.MINDEXKNNSEARCHFIELD コマンドが追加され、最近傍クエリ中にタグ属性情報を返すことができるようになりました。
Tair 24.7.0.0 は 2024 年 7 月 22 日にリリースされ、疎ベクトルにおける HNSW インデックスのサポートが追加されました。
ベストプラクティス
前提条件
インスタンスは、Redis 6.0 以降と互換性のある Tair DRAM ベースのインスタンスです。詳細については、「DRAM ベースのインスタンス」をご参照ください。
Redis 5.0 を実行する DRAM ベースのインスタンスは、Redis 6.0 を実行するものにアップグレードできません。Redis 6.0 を実行する DRAM ベースのインスタンスを使用するには、インスタンスを作成する必要があります。
注意事項
管理したい TairVector データは Tair インスタンスに保存されます。
Redis のハッシュタグは、TairVector インデックスのキー配布とスロット割り当てを制御するために使用できません。
TairVector は MOVE などの機能をサポートしていません。
ビジネスで高いデータの永続性が必要な場合は、準同期レプリケーションモードを有効にすることをお勧めします。
コマンド一覧
表 1. TairVector コマンド
タイプ | コマンド | 構文 | 説明 |
ベクターインデックス操作 |
| 指定された距離計算式とアルゴリズムに基づいてベクターインデックスを作成します。アルゴリズムは、インデックスの作成とクエリの実行に使用されます。インデックスは、 | |
| 指定されたベクターインデックスをクエリし、インデックスのメタデータを取得します。 | ||
| 指定されたベクターインデックスと、そのインデックスのすべてのデータを削除します。 | ||
| Tair インスタンス内で特定の基準を満たすベクターインデックスをスキャンします。 | ||
ベクターデータ操作 |
| データレコード (key) をベクターインデックスに挿入します。レコードが既に存在する場合、既存のレコードは上書きされます。 | |
| 指定されたベクターインデックス内の指定された key のすべてのデータレコードをクエリします。 | ||
| 指定されたベクターインデックスの指定された key 内の attribute keys の値をクエリします。 | ||
| key パラメーターを使用して、指定されたベクターインデックスから指定されたベクターを削除します。 | ||
| ベクターインデックス内のデータレコード (key) から、指定された attribute_key とその値を削除します。 | ||
| 指定されたベクターインデックス内で特定の基準を満たす keys をスキャンします。 | ||
| 指定されたベクターインデックス内の指定された key の指定された属性キーの値を、指定された整数値 (num) だけ増やします。 | ||
| 指定されたベクターインデックス内の指定された key の指定された属性キーの値を、指定された浮動小数点数 (num) だけ増やします。 | ||
| 指定されたベクターインデックス内の指定された key に対して、ミリ秒単位で正確な絶対有効期限時刻を指定します。 | ||
| 指定されたベクターインデックス内の指定された key に対して、ミリ秒単位で正確な相対有効期限時刻を指定します。 | ||
| 指定されたベクターインデックス内の指定された key に対して、秒単位で正確な絶対有効期限時刻を指定します。 | ||
| 指定されたベクターインデックス内の指定された key に対して、秒単位で正確な相対有効期限時刻を指定します。 | ||
| 指定されたベクターインデックス内の指定された key の TTL をミリ秒単位で正確にクエリします。 | ||
| 指定されたベクターインデックス内の指定された key の TTL を秒単位で正確にクエリします。 | ||
| 指定されたベクターインデックス内の指定された key の絶対有効期限時刻をミリ秒単位で正確にクエリします。 | ||
| 指定されたベクターインデックス内の指定された key の絶対有効期限時刻を秒単位で正確にクエリします。 | ||
ベクトル最近傍クエリ |
| 指定されたベクターインデックス内で、指定されたベクターの最近傍ベクターをクエリします。最大 topN 個のベクターを返すことができます。 | |
| 指定されたベクターインデックス内で、指定されたベクターの最近傍ベクターをクエリします。このコマンドの検索ロジックは TVS.KNNSEARCH と同じですが、検索結果とともにタグ属性を返す機能が追加されています。 | ||
| 指定されたベクターインデックス内で、指定されたキーに対してベクトル最近傍クエリを実行します。 | ||
| 指定されたベクターインデックス内で、指定された複数のベクターの最近傍ベクターをクエリします。 | ||
| 複数のベクターインデックスにまたがって、指定されたベクターの最近傍ベクターをクエリします。 | ||
| 複数のベクターインデックスにまたがって、指定されたベクターの最近傍ベクターをクエリします。検索結果とともにタグ属性を返すことができます。 | ||
| 複数のベクターインデックスにまたがって、指定された複数のベクターの最近傍ベクターをクエリします。 | ||
一般 |
| ネイティブの Redis DEL コマンドを使用して、1 つ以上の TairVector データ項目を削除できます。 |
次のリストは、このトピックで使用されるコマンド構文の規則について説明しています。
大文字のキーワード: コマンドキーワードを示します。斜体のテキスト: 変数を示します。[options]: 角括弧で囲まれたパラメーターはオプションであることを示します。角括弧で囲まれていないパラメーターは指定する必要があります。A|B: 縦棒 (|) で区切られたパラメーターは相互に排他的であることを示します。パラメーターのいずれか 1 つのみを指定できます。...: この記号の前のパラメーターは繰り返し指定できることを示します。
TVS.CREATEINDEX
項目 | 説明 |
構文 |
|
時間計算量 | O(1) |
コマンドの説明 | 指定された距離計算式とアルゴリズムに基づいてベクターインデックスを作成します。アルゴリズムは、インデックスの作成とクエリの実行に使用されます。インデックスは、 |
パラメーター |
|
出力 |
|
例 | コマンドの例: 出力例: |
TVS.GETINDEX
項目 | 説明 |
構文 |
|
時間計算量 | O(1) |
コマンドの説明 | 指定されたベクターインデックスをクエリし、インデックスのメタデータを取得します。 |
パラメーター |
|
出力 |
|
例 | 事前に次のコマンドを実行します。 コマンドの例 (algorithm パラメーターを HNSW に設定): 出力例: |
TVS.DELINDEX
項目 | 説明 |
構文 |
|
時間計算量 | O(N)。N はベクターインデックス内のキーの数を示します。 |
コマンドの説明 | 指定されたベクターインデックスと、そのインデックスのすべてのデータを削除します。 |
オプション |
|
出力 |
|
例 | コマンドの例: 出力例: |
TVS.SCANINDEX
項目 | 説明 |
構文 |
|
時間計算量 | O(N)。N は Tair インスタンス内のベクターインデックスの数を示します。 |
コマンドの説明 | Tair インスタンス内で特定の基準を満たすベクターインデックスをスキャンします。 |
オプション |
|
出力 |
|
例 | コマンドの例: 出力例: 出力例 (pattern パラメーターを含む): 出力例: |
TVS.HSET
項目 | 説明 |
構文 |
|
時間計算量 | データの挿入または更新の操作にベクター値の作成または更新が含まれない場合、時間計算量は O(1) です。それ以外の場合、時間計算量は O(log(N)) です。N はベクターインデックス内のキーの数を示します。 |
コマンドの説明 | データレコード (key) をベクターインデックスに挿入します。レコードが既に存在する場合、既存のレコードは上書きされます。 |
オプション |
|
出力 |
|
例 | コマンドの例: 出力例:(integer) 3 |
TVS.HGETALL
項目 | 説明 |
構文 |
|
時間計算量 | O(1) |
コマンドの説明 | 指定されたベクターインデックス内の指定された key のすべてのデータレコードをクエリします。 |
パラメーター |
|
出力 |
|
例 | コマンドの例: 出力例:1) "VECTOR" 2) "[1,2]" 3) "location" 4) "Hangzhou" 5) "create_time" 6) "1663637425" |
TVS.HMGET
項目 | 説明 |
構文 |
|
時間計算量 | O(1) |
コマンドの説明 | 指定されたベクターインデックスの指定された key 内の attribute keys の値をクエリします。 |
オプション |
|
出力 |
|
例 | コマンドの例: 出力例: |
TVS.DEL
項目 | 説明 |
構文 |
|
時間計算量 | O(1) |
コマンドの説明 | key パラメーターを使用して、指定されたベクターインデックスから指定されたベクターを削除します。 |
パラメーター |
|
出力 |
|
例 | コマンドの例: 出力例: |
TVS.HDEL
項目 | 説明 |
構文 |
|
時間計算量 | O(1) |
コマンドの説明 | ベクターインデックス内のデータレコード (key) から、指定された attribute_key とその値を削除します。 |
パラメーター |
|
出力 |
|
例 | コマンドの例: 出力例: (integer) 1 |
TVS.SCAN
項目 | 説明 |
構文 |
|
時間計算量 | O(N)。N はベクターインデックス内のキーの数を示します。 |
コマンドの説明 | 指定されたベクターインデックス内で特定の基準を満たす keys をスキャンします。 |
パラメーター |
|
出力 |
|
例 | コマンドの例: 出力例:1) "0" 2) 1) "key0" 2) "keyV" |
TVS.HINCRBY
項目 | 説明 |
構文 |
|
時間計算量 | O(1) |
コマンドの説明 | 指定されたベクターインデックス内の指定された key の指定された属性キーの値を、指定された整数値 (num) だけ増やします。 指定された属性キーが存在しない場合、属性キーは自動的に作成され、指定された num 値が割り当てられます。属性キーが既に存在する場合、TairVector は指定された num 値を既存の値に加算して属性キーの値を更新します。 |
パラメーター |
|
出力 |
|
例 | コマンドの例: 出力例:(integer) 20 |
TVS.HINCRBYFLOAT
項目 | 説明 |
構文 |
|
時間計算量 | O(1) |
コマンドの説明 | 指定されたベクターインデックス内の指定された key の指定された属性キーの値を、指定された浮動小数点数 (num) だけ増やします。 指定された属性キーが存在しない場合、属性キーは自動的に作成され、指定された num 値が割り当てられます。属性キーが既に存在する場合、TairVector は指定された num 値を既存の値に加算して属性キーの値を更新します。 |
オプション |
|
出力 |
|
例 | サンプルコマンド: 出力例: |
TVS.HPEXPIREAT
項目 | 説明 |
構文 |
|
時間計算量 | O(1) |
コマンドの説明 | 指定されたベクターインデックス内の指定された key に対して、ミリ秒単位で正確な絶対有効期限時刻を指定します。 |
パラメーター |
|
出力 |
|
例 | コマンドの例: 出力例: |
TVS.HPEXPIRE
項目 | 説明 |
構文 |
|
時間計算量 | O(1) |
コマンドの説明 | 指定されたベクターインデックス内の指定された key に対して、ミリ秒単位で正確な相対有効期限時刻を指定します。 |
オプション |
|
出力 |
|
例 | コマンドの例: サンプル出力: |
TVS.HEXPIREAT
項目 | 説明 |
構文 |
|
時間計算量 | O(1) |
コマンドの説明 | 指定されたベクターインデックス内の指定された key に対して、秒単位で正確な絶対有効期限時刻を指定します。 |
オプション |
|
出力 |
|
例 | コマンドの例: 出力例:(integer) 1 |
TVS.HEXPIRE
項目 | 説明 |
構文 |
|
時間計算量 | O(1) |
コマンドの説明 | 指定されたベクターインデックス内の指定された key に対して、秒単位で正確な相対有効期限時刻を指定します。 |
オプション |
|
出力 |
|
例 | コマンドの例: 出力例:(integer) 1 |
TVS.HPTTL
項目 | 説明 |
構文 |
|
時間計算量 | O(1) |
コマンドの説明 | 指定されたベクターインデックス内の指定された key の TTL をミリ秒単位で正確にクエリします。 |
パラメーター |
|
出力 |
|
例 | コマンドの例: サンプル出力: |
TVS.HTTL
項目 | 説明 |
構文 |
|
時間計算量 | O(1) |
コマンドの説明 | 指定されたベクターインデックス内の指定された key の TTL を秒単位で正確にクエリします。 |
パラメーター |
|
出力 |
|
例 | コマンドの例: 出力例: |
TVS.HPEXPIRETIME
項目 | 説明 |
構文 |
|
時間計算量 | O(1) |
コマンドの説明 | 指定されたベクターインデックス内の指定された key の絶対有効期限時刻をミリ秒単位で正確にクエリします。 |
パラメーター |
|
出力 |
|
例 | コマンドの例: 出力例: |
TVS.HEXPIRETIME
項目 | 説明 |
構文 |
|
時間計算量 | O(1) |
コマンドの説明 | 指定されたベクターインデックス内の指定された key の絶対有効期限時刻を秒単位で正確にクエリします。 |
パラメーター |
|
出力 |
|
例 | コマンドの例: サンプル出力: |
TVS.KNNSEARCH
項目 | 説明 |
構文 |
|
時間計算量 |
N はベクターインデックス内のキーの数を示します。 |
コマンドの説明 | 指定されたベクターインデックス内で、指定されたベクターの最近傍ベクターをクエリします。最大 topN 個のベクターを返すことができます。 |
オプション |
|
出力 |
|
例 | 事前に次のコマンドを実行します。 コマンドの例 1: サンプル出力 1: コマンド例 2: 出力例 2: |
TVS.KNNSEARCHFIELD
項目 | 説明 |
構文 |
|
時間計算量 |
N はベクターインデックス内のキーの数を示します。 |
コマンドの説明 | 指定されたベクターインデックス内で、指定されたベクターの最近傍ベクターをクエリします。このコマンドの検索ロジックは TVS.KNNSEARCH と同じですが、検索結果とともにタグ属性を返す機能が追加されています。 |
パラメーター |
|
出力 |
|
例 | 事前に次のコマンドを実行します。 コマンドの例: サンプル出力: |
TVS.GETDISTANCE
項目 | 説明 |
構文 |
|
時間計算量 |
N はベクターインデックス内のキーの数を示します。 |
コマンドの説明 | 指定されたベクターインデックス内で、指定されたキーに対してベクトル最近傍クエリを実行します。 |
オプション |
|
出力 |
|
例 | 事前に次のコマンドを実行します。 サンプルコマンド: 出力例: |
TVS.MKNNSEARCH
項目 | 説明 |
構文 |
|
時間計算量 |
N はベクターインデックス内のキーの数を示します。 |
コマンドの説明 | 指定されたベクターインデックス内で、指定された複数のベクターの最近傍ベクターをクエリします。 |
パラメーター |
|
出力 |
|
例 | 事前に次のコマンドを実行します。 コマンドの例: 出力例: |
TVS.MINDEXKNNSEARCH
項目 | 説明 |
構文 |
|
時間計算量 |
N はベクターインデックス内のキーの数を示します。 |
コマンドの説明 | 複数のベクターインデックスにまたがって、指定されたベクターの最近傍ベクターをクエリします。 |
オプション |
|
出力 |
|
例 | 事前に次のコマンドを実行します。 コマンドの例: 出力例:1) "key0" 2) "5" 3) "key7" 4) "25" |
TVS.MINDEXKNNSEARCHFIELD
項目 | 説明 |
構文 |
|
時間計算量 |
N はベクターインデックス内のキーの数を示します。 |
コマンドの説明 | 複数のベクターインデックスにまたがって、指定されたベクターの最近傍ベクターをクエリします。検索結果とともにタグ属性を返すことができます。 |
オプション |
|
出力 |
|
例 | 事前に次のコマンドを実行します。 コマンドの例: 出力例: |
TVS.MINDEXMKNNSEARCH
項目 | 説明 |
構文 |
|
時間計算量 |
N はベクターインデックス内のキーの数を示します。 |
コマンドの説明 | 複数のベクターインデックスにまたがって、指定された複数のベクターの最近傍ベクターをクエリします。 |
パラメーター |
|
出力 |
|
例 | 事前に次のコマンドを実行します。 コマンドの例: 出力例:1) 1) "key0" 2) "5" 3) "key7" 4) "25" 2) 1) "key1" 2) "1" 3) "key7" 4) "1" |