このドキュメントでは、OceanBaseにおいて非構造化データ、半構造化データ、構造化データを統一的に格納する方法について説明します。これにより、OceanBaseデータベースの基本機能を最大限に活用するとともに、ハイブリッド検索を強力にサポートできます。
グレインプリンシプル
OceanBaseデータベースは異なるモダリティのデータを格納でき、ハイブリッド検索をサポートする原理は、テキスト、画像、動画などの異なるモダリティのデータを統一的にベクトルに変換し、ベクトル間の距離を計算することで検索を実現することです。ハイブリッド検索には2つの方式があります。単純検索は単一ベクトルの類似度検索に基づき、複雑検索はベクトルとスカラーのハイブリッド検索を含みます。
ベクトル検索自体には近似性があるため、実際のアプリケーションでは精度を向上させるために様々な手法を組み合わせる必要があります。正確な検索結果こそがビジネスにより大きな価値をもたらします。
ベクトルインデックスのメモリ設定
OceanBaseのベクトル検索では、ob_vector_memory_limit_percentageを設定してベクトルインデックスのメモリを制御します:
V4.4.1以前のバージョンでは、HNSW/HNSW_SQ/HNSW_BQベクトルインデックスを使用する前に、
ob_vector_memory_limit_percentageを手動で設定してベクトル機能を有効にする必要があります。最適な検索パフォーマンスを得るために、値は30に設定することを推奨します。デフォルト値のままの場合、ベクトルインデックスにメモリが割り当てられず、インデックス作成時にエラーが発生します。IVF/IVF_PQインデックスは常駐メモリを必要としないため、このパラメータについては注意する必要はありません。設定例は以下のとおりです:ALTER SYSTEM SET ob_vector_memory_limit_percentage = 30;V4.4.1以降のバージョンでは、ベクトル検索機能はデフォルトで有効になっています。デフォルト値の
0は適応モードを意味し、システムがテナント内のベクトルインデックスデータのメモリ使用率を自動的に調整します。手動で調整する必要はありません:- テナントの実メモリが8GB以下の場合、この値は
40に自動設定されます。 - テナントの実メモリが8GBを超える場合、この値は
50に自動設定されます。
- テナントの実メモリが8GB以下の場合、この値は
ベクトル列の作成
以下の例では、ベクトルデータ、空間データ、リレーショナルデータを同一のテーブルに格納する方法を示しています。ベクトル列のデータ型はVECTORであり、作成時に次元数を指定する必要があります。次元数の上限は16,000です。空間列のデータ型はGEOMETRYです:
CREATE TABLE t (
-- リレーショナルデータ(構造化データ)を格納
id INT PRIMARY KEY,
-- 空間データ(半構造化データ)を格納
g GEOMETRY,
-- ベクトルデータ(非構造化データ)を格納
vec VECTOR(3)
);
INSERTステートメントを使用したベクトルデータの挿入
VECTORデータ型の列を含むテーブルを作成すれば、INSERTステートメントを直接使用してベクトルを挿入できます。データを挿入する際、ベクトルはテーブル定義時に指定した次元数と一致している必要があります。一致しない場合はエラーが発生します。この設計により、データの一貫性とクエリの効率が保証されます。ベクトルの形式は標準的な浮動小数点数の配列で表され、各次元の値は有効な浮動小数点数である必要があります。以下に簡単な例を示します:
INSERT INTO t (id, g, vec) VALUES (
-- 構造化データの挿入
1,
-- 半構造化データの挿入
ST_GeomFromText('POINT(1 1)'),
-- 非構造化データの挿入
'[0.1, 0.2, 0.3]'
);