milvus-logo
LFAI
Casa
  • Guida per l'utente
    • Indici

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
  • Distanza euclidea (L2)
  • Prodotto interno (IP)
  • Somiglianza coseno (COSINE)
  • PIATTO
  • IVF_FLAT
  • FIV_SQ8
  • IVF_PQ
  • GPU_IVF_FLAT
  • GPU_IVF_PQ
  • HNSW
  • DISKANN
Tipi di metriche Tipi di indice
  • Jaccard (JACCARD)
  • Hamming (HAMMING)
  • BIN_FLAT
  • BIN_IVF_FLAT
Tipi metrici Tipi di indice
IP
  • INDICE SPARSE_INVERTITO
  • SPARSE_WAND

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:
  • True (predefinito): Il client attende che l'indice sia completamente costruito prima di restituirlo. Ciò significa che non si otterrà una risposta finché il processo non sarà completato.
  • False: Il client ritorna immediatamente dopo aver ricevuto la richiesta e l'indice viene costruito in background. Per sapere se la creazione dell'indice è stata completata, utilizzare il metodo describe_index().
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
// 

Tradotto daDeepL

Try Managed Milvus for Free

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

Get Started
Feedback

Questa pagina è stata utile?