ベクトルフィールドのインデックス
このガイドでは、コレクション内のベクトルフィールドにインデックスを作成し、管理するための基本操作を説明します。
概要
Milvusはインデックスファイルに保存されたメタデータを活用し、データを特殊な構造で整理することで、検索やクエリ時に要求された情報の迅速な取得を容易にします。
Milvusは効率的な類似検索のために、いくつかのインデックスタイプとフィールド値をソートするメトリックを提供します。以下の表は、さまざまなベクトルフィールドタイプでサポートされているインデックスタイプとメトリクスの一覧です。現在、Milvusは浮動小数点埋め込み(しばしば浮動小数点ベクトルまたは密ベクトルとして知られています)、バイナリ埋め込み(バイナリベクトルとしても知られています)、スパース埋め込み(スパースベクトルとしても知られています)を含む様々なタイプのベクトルデータをサポートしています。詳しくは、「メモリ内インデックスと 類似度メトリクス」を参照。
メトリックの種類 | インデックスの種類 |
---|---|
|
|
メトリックタイプ | インデックスの種類 |
---|---|
|
|
メトリック型 | インデックスタイプ |
---|---|
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 |
ベクトル間の類似度を測定するために使用されるアルゴリズム。指定可能な値は、IP、L2、COSINE、JACCARD、HAMMING です。これは、指定されたフィールドがベクトル・フィールドである場合にのみ有効です。詳細はMilvusでサポートされているインデックスを参照してください。 |
index_type |
特定のフィールドのデータ配列に使用されるアルゴリズム名。適用可能なアルゴリズムについては、インメモリインデックスと オンディスクインデックスを参照してください。 |
index_name |
このオブジェクトが適用された後に生成されるインデックスファイルの名前。 |
params |
指定されたインデックス・タイプの微調整パラメータ。指定可能なキーと値の範囲の詳細については、In-memory Indexを参照してください。 |
collection_name |
既存のコレクションの名前。 |
index_params |
IndexParamオブジェクトのリストを含むIndexParamsオブジェクト。 |
sync |
クライアントの要求に関連するインデックスの構築方法を制御します。有効な値:
|
パラメータ | 説明 |
---|---|
fieldName |
この IndexParam オブジェクトを適用する対象フィールドの名前。 |
indexName |
このオブジェクトが適用された後に生成されるインデックスファイルの名前。 |
indexType |
特定のフィールドにデータを配置するために使用されるアルゴリズムの名前。適用可能なアルゴリズムについては、In-memory IndexおよびOn-disk Index を参照してください。 |
metricType |
インデックスに使用する距離メトリック。指定可能な値はIP、L2、COSINE、JACCARD、HAMMING。 |
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
//