milvus-logo
LFAI
Home
  • Guía del usuario

Indexar campos vectoriales

Esta guía le guiará a través de las operaciones básicas de creación y gestión de índices en campos vectoriales de una colección.

Visión general

Aprovechando los metadatos almacenados en un archivo de índice, Milvus organiza sus datos en una estructura especializada, facilitando la rápida recuperación de la información solicitada durante las búsquedas o consultas.

Milvus proporciona varios tipos de índices y métricas para ordenar los valores de campo para realizar búsquedas de similitud eficientes. La siguiente tabla enumera los tipos de índices y métricas soportados para diferentes tipos de campos vectoriales. Actualmente, Milvus soporta varios tipos de datos vectoriales, incluyendo incrustaciones en coma flotante (a menudo conocidas como vectores en coma flotante o vectores densos), incrustaciones binarias (también conocidas como vectores binarios) e incrustaciones dispersas (también conocidas como vectores dispersos). Para obtener más información, consulte Índice en memoria y métricas de similitud.

Tipos de métricas Tipos de índices
  • Distancia euclidiana (L2)
  • Producto interior (IP)
  • Similitud coseno (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 índice
IP
  • SPARSE_INVERTED_INDEX
  • VARA_ESPARAZ

Se recomienda crear índices tanto para el campo vectorial como para los campos escalares a los que se accede con frecuencia.

Preparativos

Como se explica en Gestionar colecciones, Milvus genera automáticamente un índice y lo carga en memoria al crear una colección si se especifica alguna de las siguientes condiciones en la solicitud de creación de la colección:

  • La dimensionalidad del campo vectorial y el tipo de métrica, o

  • El esquema y los parámetros del índice.

El fragmento de código que aparece a continuación reutiliza el código existente para establecer una conexión con una instancia de Milvus y crear una colección sin especificar sus parámetros de índice. En este caso, la colección carece de índice y permanece descargada.

Para preparar la indexación, utilice MilvusClient para conectarse al servidor Milvus y crear una colección utilizando create_schema(), add_field()y create_collection().

Para preparar la indexación, utilice MilvusClientV2 para conectarse al servidor Milvus y configurar una colección utilizando createSchema(), addField()y createCollection().

Para preparar la indexación, utilice MilvusClient para conectarse al servidor Milvus y crear una colección 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 una colección

Para crear un índice para una colección o indexar una colección, utilice prepare_index_params() para preparar los parámetros del índice y create_index() para crear el índice.

Para crear un índice para una colección o indexar una colección, utilice IndexParam para preparar los parámetros del índice y createIndex() para crear el índice.

Para crear un índice para una colección o indexar una colección, utilice 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 Descripción
field_name El nombre del archivo de destino al que se aplica este objeto.
metric_type El algoritmo que se utiliza para medir la similitud entre vectores. Los valores posibles son IP, L2, COSINE, JACCARD, HAMMING. Sólo está disponible cuando el campo especificado es un campo vectorial. Para más información, consulte Índices soportados en Milvus.
index_type El nombre del algoritmo utilizado para ordenar los datos en el campo específico. Para los algoritmos aplicables, consulte Índice en memoria e Índice en disco.
index_name El nombre del archivo de índice generado después de aplicar este objeto.
params Los parámetros de ajuste para el tipo de índice especificado. Para obtener más información sobre las posibles claves y rangos de valores, consulte Índice en memoria.
collection_name El nombre de una colección existente.
index_params Un objeto IndexParams que contiene una lista de objetos IndexParam.
sync Controla cómo se construye el índice en relación con la petición del cliente. Valores válidos:
  • True (por defecto): El cliente espera a que el índice esté completamente construido antes de devolverlo. Esto significa que no obtendrá una respuesta hasta que el proceso se haya completado.
  • False: El cliente regresa inmediatamente después de recibir la petición y el índice se está construyendo en segundo plano. Para saber si se ha completado la creación del índice, utilice el método describe_index().
Parámetro Descripción
fieldName El nombre del campo de destino al que se aplica este objeto IndexParam.
indexName El nombre del archivo de índice generado después de aplicar este objeto.
indexType El nombre del algoritmo utilizado para ordenar los datos en el campo específico. Para conocer los algoritmos aplicables, consulte Índice en memoria e Índice en disco.
metricType La métrica de distancia que se utilizará para el índice. Los valores posibles son IP, L2, COSINE, JACCARD, HAMMING.
extraParams Parámetros de índice adicionales. Para más información, consulte Índice en memoria e Índice en disco.
Parámetro Descripción
collection_name El nombre de una colección existente.
field_name El nombre del campo en el que crear un índice.
index_type Tipo de índice que se va a crear.
metric_type El tipo de métrica utilizado para medir la distancia vectorial.
index_name El nombre del índice que se va a crear.
params Otros parámetros específicos del índice.

notas

Actualmente, sólo se puede crear un archivo de índice para cada campo de una colección.

Comprobar los detalles del índice

Una vez creado un índice, puede comprobar sus detalles.

Para comprobar los detalles del índice, utilice list_indexes() para ver los nombres de los índices y describe_index() para obtener los detalles del índice.

Para comprobar los detalles del índice, utilice describeIndex() para obtener los detalles del índice.

Para consultar los detalles del índice, utilice describeIndex() para obtener los detalles del í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"
//   }
// ]
// 

Puede comprobar el archivo de índice creado en un campo específico, y recopilar las estadísticas sobre el número de filas indexadas utilizando este archivo de índice.

Eliminar un índice

Puedes eliminar un índice si ya no es necesario.

Antes de eliminar un índice, asegúrese de que ha sido liberado.

Para eliminar un índice, utilice drop_index().

Para eliminar un índice, utilice dropIndex().

Para eliminar un índice, utilice 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
// 

Traducido porDeepL

Try Managed Milvus for Free

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

Get Started
Feedback

¿Fue útil esta página?