Indicizzare i campi vettoriali
Questa guida illustra le operazioni di base per la creazione e la gestione degli indici sui campi vettoriali di una collezione.
Panoramica
Sfruttando i metadati memorizzati in un file indice, Milvus organizza i dati in una struttura specializzata, facilitando il rapido recupero delle informazioni richieste durante le ricerche o le interrogazioni.
Milvus offre diversi tipi di indice e metriche per ordinare i valori dei campi per una ricerca efficiente delle somiglianze. La tabella seguente elenca i tipi di indice e le metriche supportate per i diversi tipi di campi vettoriali. Attualmente Milvus supporta diversi tipi di dati vettoriali, tra cui embedding in virgola mobile (spesso noti come vettori in virgola mobile o vettori densi), embedding binari (noti anche come vettori binari) e embedding sparsi (noti anche come vettori sparsi). Per ulteriori informazioni, consultare Indice in-memory e metriche di somiglianza.
Tipi di metriche | Tipi di indice |
---|---|
|
|
Tipi di metriche | Tipi di indice |
---|---|
|
|
Tipi metrici | Tipi di indice |
---|---|
IP |
|
Si consiglia di creare indici sia per il campo vettoriale che per i campi scalari a cui si accede di frequente.
Preparazione
Come spiegato in Gestire le collezioni, Milvus genera automaticamente un indice e lo carica in memoria durante la creazione di una collezione se una delle seguenti condizioni è specificata nella richiesta di creazione della collezione:
La dimensionalità del campo vettoriale e il tipo di metrica, o
Lo schema e i parametri dell'indice.
Il frammento di codice seguente ripropone il codice esistente per stabilire una connessione a un'istanza di Milvus e creare una raccolta senza specificare i parametri dell'indice. In questo caso, la collezione non ha un indice e rimane scarica.
Per preparare l'indicizzazione, usare MilvusClient
per connettersi al server Milvus e impostare una raccolta usando create_schema()
, add_field()
, e create_collection()
.
Per preparare l'indicizzazione, utilizzare MilvusClientV2
per connettersi al server Milvus e impostare una raccolta con i tasti createSchema()
, addField()
, e createCollection()
.
Per preparare l'indicizzazione, utilizzare MilvusClient
per connettersi al server Milvus e impostare una raccolta con i tasti 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
//
Indicizzare una raccolta
Per creare un indice per una raccolta o indicizzare una raccolta, usare prepare_index_params()
per preparare i parametri dell'indice e create_index()
per creare l'indice.
Per creare un indice per un insieme o indicizzare un insieme, usare IndexParam
per preparare i parametri dell'indice e createIndex()
per creare l'indice.
Per creare un indice per un insieme o indicizzare un insieme, usare 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
//
Parametro | Descrizione |
---|---|
field_name |
Il nome del file di destinazione a cui applicare questo oggetto. |
metric_type |
L'algoritmo utilizzato per misurare la somiglianza tra i vettori. I valori possibili sono IP, L2, COSINE, JACCARD, HAMMING. È disponibile solo quando il campo specificato è un campo vettoriale. Per ulteriori informazioni, consultare la sezione Indici supportati in Milvus. |
index_type |
Il nome dell'algoritmo utilizzato per disporre i dati nel campo specifico. Per gli algoritmi applicabili, consultare Indice in memoria e Indice su disco. |
index_name |
Il nome del file di indice generato dopo l'applicazione di questo oggetto. |
params |
I parametri di regolazione fine per il tipo di indice specificato. Per i dettagli sulle chiavi e gli intervalli di valori possibili, consultare Indice in memoria. |
collection_name |
Il nome di una collezione esistente. |
index_params |
Un oggetto IndexParams contenente un elenco di oggetti IndexParam. |
sync |
Controlla il modo in cui l'indice viene costruito in relazione alla richiesta del client. Valori validi:
|
Parametro | Descrizione |
---|---|
fieldName |
Il nome del campo di destinazione a cui si applica questo oggetto IndexParam. |
indexName |
Il nome del file di indice generato dopo l'applicazione di questo oggetto. |
indexType |
Il nome dell'algoritmo utilizzato per organizzare i dati nel campo specifico. Per gli algoritmi applicabili, fare riferimento a Indice in memoria e Indice su disco. |
metricType |
La metrica di distanza da utilizzare per l'indice. I valori possibili sono IP, L2, COSINE, JACCARD, HAMMING. |
extraParams |
Parametri extra dell'indice. Per i dettagli, fare riferimento a Indice in memoria e Indice su disco. |
Parametro | Descrizione |
---|---|
collection_name |
Il nome di una raccolta esistente. |
field_name |
Il nome del campo in cui creare un indice. |
index_type |
Il tipo di indice da creare. |
metric_type |
Il tipo di metrica utilizzata per misurare la distanza vettoriale. |
index_name |
Il nome dell'indice da creare. |
params |
Altri parametri specifici dell'indice. |
note
Attualmente è possibile creare un solo file di indice per ogni campo di una collezione.
Controllare i dettagli dell'indice
Una volta creato un indice, è possibile verificarne i dettagli.
Per controllare i dettagli dell'indice, usare list_indexes()
per elencare i nomi degli indici e describe_index()
per ottenere i dettagli dell'indice.
Per controllare i dettagli dell'indice, usare describeIndex()
per ottenere i dettagli dell'indice.
Per controllare i dettagli dell'indice, usare describeIndex()
per ottenere i dettagli dell'indice.
# 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"
// }
// ]
//
È possibile controllare il file di indice creato su un campo specifico e raccogliere le statistiche sul numero di righe indicizzate utilizzando questo file di indice.
Eliminare un indice
È possibile eliminare un indice se non è più necessario.
Prima di eliminare un indice, accertarsi che sia stato rilasciato.
Per eliminare un indice, usare drop_index()
.
Per eliminare un indice, usare dropIndex()
.
Per eliminare un indice, usare 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
//