この Topic では、Milvus のベクターフィールドにインデックスを作成して類似検索を高速化する方法について説明します。ベクターインデックスは、Inverted File (IVF) や Hierarchical Navigable Small World (HNSW) などの高度なインデックススキーマとアルゴリズムを使用します。これらのインデックスはベクター空間を圧縮し、大規模なデータセットで最も類似したデータポイントの検索を高速化します。このプロセスにより、画像認識、音声取得、レコメンデーションシステムなどのアプリケーションの取得率と応答速度が大幅に向上します。
背景情報
Milvus は、効率的な類似性取得のために複数のインデックスタイプをサポートしています。ベクター間の距離を計算するために、コサイン類似度 (COSINE)、ユークリッド距離 (L2)、および内積 (IP) の 3 つのメトリックを提供します。頻繁にクエリされるベクターフィールドとスカラーフィールドにインデックスを作成して、取得パフォーマンスを最適化できます。
前提条件
ローカルクライアントに PyMilvus ライブラリをインストールし、最新バージョンに更新していること。
PyMilvus ライブラリをインストールしていない場合、または更新する必要がある場合は、次のコマンドを実行します。
pip install --upgrade pymilvusMilvus インスタンスを作成していること。詳細については、「Milvus インスタンスの作成」をご参照ください。
準備
インデックスを管理する前に、まずコレクションを作成する必要があります。コレクションを作成するには、2 つのアプローチがあります:
オプション 1: インデックスを持つコレクションを作成する
コレクションの作成時にインデックスを作成してロードする場合は、次のことを行う必要があります:
ベクターフィールドのディメンション (
dimension) を宣言するインデックス関連のパラメーター (
metric_typeとインデックス構成を含む) を提供する
オプション 2: インデックスなしでコレクションを作成する
次のコードスニペットではこのアプローチを使用しているため、作成されたコレクションにはインデックスが含まれず、自動的にメモリにロードされません:
from pymilvus import MilvusClient, DataType
client = MilvusClient(
uri="http://c-xxxx.milvus.aliyuncs.com:19530", # Milvus インスタンスのパブリックエンドポイント。
token="<yourUsername>:<yourPassword>", # Milvus インスタンスのユーザー名とパスワード。
db_name="default" # 接続するデータベースの名前。この例では、デフォルトのデータベースを使用します。
)
schema = MilvusClient.create_schema(
auto_id=False,
enable_dynamic_field=True,
)
schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)
schema.add_field(field_name="vec", datatype=DataType.FLOAT_VECTOR, dim=5)
client.create_collection(
collection_name="<yourCollectionName>",
schema=schema,
)
インデックスの作成
インデックスを作成するには、create_index 関数を呼び出し、定義済みの index_params を渡します。
index_params = MilvusClient.prepare_index_params()
# インデックスパラメーターを定義します。
index_params.add_index(
field_name="vec", # "vec" などのベクターフィールド名を指定します。
metric_type="L2", # L2 などのメトリックタイプを設定します。
index_type="IVF_PQ", # IVF_PQ などのインデックスタイプを設定します。
index_name="vector_index" # 必要に応じてインデックス名を設定します。
)
# インデックスを作成します。
client.create_index(
collection_name="<yourCollectionName>",
index_params=index_params
)
インデックスの表示
res = client.describe_index(
collection_name="<yourCollectionName>",
index_name="<yourIndexName>"
)
print(res)
インデックスの削除
client.drop_index(
collection_name="<yourCollectionName>",
index_name="<yourIndexName>"
)