本ドキュメントでは、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は、同じShards内(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のサポートが必要なものを除き、以下の表に記載されているインターフェースはすべて互換性があります。
Collection操作
| インターフェース | 説明 |
|---|---|
| create_collection() | 指定されたSchemaに基づいて、ベクトルテーブルを作成します。 |
| get_collection_stats() | レコード行数などのデータテーブル統計情報を確認します。 |
| describe_collection() | ベクトルテーブルの詳細なメタデータを提供します。 |
| has_collection() | テーブルが存在するかどうかを判定します。 |
| list_collections() | 存在するテーブルを一覧表示します。 |
| drop_collection() | テーブルを削除します。 |
FieldおよびSchemaの定義
| インターフェース | 説明 |
|---|---|
| create_schema() | Schemaのメモリ構造を作成し、列定義を追加します。 |
| add_field() | 使用時にシーケンスを呼び出しますcreate_schema->add_field->...->add_field 手動でFieldSchemaリストを作成してから、CollectionSchemaのコンストラクターを使ってSchemaを作成することもできます。 |
ベクトルインデックス
| インターフェース | 説明 |
|---|---|
| list_indexes() | すべてのインデックスを一覧表示します。 |
| create_index() | 複数のベクトルインデックスを一度の呼び出しで作成することをサポートしています。まず、prepare_index_paramsを使用してインデックスパラメータリストオブジェクトを初期化し、add_indexを複数回呼び出して複数のインデックスパラメータを設定します。最終的にcreate_indexを使用してインデックスを作成します。 |
| drop_index() | ベクトルインデックスを削除します。 |
| describe_index() | インデックスのメタデータ(Schema)を取得します。 |
ベクトルインデックス
| インターフェース | 説明 |
|---|---|
| search() | ANNクエリインターフェース:
|
| query() | filterありのポイント・ルックアップ・クエリ、即ち SELECT ... WHERE ids IN (..., ...) AND <filters>。 |
| get() | filterなしのポイント・ルックアップ・クエリ、即ち SELECT ... WHERE ids IN (..., ...)。 |
| delete() | 一連のベクトルを削除します。DELETE FROM ... WHERE ids IN (..., ...)。 |
| insert() | 一連のベクトルを挿入します。 |
| upsert() | 主キーが競合した場合に更新する挿入。 |
collectionメタデータ同期
| インターフェース | 説明 |
|---|---|
| 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は、読み込みパフォーマンスを向上させるために、同じShards内(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 inrementです。
timeout:互換性があり、OceanBaseはヒントを使用してサポートしています。
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プロトコルと互換性があります
requestリクエスト開始に関して:APIはすべて通常のクエリSQLで実装されており、互換性の問題はありません。
response結果セットの処理に関して:新たしく追加されたベクトルデータ要素の処理のみを考慮すればよく、現在stringとbytesの2種類の要素の解析をサポートしています。将来ベクトルデータ要素の伝送方式が変更されたとしても、SDKを更新することで互換性を確保できます。