벡터 필드 색인 생성
이 가이드에서는 컬렉션의 벡터 필드에 인덱스를 만들고 관리하는 기본 작업에 대해 안내합니다.
개요
Milvus는 인덱스 파일에 저장된 메타데이터를 활용하여 데이터를 특수한 구조로 구성함으로써 검색 또는 쿼리 중에 요청된 정보를 신속하게 검색할 수 있도록 도와줍니다.
Milvus는 효율적인 유사도 검색을 위해 필드 값을 정렬하는 여러 가지 인덱스 유형과 메트릭을 제공합니다. 다음 표에는 다양한 벡터 필드 유형에 대해 지원되는 인덱스 유형과 메트릭이 나와 있습니다. 현재 Milvus는 부동 소수점 임베딩(부동 소수점 벡터 또는 고밀도 벡터라고도 함), 이진 임베딩(이진 벡터라고도 함), 스파스 임베딩(스파스 벡터라고도 함)을 포함한 다양한 유형의 벡터 데이터를 지원합니다. 자세한 내용은 인메모리 인덱스 및 유사성 메트릭을 참조하세요.
메트릭 유형 | 인덱스 유형 |
---|---|
|
|
메트릭 유형 | 인덱스 유형 |
---|---|
|
|
메트릭 유형 | 인덱스 유형 |
---|---|
IP |
|
자주 액세스하는 벡터 필드와 스칼라 필드 모두에 대한 인덱스를 생성하는 것이 좋습니다.
준비
컬렉션 관리에서 설명한 대로 컬렉션 생성 요청에 다음 조건 중 하나라도 지정되면 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 |
지정된 인덱스 유형에 대한 미세 조정 매개변수입니다. 사용 가능한 키 및 값 범위에 대한 자세한 내용은 인메모리 인덱스를 참조하세요. |
collection_name |
기존 컬렉션의 이름입니다. |
index_params |
IndexParams 객체 목록이 포함된 IndexParams 객체입니다. |
sync |
클라이언트의 요청과 관련하여 인덱스가 빌드되는 방식을 제어합니다. 유효한 값은 다음과 같습니다:
|
파라미터 | 설명 |
---|---|
fieldName |
이 IndexParam 객체를 적용할 대상 필드의 이름입니다. |
indexName |
이 객체가 적용된 후 생성된 인덱스 파일의 이름입니다. |
indexType |
특정 필드에서 데이터를 정렬하는 데 사용되는 알고리즘의 이름입니다. 적용 가능한 알고리즘에 대해서는 인메모리 인덱스 및 온디스크 인덱스를 참조하세요. |
metricType |
인덱스에 사용할 거리 메트릭입니다. 사용 가능한 값은 IP, L2, COSINE, JACCARD, HAMMING입니다. |
extraParams |
추가 인덱스 매개변수. 자세한 내용은 인메모리 인덱스 및 온디스크 인덱스를 참조하세요. |
파라미터 | 설명 |
---|---|
collection_name |
기존 컬렉션의 이름입니다. |
field_name |
인덱스를 생성할 필드의 이름입니다. |
index_type |
생성할 인덱스의 유형입니다. |
metric_type |
벡터 거리를 측정하는 데 사용되는 메트릭 유형입니다. |
index_name |
생성할 인덱스의 이름입니다. |
params |
기타 인덱스 관련 매개 변수입니다. |
참고
현재 컬렉션의 각 필드에 대해 하나의 인덱스 파일만 만들 수 있습니다.
인덱스 세부 정보 확인
인덱스를 만든 후에는 인덱스 세부 정보를 확인할 수 있습니다.
인덱스 세부 정보를 확인하려면 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
//