milvus-logo
LFAI
フロントページへ
  • ユーザーガイド

ベクトルフィールドのインデックス

このガイドでは、コレクション内のベクトルフィールドにインデックスを作成し、管理するための基本操作を説明します。

概要

Milvusはインデックスファイルに保存されたメタデータを活用し、データを特殊な構造で整理することで、検索やクエリ時に要求された情報の迅速な取得を容易にします。

Milvusは効率的な類似検索のために、いくつかのインデックスタイプとフィールド値をソートするメトリックを提供します。以下の表は、さまざまなベクトルフィールドタイプでサポートされているインデックスタイプとメトリクスの一覧です。現在、Milvusは浮動小数点埋め込み(しばしば浮動小数点ベクトルまたは密ベクトルとして知られています)、バイナリ埋め込み(バイナリベクトルとしても知られています)、スパース埋め込み(スパースベクトルとしても知られています)を含む様々なタイプのベクトルデータをサポートしています。詳しくは、「メモリ内インデックスと 類似度メトリクス」を参照。

メトリックの種類 インデックスの種類
  • ユークリッド距離 (L2)
  • 内積 (IP)
  • コサイン類似度 (COSINE)
  • フラット
  • IVF_FLAT
  • IVF_SQ8
  • IVF_PQ
  • GPU_IVF_FLAT
  • GPU_IVF_PQ
  • HNSW
  • DISKANN
メトリックタイプ インデックスの種類
  • ジャカード(JACCARD)
  • ハミング(HAMMING)
  • BIN_FLAT
  • BIN_IVF_FLAT
メトリック型 インデックスタイプ
IP
  • スパース・インバーテッド・インデックス
  • スパースワンド

頻繁にアクセスされるベクトル・フィールドとスカラー・フィールドの両方にインデックスを作成することを推奨する。

準備

Manage Collectionsで説明したように、Milvusはコレクション作成リクエストで以下の条件のいずれかが指定された場合、コレクション作成時に自動的にインデックスを生成し、メモリにロードします:

  • ベクトルフィールドの次元とメトリックタイプ、または

  • スキーマとインデックス・パラメータ。

以下のコードスニペットは、Milvusインスタンスへの接続を確立し、インデックスパラメータを指定せずにコレクションを作成するために、既存のコードを再利用しています。この場合、コレクションにはインデックスがなく、アンロードされたままになります。

インデックス作成の準備のために MilvusClientを使用してMilvusサーバに接続し、コレクションをセットアップします。 create_schema(), add_field()および create_collection().

インデックス作成の準備には MilvusClientV2を使ってMilvusサーバーに接続し、コレクションを設定する。 createSchema(), addField()および createCollection().

インデックス作成の準備には MilvusClientを使ってMilvusサーバーに接続し、コレクションをセットアップする。 createCollection().

from pymilvus import MilvusClient, DataType

# 1. Set up a Milvus client
client = MilvusClient(
    uri="http://localhost:19530"
)

# 2. Create schema
# 2.1. Create schema
schema = MilvusClient.create_schema(
    auto_id=False,
    enable_dynamic_field=True,
)

# 2.2. Add fields to schema
schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)
schema.add_field(field_name="vector", datatype=DataType.FLOAT_VECTOR, dim=5)

# 3. Create collection
client.create_collection(
    collection_name="customized_setup", 
    schema=schema, 
)
import io.milvus.v2.client.ConnectConfig;
import io.milvus.v2.client.MilvusClientV2;
import io.milvus.v2.common.DataType;
import io.milvus.v2.service.collection.request.CreateCollectionReq;

String CLUSTER_ENDPOINT = "http://localhost:19530";

// 1. Connect to Milvus server
ConnectConfig connectConfig = ConnectConfig.builder()
    .uri(CLUSTER_ENDPOINT)
    .build();

MilvusClientV2 client = new MilvusClientV2(connectConfig);

// 2. Create a collection

// 2.1 Create schema
CreateCollectionReq.CollectionSchema schema = client.createSchema();

// 2.2 Add fields to schema
schema.addField(AddFieldReq.builder().fieldName("id").dataType(DataType.Int64).isPrimaryKey(true).autoID(false).build());
schema.addField(AddFieldReq.builder().fieldName("vector").dataType(DataType.FloatVector).dimension(5).build());

// 3 Create a collection without schema and index parameters
CreateCollectionReq customizedSetupReq = CreateCollectionReq.builder()
.collectionName("customized_setup")
.collectionSchema(schema)
.build();

client.createCollection(customizedSetupReq);
// 1. Set up a Milvus Client
client = new MilvusClient({address, token});

// 2. Define fields for the collection
const fields = [
    {
        name: "id",
        data_type: DataType.Int64,
        is_primary_key: true,
        autoID: false
    },
    {
        name: "vector",
        data_type: DataType.FloatVector,
        dim: 5
    },
]

// 3. Create a collection
res = await client.createCollection({
    collection_name: "customized_setup",
    fields: fields,
})

console.log(res.error_code)  

// Output
// 
// Success
// 

コレクションのインデックス

コレクションにインデックスを作成したり、コレクションにインデックスを作成するには prepare_index_params()を使用してインデックスパラメータを準備し create_index()を使用してインデックスを作成します。

コレクションのインデックスを作成するには IndexParamを使用してインデックス・パラメータを準備し createIndex()を使用してインデックスを作成します。

コレクションにインデックスを作成したり、コレクションにインデックスを作成するには createIndex().

# 4.1. Set up the index parameters
index_params = MilvusClient.prepare_index_params()

# 4.2. Add an index on the vector field.
index_params.add_index(
    field_name="vector",
    metric_type="COSINE",
    index_type="IVF_FLAT",
    index_name="vector_index",
    params={ "nlist": 128 }
)

# 4.3. Create an index file
client.create_index(
    collection_name="customized_setup",
    index_params=index_params,
    sync=False # Whether to wait for index creation to complete before returning. Defaults to True.
)
import io.milvus.v2.common.IndexParam;
import io.milvus.v2.service.index.request.CreateIndexReq;

// 4 Prepare index parameters

// 4.2 Add an index for the vector field "vector"
IndexParam indexParamForVectorField = IndexParam.builder()
    .fieldName("vector")
    .indexName("vector_index")
    .indexType(IndexParam.IndexType.IVF_FLAT)
    .metricType(IndexParam.MetricType.COSINE)
    .extraParams(Map.of("nlist", 128))
    .build();

List<IndexParam> indexParams = new ArrayList<>();
indexParams.add(indexParamForVectorField);

// 4.3 Crate an index file
CreateIndexReq createIndexReq = CreateIndexReq.builder()
    .collectionName("customized_setup")
    .indexParams(indexParams)
    .build();

client.createIndex(createIndexReq);
// 4. Set up index for the collection
// 4.1. Set up the index parameters
res = await client.createIndex({
    collection_name: "customized_setup",
    field_name: "vector",
    index_type: "AUTOINDEX",
    metric_type: "COSINE",   
    index_name: "vector_index",
    params: { "nlist": 128 }
})

console.log(res.error_code)

// Output
// 
// Success
// 
パラメータ 説明
field_name このオブジェクトを適用する対象ファイルの名前。
metric_type ベクトル間の類似度を測定するために使用されるアルゴリズム。指定可能な値は、IPL2COSINEJACCARDHAMMING です。これは、指定されたフィールドがベクトル・フィールドである場合にのみ有効です。詳細はMilvusでサポートされているインデックスを参照してください。
index_type 特定のフィールドのデータ配列に使用されるアルゴリズム名。適用可能なアルゴリズムについては、インメモリインデックスと オンディスクインデックスを参照してください。
index_name このオブジェクトが適用された後に生成されるインデックスファイルの名前。
params 指定されたインデックス・タイプの微調整パラメータ。指定可能なキーと値の範囲の詳細については、In-memory Indexを参照してください。
collection_name 既存のコレクションの名前。
index_params IndexParamオブジェクトのリストを含むIndexParamsオブジェクト。
sync クライアントの要求に関連するインデックスの構築方法を制御します。有効な値:
  • True (既定値):クライアントは、インデックスが完全に構築されるまで待ってから返します。これは、処理が完了するまでレスポンスを受け取らないことを意味します。
  • False:クライアントはリクエストを受け取った直後に戻り、バックグラウンドでインデックスが作成されます。インデックスの作成が完了したかどうかを調べるにはdescribe_index()メソッドを使用します。
パラメータ 説明
fieldName この IndexParam オブジェクトを適用する対象フィールドの名前。
indexName このオブジェクトが適用された後に生成されるインデックスファイルの名前。
indexType 特定のフィールドにデータを配置するために使用されるアルゴリズムの名前。適用可能なアルゴリズムについては、In-memory IndexおよびOn-disk Index を参照してください。
metricType インデックスに使用する距離メトリック。指定可能な値はIPL2COSINEJACCARDHAMMING
extraParams インデックスの追加パラメータ。詳細はインメモリ・インデックスと オンディスク・インデックスを参照。
パラメータ 説明
collection_name 既存のコレクションの名前。
field_name インデックスを作成するフィールドの名前。
index_type 作成するインデックスのタイプ。
metric_type ベクトル距離の測定に使用するメトリック・タイプ。
index_name 作成するインデックスの名前。
params その他のインデックス固有のパラメータ。

注釈

現在、コレクション内の各フィールドに対して1つのインデックスファイルしか作成できません。

インデックスの詳細の確認

インデックスを作成したら、その詳細を確認できます。

インデックスの詳細を確認するには list_indexes()を使用してインデックス名をリストし describe_index()を使用してインデックスの詳細を取得します。

インデックスの詳細を確認するには describeIndex()を使用してインデックスの詳細を取得する。

インデックスの詳細を確認するには describeIndex()を使ってインデックスの詳細を取得する。

# 5. Describe index
res = client.list_indexes(
    collection_name="customized_setup"
)

print(res)

# Output
#
# [
#     "vector_index",
# ]

res = client.describe_index(
    collection_name="customized_setup",
    index_name="vector_index"
)

print(res)

# Output
#
# {
#     "index_type": ,
#     "metric_type": "COSINE",
#     "field_name": "vector",
#     "index_name": "vector_index"
# }
import io.milvus.v2.service.index.request.DescribeIndexReq;
import io.milvus.v2.service.index.response.DescribeIndexResp;

// 5. Describe index
// 5.1 List the index names
ListIndexesReq listIndexesReq = ListIndexesReq.builder()
    .collectionName("customized_setup")
    .build();

List<String> indexNames = client.listIndexes(listIndexesReq);

System.out.println(indexNames);

// Output:
// [
//     "vector_index"
// ]

// 5.2 Describe an index
DescribeIndexReq describeIndexReq = DescribeIndexReq.builder()
    .collectionName("customized_setup")
    .indexName("vector_index")
    .build();

DescribeIndexResp describeIndexResp = client.describeIndex(describeIndexReq);

System.out.println(JSONObject.toJSON(describeIndexResp));

// Output:
// {
//     "metricType": "COSINE",
//     "indexType": "AUTOINDEX",
//     "fieldName": "vector",
//     "indexName": "vector_index"
// }
// 5. Describe the index
res = await client.describeIndex({
    collection_name: "customized_setup",
    index_name: "vector_index"
})

console.log(JSON.stringify(res.index_descriptions, null, 2))

// Output
// 
// [
//   {
//     "params": [
//       {
//         "key": "index_type",
//         "value": "AUTOINDEX"
//       },
//       {
//         "key": "metric_type",
//         "value": "COSINE"
//       }
//     ],
//     "index_name": "vector_index",
//     "indexID": "449007919953063141",
//     "field_name": "vector",
//     "indexed_rows": "0",
//     "total_rows": "0",
//     "state": "Finished",
//     "index_state_fail_reason": "",
//     "pending_index_rows": "0"
//   }
// ]
// 

特定のフィールドに作成されたインデックスファイルを確認し、 このインデックスファイルを使用してインデックス付けされた行数の統計を収集することができます。

インデックスの削除

インデックスが不要になった場合は、単純にインデックスを削除することができます。

インデックスを削除する前に、まずインデックスが解放されていることを確認してください。

インデックスを削除するには drop_index().

インデックスを削除するには dropIndex().

インデックスを削除するには dropIndex().

# 6. Drop index
client.drop_index(
    collection_name="customized_setup",
    index_name="vector_index"
)
// 6. Drop index

DropIndexReq dropIndexReq = DropIndexReq.builder()
    .collectionName("customized_setup")
    .indexName("vector_index")
    .build();

client.dropIndex(dropIndexReq);
// 6. Drop the index
res = await client.dropIndex({
    collection_name: "customized_setup",
    index_name: "vector_index"
})

console.log(res.error_code)

// Output
// 
// Success
// 

翻訳DeepL

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started
フィードバック

このページは役に立ちましたか ?