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 los campos con el fin de 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 |
---|---|
|
|
Tipos de métricas | Tipos de índices |
---|---|
|
|
Tipos métricos | Tipos de índices |
---|---|
IP |
|
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:
|
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
//