milvus-logo
LFAI
홈페이지
  • 사용자 가이드

벡터 필드 색인 생성

이 가이드에서는 컬렉션의 벡터 필드에 인덱스를 만들고 관리하는 기본 작업에 대해 안내합니다.

개요

Milvus는 인덱스 파일에 저장된 메타데이터를 활용하여 데이터를 특수한 구조로 구성함으로써 검색 또는 쿼리 중에 요청된 정보를 신속하게 검색할 수 있도록 도와줍니다.

Milvus는 효율적인 유사도 검색을 위해 필드 값을 정렬하는 여러 가지 인덱스 유형과 메트릭을 제공합니다. 다음 표에는 다양한 벡터 필드 유형에 대해 지원되는 인덱스 유형과 메트릭이 나와 있습니다. 현재 Milvus는 부동 소수점 임베딩(부동 소수점 벡터 또는 고밀도 벡터라고도 함), 이진 임베딩(이진 벡터라고도 함), 스파스 임베딩(스파스 벡터라고도 함)을 포함한 다양한 유형의 벡터 데이터를 지원합니다. 자세한 내용은 인메모리 인덱스유사성 메트릭을 참조하세요.

메트릭 유형 인덱스 유형
  • 유클리드 거리(L2)
  • 내적 곱(IP)
  • 코사인 유사도(COSINE)
  • FLAT
  • IVF_FLAT
  • IVF_SQ8
  • IVF_PQ
  • GPU_IVF_FLAT
  • GPU_IVF_PQ
  • HNSW
  • DISKANN
메트릭 유형 인덱스 유형
  • Jaccard (JACCARD)
  • 해밍(HAMMING)
  • BIN_FLAT
  • BIN_IVF_FLAT
메트릭 유형 인덱스 유형
IP
  • SPARSE_INVERTED_INDEX
  • SPARSE_WAND

자주 액세스하는 벡터 필드와 스칼라 필드 모두에 대한 인덱스를 생성하는 것이 좋습니다.

준비

컬렉션 관리에서 설명한 대로 컬렉션 생성 요청에 다음 조건 중 하나라도 지정되면 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 클라이언트의 요청과 관련하여 인덱스가 빌드되는 방식을 제어합니다. 유효한 값은 다음과 같습니다:
  • True (기본값): 클라이언트는 인덱스가 완전히 빌드될 때까지 기다렸다가 반환합니다. 즉, 프로세스가 완료될 때까지 응답을 받지 못합니다.
  • False: 클라이언트는 요청이 수신되고 인덱스가 백그라운드에서 빌드되는 즉시 반환합니다. 인덱스 생성이 완료되었는지 확인하려면 describe_index() 메서드를 사용합니다.
파라미터 설명
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
// 

번역DeepLogo

Try Managed Milvus for Free

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

Get Started
피드백

이 페이지가 도움이 되었나요?