このドキュメントでは、OceanBaseのベクトル検索機能とMilvusのデータモデルマッピング関係、SDKインターフェースの互換性、および関連する概念の対照説明について説明します。
Milvusとの概念マッピング
Milvusに精通しているユーザーがOceanBaseのベクトルストレージ機能を容易に利用できるように、両者の相違点と共通点を分析し、関連する概念間のマッピングを提示します。
データモデル
データモデルの階層 |
Milvus |
OceanBase |
説明 |
|---|---|---|---|
| 第1層 | Shards | Partition | Milvusは、スキーマ定義時に特定の列をpartition_keyとして設定することで、パーティションルールを定めます。OceanBaseは、range/range columns、list/list columns、hash、key、およびサブパーティション戦略をサポートしています。 |
| 第2層 | Partitions | ≈Tablet | Milvusは、同一Shard内(Shardsは通常主キーでパーティション化される)で他の列に基づいてブロックを分割し、読み取り性能を向上させることをサポートします。 OceanBaseは、パーティション内で主キーに従ってソートすることで実現します。 |
| 第3層 | Segments | MemTable+SSTable | 両者ともダンプ動作があります。 |
SDK
このセクションでは、OceanBaseのベクトルストレージSDKであるpyobvectorとMilvusのSDKであるpymilvusの概念的な違いについて説明します。
pyobvectorには2つの使用モードがあります:
pymilvus MilvusClient軽量互換モード:このモードはMilvusクライアントで一般的に使用されるインターフェースに互換しており、Milvusに精通しているユーザーはこのモードを非常に便利に利用でき、概念マッピングは不要です。
SQLAlchemy拡張モード:このモードはPython SQLAlchemyのベクトル機能拡張として機能し、リレーショナルデータベースの操作パターンを維持します。説明には概念マッピングが必要です。
pyobvectorの具体的なインターフェース使用ドキュメントについては、pyobvector Python SDKインターフェース説明を参照してください。
次の表は、pyobvectorのSQLAlchemy拡張モードとMilvus SDKインターフェースの概念マッピングを示しています:
pymilvus |
pyobvector |
説明 |
|---|---|---|
| Database | Database | データベース |
| Collection | Table | テーブル |
| Field | Column | 列 |
| Primary Key | Primary Key | 主キー |
| Vector Field | Vector Column | ベクトル列 |
| Index | Index | インデックス |
| Partition | Partition | パーティション |
| DataType | DataType | データ型 |
| Metric Type | Distance Function | 距離関数 |
| Search | Query | クエリ |
| Insert | Insert | 挿入 |
| Delete | Delete | 削除 |
| Update | Update | 更新 |
| Batch | Batch | バッチ処理 |
| Transaction | Transaction | トランザクション |
| NONE | サポートなし | NULL値 |
| BOOL | Boolean | MySQLのTINYINT型に対応 |
| INT8 | Boolean | MySQLのTINYINT型に対応 |
| INT16 | SmallInteger | MySQLのSMALLINT型に対応 |
| INT32 | Integer | MySQLのINT型に対応 |
| INT64 | BigInteger | MySQLのBIGINT型に対応 |
| FLOAT | Float | MySQLのFLOAT型に対応 |
| DOUBLE | Double | MySQLのDOUBLE型に対応 |
| STRING | LONGTEXT | MySQLのLONGTEXT型に対応 |
| VARCHAR | STRING | MySQLのVARCHAR型に対応 |
| JSON | JSON | JSONの操作の相違点については、pyobvector Python SDKインターフェース説明を参照してください。 |
| FLOAT_VECTOR | VECTOR | ベクトル型 |
| BINARY_VECTOR | サポートなし | |
| FLOAT16_VECTOR | サポートなし | |
| BFLOAT16_VECTOR | サポートなし | |
| SPARSE_FLOAT_VECTOR | サポートなし | |
| dynamic_field | サポート不要 | Milvusの隠れた$metaメタデータ列OceanBaseではJSON型の列を作成するだけで表示されます |
Milvusとの互換性
Milvus SDK
load_collection()、release_collection()、close() などSQLAlchemyのサポートが必要なメソッドを除き、以下の表に記載されているインターフェースはすべて互換性があります。
コレクション操作
インターフェース |
説明 |
|---|---|
| create_collection() | 指定されたスキーマに基づいて、ベクトルテーブルを作成します。 |
| get_collection_stats() | レコード数などのデータテーブル統計情報を確認します。 |
| describe_collection() | ベクトルテーブルの詳細なメタ情報を提供します。 |
| has_collection() | テーブルが存在するかどうかを判断します。 |
| list_collections() | 存在するテーブルを一覧表示します。 |
| drop_collection() | テーブルを削除します。 |
フィールドとスキーマの定義
インターフェース |
説明 |
|---|---|
| create_schema() | Schemaのメモリ構造を作成し、列定義を追加します。 |
| add_field() | シーケンスcreate_schema->add_field->...->add_fieldを使用して呼び出すこともできます。 または、FieldSchemaのリストを手動で作成し、CollectionSchemaのコンストラクターを使用してSchemaを作成することもできます。 |
ベクトルインデックス
インターフェース |
説明 |
|---|---|
| list_indexes() | すべてのインデックスを一覧表示します。 |
| create_index() | 1回の呼び出しで複数のベクトルインデックスを作成できます。まず、prepare_index_paramsを使用してインデックスパラメータリストオブジェクトを初期化し、add_indexを複数回呼び出して複数のインデックスパラメータを設定し、最後にcreate_indexを呼び出してインデックスを作成します。 |
| drop_index() | ベクトルインデックスを削除します。 |
| describe_index() | インデックスのメタデータ(スキーマ)を取得します。 |
ベクトルインデックス
インターフェース |
説明 |
|---|---|
| search() | ANNクエリインターフェース:
|
| query() | filter句を含むクエリ、すなわちSELECT ... WHERE ids IN (..., ...) AND <filters>。 |
| get() | filter句を含まないクエリ、すなわちSELECT ... WHERE ids IN (..., ...)。 |
| delete() | ベクトルの一括削除。DELETE FROM ... WHERE ids IN (..., ...)。 |
| insert() | ベクトルの一括挿入。 |
| upsert() | 主キー競合による更新を伴う挿入。 |
コレクションメタデータの同期
インターフェース |
説明 |
|---|---|
| load_collection() | データベースのテーブル構造(Schema)をPythonアプリケーションのメモリにロードし、アプリケーションがオブジェクト指向でデータベーステーブルを操作できるようにします。これはオブジェクト関係マッピング(ORM)フレームワークの標準機能です。 |
| release_collection() | Pythonアプリケーションのメモリからロードされたテーブル構造(Schema)を解放し、関連リソースを解放します。これはORMフレームワークの標準機能であり、メモリ管理に使用されます。 |
| close() | データベース接続を閉じ、関連リソースを解放します。これはORMフレームワークの標準機能です。 |
pymilvus
データモデル
Milvusのデータモデルは、Shards->Partitions->Segmentsの3つのレベルに分かれており、OceanBaseとの互換性比較は以下の通りです:
ShardsはOceanBaseのPartitionの概念に対応します。
Partitionsには現在、OceanBaseに対応する概念がありません。
Milvusでは、同一Shard内(Shardsは通常主キーでパーティション化されます)で他の列を用いてブロックを分割し、読み取り性能を向上させることができます。OceanBaseでは、パーティション内で主キーに従ってソートすることで実現しています。
Milvus Lite APIの互換性
collection操作
Milvus create_collection():
create_collection( collection_name: str, dimension: int, primary_field_name: str = "id", id_type: str = DataType, vector_field_name: str = "vector", metric_type: str = "COSINE", auto_id: bool = False, timeout: Optional[float] = None, schema: Optional[CollectionSchema] = None, # Used for custom setup index_params: Optional[IndexParams] = None, # Used for custom setup **kwargs, ) -> NoneOceanBaseの互換性説明は以下の通りです:
collection_name:互換。実際にはtable_nameとなります。
dimension:互換。vector(dim)となります。
primary_field_name:互換。主キー列名となります。
id_type:互換。主キー列のデータ型となります。
vector_field_name:互換。ベクトル列名となります。
auto_id:互換。auto incrementとなります。
timeout:互換。OceanBaseはhintをサポートしています。
schema:互換。
index_params:互換。
Milvus get_collection_stats():
get_collection_stats( collection_name: str, timeout: Optional[float] = None ) -> DictOceanBaseの互換性説明は以下の通りです:
APIが互換します。
戻り値が互換:
{ 'row_count': ... }。
Milvus has_collection():
has_collection( collection_name: str, timeout: Optional[float] = None ) -> BoolOceanBaseはMilvus has_collection()と互換します。
Milvus drop_collection():
drop_collection(collection_name: str) -> NoneOceanBaseはMilvus drop_collection()と互換します。
Milvus rename_collection():
rename_collection( old_name: str, new_name: str, timeout: Optional[float] = None ) -> NoneOceanBaseはMilvus rename_collection()と互換します。
Schema関連
Milvus create_schema():
create_schema( auto_id: bool, enable_dynamic_field: bool, primary_field: str, partition_key_field: str, ) -> CollectionSchemaOceanBaseの互換性説明は以下の通りです:
auto_id:自動インクリメント主キー列であるかどうか、互換可能です。
primary_field & partition_key_field:互換可能です。
Milvus add_field():
add_field( field_name: str, datatype: DataType, is_primary: bool, max_length: int, element_type: str, max_capacity: int, dim: int, is_partition_key: bool, )OceanBaseはMilvus add_field()と互換します。
Insert/Search関連
Milvus search():
search( collection_name: str, data: Union[List[list], list], filter: str = "", limit: int = 10, output_fields: Optional[List[str]] = None, search_params: Optional[dict] = None, timeout: Optional[float] = None, partition_names: Optional[List[str]] = None, **kwargs, ) -> List[dict]OceanBaseの互換性説明は以下の通りです:
filter:str式。具体的な使用例については、https://milvus.io/docs/boolean.md#Usage のSQLの
WHERE式を参照してください。これに類似します。search_params:
metric_type:互換。
radius & range filter:RNN関連。現在はサポートされていません。
group_by_field:ANN結果のグループ化。現在はサポートされていません。
max_empty_result_buckets:IVFシリーズインデックスで使用。現在はサポートされていません。
ignore_growing:増分部分をスキップし、ベースラインインデックスを直接読み取る。現在はサポートされていません。
partition_names:パーティション読み取り。サポートされています。
kwargs:
offset:検索結果でスキップするレコード数。現在はサポートされていません。
round_decimal:結果を指定した小数点以下の位数で四捨五入。現在はサポートされていません。
Milvus get():
get( collection_name: str, ids: Union[list, str, int], output_fields: Optional[List[str]] = None, timeout: Optional[float] = None, partition_names: Optional[List[str]] = None, **kwargs, ) -> List[dict]OceanBaseはMilvus get()と互換します。
Milvus delete()
delete( collection_name: str, ids: Optional[Union[list, str, int]] = None, timeout: Optional[float] = None, filter: Optional[str] = "", partition_name: Optional[str] = "", **kwargs, ) -> dictOceanBaseはMilvus delete()と互換します。
Milvus insert()
insert( collection_name: str, data: Union[Dict, List[Dict]], timeout: Optional[float] = None, partition_name: Optional[str] = "", ) -> List[Union[str, int]]OceanBaseはMilvus insert()と互換します。
Milvus upsert()
upsert( collection_name: str, data: Union[Dict, List[Dict]], timeout: Optional[float] = None, partition_name: Optional[str] = "", ) -> List[Union[str, int]]OceanBaseはMilvus upsert()と互換します。
index関連
Milvus create_index()
create_index( collection_name: str, index_params: IndexParams, timeout: Optional[float] = None, **kwargs, )OceanBaseはMilvus create_index()と互換します。
Milvus drop_index()
drop_index( collection_name: str, index_name: str, timeout: Optional[float] = None, **kwargs, )OceanBaseはMilvus drop_index()と互換します。
MySQLプロトコルとの互換性
リクエストの発行について:すべてのAPIは通常のクエリSQLを通じて実装されており、互換性の問題はありません。
レスポンス結果セットの処理について:新たに追加されたベクトルデータ要素の処理を考慮する必要があります。現在、stringとbytesの2種類の要素の解析をサポートしています。今後ベクトルデータ要素の伝送方式が変更された場合でも、SDKを更新することで互換性を維持できます。