エンティティの挿入

このセクションでは、クライアント側を介してMilvusにデータを挿入する方法について説明します。

また、MilvusDMを使用してデータをMilvusに移行することもできます。MilvusDMは、Milvusデータのインポートやエクスポートを目的として設計されたオープンソースのツールです。

Milvus 2.1 では、スカラーフィールドの VARCHAR データ型がサポートされています。VARCHAR 型のスカラーフィールドにインデックスを作成する場合、デフォルトのインデックスタイプはトライです。

次の例では、ランダムに生成されたデータのサンプルデータを2,000行挿入します(Milvus CLIの例では類似したデータを含む事前に作成されたリモートCSVファイルが使用されます)。実世界のアプリケーションでは、この例よりも高次元のベクトルが使用されることが一般的です。サンプルデータを置き換えるために独自のデータを準備することができます。

データの準備

まず、挿入するデータを準備します。挿入するデータのデータ型はコレクションのスキーマと一致している必要があります。そうでない場合、Milvusは例外を発生させます。

Milvusは、主キーフィールドを除いて、スカラーフィールドに対してデフォルト値をサポートしています。つまり、データの挿入または更新時に一部のフィールドを空のままにすることができます。詳細については、「コレクションの作成」を参照してください。

動的スキーマを有効にした後は、データに動的フィールドを追加することができます。詳細については、動的スキーマを参照してください。

import random
data = [
  [i for i in range(2000)],
  [str(i) for i in range(2000)],
  [i for i in range(10000, 12000)],
  [[random.random() for _ in range(2)] for _ in range(2000)],
  [], 
  None,
]

data.append([str("dy"*i) for i in range(2000)])

Milvusへのデータの挿入

コレクションにデータを挿入します。

partition_name を指定することで、データを挿入するパーティションを選択することができます。

from pymilvus import Collection
collection = Collection("book")      # 既存のコレクションを取得します。
mr = collection.insert(data)
パラメータ 説明
data Milvusに挿入するデータです。
partition_name (オプション) データが挿入されるパーティションの名前です。

既存のインデックス付きコレクションにエンティティを挿入した場合、新たに挿入されたデータに対して自動的にインデックスが作成されるため、コレクションを再インデックスする必要はありません。詳細については、「ベクトルを挿入した後でインデックスを作成できますか?」を参照してください。

Milvusでのデータのリフレッシュ

Milvusにデータを挿入すると、それらはセグメントに挿入されます。セグメントは一定のサイズに達する必要があり、それからシールされてインデックスが作成されます。シールされていないセグメントはブルートフォース検索を使用します。このような状況を避けるために、残りのデータに対してflush()を呼び出すことが最善です。flush()呼び出しは残りのセグメントをシールし、インデックスに送信します。このメソッドは挿入セッションの最後にのみ呼び出すことが重要です。頻繁に呼び出すと、後でクリーンアップする必要がある破片化したデータを生む可能性があります。

制限事項

機能 最大制限
ベクトルの次元 32,768

エンティティのアップサート

アップサート更新は挿入と削除操作を組み合わせたものです。Milvusのベクトルデータベースの文脈では、更新はデータレベルの操作です。指定されたフィールドがコレクションに存在する場合は既存のエンティティを上書きし、指定された値が存在しない場合は新しいエンティティを挿入します。

次の例では、ランダムに生成されたデータをサンプルデータとして3,000行更新します。更新操作を実行する際には、データの削除が含まれるため、この操作はパフォーマンスに影響を与える可能性があることに注意することが重要です。

データの準備

まず、更新するデータを準備します。更新するデータのデータ型はコレクションのスキーマと一致している必要があります。そうでない場合、Milvusは例外を発生させます。

Milvusは、主キーフィールドを除いて、スカラーフィールドに対してデフォルト値をサポートしています。つまり、データの挿入または更新時に一部のフィールドを空のままにすることができます。詳細については、コレクションの作成を参照してください。

import random
nb = 3000
dim = 8
vectors = [[random.random() for _ in range(dim)] for _ in range(nb)]
data = [
    [i for i in range(nb)],
    [str(i) for i in range(nb)],
    [i for i in range(10000, 10000+nb)],
    vectors,
    [str("dy"*i) for i in range(nb)]
]

データの更新

コレクションにデータを更新します。

from pymilvus import Collection
collection = Collection("book")  # 既存のコレクションを取得します。
mr = collection.upsert(data)

エンティティの削除

Milvusは、主キーを介してブール式を使用してエンティティの削除をサポートしています。

ブール式の準備

削除対象のエンティティをフィルタリングするためのブール式を準備します。

Milvusでは、明示的に指定されたプライマリキーを持つエンティティの削除のみをサポートしており、これは「in」演算子を使用して達成できます。その他の演算子は、クエリやベクトル検索のためのスカラーフィルタリングでのみ使用できます。

次の例では、プライマリキーの値が0および1でデータをフィルタリングしています。

expr = "book_id in [0,1]"

SQLのWHERE句と類似のものです

エンティティの削除

作成したブール式を使用してエンティティを削除します。Milvusは削除されたエンティティのIDリストを返します。

from pymilvus import Collection
collection = Collection("book")      # 既存のコレクションを取得します。
collection.delete(expr)

データの圧縮

Milvusでは、デフォルトでデータの自動圧縮をサポートしています。Milvusを構成して圧縮または自動圧縮を有効または無効にすることができます。

自動圧縮が無効の場合、データを手動で圧縮することができます。

データの手動圧縮

通常、圧縮には時間がかかるため、圧縮リクエストは非同期で処理されます。

from pymilvus import Collection
collection = Collection("book")      # 既存のコレクションを取得します。
collection.compact()

圧縮状態の確認

手動で圧縮をトリガーした際に返される圧縮IDを使用して、圧縮状態を確認できます。

collection.get_compaction_state()