ベクトルインデックスの構築

このガイドでは、Milvus でベクトルインデックスを構築する方法について説明します。

ベクトルインデックスは、ベクトル類似検索を高速化するためのメタデータ組織ユニットです。ベクトルにインデックスを構築しないと、Milvus は総当たり検索を実行します。

デフォルトでは、1,024行未満のセグメントにはインデックスがありません。

次の例は、Euclidean(L2)距離を使用して 1,024 クラスタを持つ IVF_FLAT インデックスを構築する方法を示しています。インデックスとメトリックの種類は、シナリオに適したものを選択できます。

インデックスパラメータの準備

次の手順に従ってインデックスパラメータを準備します:

index_params = {
  "metric_type":"L2",
  "index_type":"IVF_FLAT",
  "params":{"nlist":1024}
}
パラメータ 説明 オプション
metric_type ベクトル類似度を測定するために使用されるメトリックのタイプ。 浮動小数点ベクトルの場合:- L2(ユークリッド距離)- IP(内積)- COSINE(コサイン類似度)バイナリベクトルの場合:- JACCARD(Jaccard 距離)- HAMMING(ハミング距離)
index_type ベクトル検索を高速化するために使用されるインデックスのタイプ。 浮動小数点ベクトルの場合:- FLAT(FLAT)- IVF_FLAT(IVF_FLAT)- IVF_SQ8(IVF_SQ8)- IVF_PQ(IVF_PQ)- GPU_IVF_FLAT*(GPU_IVF_FLAT)- GPU_IVF_PQ*>(GPU_IVF_PQ)- HNSW(HNSW)- DISKANN*(DISKANN)バイナリベクトルの場合:- BIN_FLAT(BIN_FLAT)- BIN_IVF_FLAT(BIN_IVF_FLAT)
params インデックスの具体的な構築パラメータ。 詳細については、インメモリとオンディスクのインデックス構築を参照してください。
  • DISKANN には特定の前提条件があります。詳細については、「ディスク上のインデックス構築」を参照してください。
  • GPU_IVF_FLATGPU_IVF_PQ は、GPU サポートを有効にした Milvus インストールでのみ利用できます。

インデックスの構築

ベクトルフィールド名とインデックスパラメータを指定してインデックスを構築します。

from pymilvus import Collection, utility
collection = Collection("book")
collection.create_index(
  field_name="book_intro",
  index_params=index_params
)

utility.index_building_progress("book")

パラメータ 説明
field_name インデックスを構築するベクトルフィールドの名前
index_params 構築するインデックスのパラメータ

スカラーインデックスの構築

ベクトルとは異なり、スカラーは大きさのみを持ち、方向はありません。Milvus では個々の数値や文字列をスカラーとして扱います。以下は、Milvus でのスカラーフィールドの利用可能なデータ型の一覧です。

Milvus v2.1.0 以降では、ハイブリッド検索中の属性フィルタリングを高速化するために、スカラーフィールドにインデックスを構築できます。スカラーフィールドのインデックス構築については、こちらで詳細を読むことができます。

*注意:「こちら」のリンクは、元のドキュメントで指定されている実際のリンクに置き換える必要があります。

インデックスの構築

スカラーフィールドにインデックスを構築する場合、インデックスパラメータを設定する必要はありません。スカラーフィールドのインデックス名のデフォルト値は default_idx であり、その後にインデックス化されたフィールドの名前が続きます。適切な値に設定することもできます。

次のコードスニペットは、book という名前のコレクションが既に存在し、文字列フィールド book_name にインデックスを作成する必要があると仮定しています。

from pymilvus import Collection

collection = Collection("book")   
collection.create_index(
  field_name="book_name", 
  index_name="scalar_index",
)
collection.load()

インデックスを作成すると、次のようにこの文字列フィールドに対するブール式をベクトル類似検索に含めることができます:

search_param = {
  "data": [[0.1, 0.2]],
  "anns_field": "book_intro",
  "param": {"metric_type": "L2", "params": {"nprobe": 10}},
  "limit": 2,
  "expr": "book_name like \"Hello%\"", 
}
res = collection.search(**search_param)

インデックスの削除

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