milvus-logo
LFAI
Home
  • Guia do utilizador

Indexar campos vectoriais

Este guia orienta-o nas operações básicas de criação e gestão de índices em campos vectoriais de uma coleção.

Visão geral

Aproveitando os metadados armazenados num ficheiro de índice, o Milvus organiza os seus dados numa estrutura especializada, facilitando a rápida recuperação da informação solicitada durante as pesquisas ou consultas.

O Milvus fornece vários tipos de índices e métricas para ordenar os valores de campo para pesquisas de similaridade eficientes. A tabela seguinte lista os tipos de índices e métricas suportados para diferentes tipos de campos vectoriais. Atualmente, o Milvus suporta vários tipos de dados vectoriais, incluindo embeddings de vírgula flutuante (frequentemente conhecidos como vectores de vírgula flutuante ou vectores densos), embeddings binários (também conhecidos como vectores binários) e embeddings esparsos (também conhecidos como vectores esparsos). Para obter detalhes, consulte Índice na memória e métricas de similaridade.

Tipos de métricas Tipos de índice
  • Distância euclidiana (L2)
  • Produto interno (IP)
  • Semelhança de cosseno (COSINE)
  • FLAT
  • IVF_FLAT
  • IVF_SQ8
  • IVF_PQ
  • GPU_IVF_FLAT
  • GPU_IVF_PQ
  • HNSW
  • DISKANN
Tipos de métricas Tipos de índices
  • Jaccard (JACCARD)
  • Hamming (HAMMING)
  • BIN_FLAT
  • BIN_IVF_FLAT
Tipos métricos Tipos de índices
IP
  • ÍNDICE_ESPARSO_INVERTIDO
  • SPARSE_WAND

Recomenda-se a criação de índices para o campo vetorial e para os campos escalares que são acessados com freqüência.

Preparações

Como explicado em Gerir colecções, o Milvus gera automaticamente um índice e carrega-o para a memória ao criar uma coleção se alguma das seguintes condições for especificada no pedido de criação da coleção:

  • A dimensionalidade do campo vetorial e o tipo de métrica, ou

  • O esquema e os parâmetros do índice.

O trecho de código abaixo reaproveita o código existente para estabelecer uma ligação a uma instância Milvus e criar uma coleção sem especificar os seus parâmetros de índice. Neste caso, a coleção não tem um índice e permanece descarregada.

Para preparar a indexação, utilize MilvusClient para ligar ao servidor Milvus e configurar uma coleção utilizando create_schema(), add_field(), e create_collection().

Para preparar a indexação, utilize MilvusClientV2 para se ligar ao servidor Milvus e configurar uma coleção utilizando createSchema(), addField(), e createCollection().

Para preparar a indexação, utilize MilvusClient para se ligar ao servidor Milvus e criar uma coleção utilizando 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
// 

Indexar uma coleção

Para criar um índice para uma coleção ou indexar uma coleção, utilize prepare_index_params() para preparar os parâmetros do índice e create_index() para criar o índice.

Para criar um índice para uma coleção ou indexar uma coleção, utilize IndexParam para preparar os parâmetros do índice e createIndex() para criar o índice.

Para criar um índice para uma coleção ou indexar uma coleção, utilize 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
// 
Parâmetro Descrição
field_name O nome do ficheiro de destino ao qual se aplica este objeto.
metric_type O algoritmo que é utilizado para medir a semelhança entre vectores. Os valores possíveis são IP, L2, COSINE, JACCARD, HAMMING. Esta opção só está disponível quando o campo especificado é um campo vetorial. Para mais informações, consulte Índices suportados no Milvus.
index_type O nome do algoritmo utilizado para organizar os dados no campo específico. Para os algoritmos aplicáveis, consulte Índice na memória e Índice no disco.
index_name O nome do ficheiro de índice gerado depois de este objeto ter sido aplicado.
params Os parâmetros de ajuste fino para o tipo de índice especificado. Para obter detalhes sobre possíveis chaves e intervalos de valores, consulte Índice na memória.
collection_name O nome de uma coleção existente.
index_params Um objeto IndexParams que contém uma lista de objectos IndexParam.
sync Controla a forma como o índice é criado em relação ao pedido do cliente. Valores válidos:
  • True (predefinição): O cliente espera até que o índice esteja totalmente construído antes de retornar. Isso significa que você não receberá uma resposta até que o processo seja concluído.
  • False: O cliente regressa imediatamente após a receção do pedido e o índice está a ser criado em segundo plano. Para saber se a criação do índice foi concluída, utilize o método describe_index().
Parâmetro Descrição
fieldName O nome do campo de destino a que se aplica este objeto IndexParam.
indexName O nome do ficheiro de índice gerado depois de este objeto ter sido aplicado.
indexType O nome do algoritmo utilizado para organizar os dados no campo específico. Para obter informações sobre os algoritmos aplicáveis, consulte Índice na memória e Índice no disco.
metricType A métrica de distância a utilizar para o índice. Os valores possíveis são IP, L2, COSINE, JACCARD, HAMMING.
extraParams Parâmetros de índice extra. Para obter detalhes, consulte Índice na memória e Índice no disco.
Parâmetro Descrição
collection_name O nome de uma coleção existente.
field_name O nome do campo no qual criar um índice.
index_type O tipo do índice a criar.
metric_type O tipo de métrica utilizado para medir a distância do vetor.
index_name O nome do índice a criar.
params Outros parâmetros específicos do índice.

notas

Atualmente, só é possível criar um ficheiro de índice para cada campo de uma coleção.

Verificar detalhes do índice

Depois de ter criado um índice, pode verificar os seus detalhes.

Para verificar os detalhes do índice, utilize list_indexes() para listar os nomes dos índices e describe_index() para obter os detalhes do índice.

Para verificar os detalhes do índice, utilize describeIndex() para obter os detalhes do índice.

Para verificar os detalhes do índice, utilize describeIndex() para obter os detalhes do índice.

# 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"
//   }
// ]
// 

Pode verificar o ficheiro de índice criado num campo específico e recolher as estatísticas sobre o número de linhas indexadas utilizando este ficheiro de índice.

Eliminar um índice

Pode simplesmente eliminar um índice se este já não for necessário.

Antes de eliminar um índice, certifique-se de que este foi libertado primeiro.

Para eliminar um índice, utilize drop_index().

Para eliminar um índice, utilize dropIndex().

Para eliminar um índice, utilize 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
// 

Traduzido porDeepLogo

Try Managed Milvus for Free

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

Get Started
Feedback

Esta página foi útil?