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 |
---|---|
|
|
Tipos de métricas | Tipos de índices |
---|---|
|
|
Tipos métricos | Tipos de índices |
---|---|
IP |
|
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:
|
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
//