milvus-logo
LFAI
Home
  • Guide de l'utilisateur

Indexer des champs vectoriels

Ce guide vous présente les opérations de base pour créer et gérer des index sur les champs vectoriels d'une collection.

Vue d'ensemble

En exploitant les métadonnées stockées dans un fichier d'index, Milvus organise vos données dans une structure spécialisée, ce qui facilite la récupération rapide des informations demandées lors des recherches ou des requêtes.

Milvus propose plusieurs types d'index et de métriques pour trier les valeurs des champs afin d'effectuer des recherches de similarité efficaces. Le tableau suivant répertorie les types d'index et les métriques pris en charge pour différents types de champs vectoriels. Actuellement, Milvus prend en charge différents types de données vectorielles, notamment les encastrements à virgule flottante (souvent appelés vecteurs à virgule flottante ou vecteurs denses), les encastrements binaires (également appelés vecteurs binaires) et les encastrements épars (également appelés vecteurs épars). Pour plus d'informations, reportez-vous à la section Index en mémoire et métriques de similarité.

Types de métriques Types d'index
  • Distance euclidienne (L2)
  • Produit intérieur (IP)
  • Similitude cosinus (COSINE)
  • FLAT
  • IVF_FLAT
  • IVF_SQ8
  • IVF_PQ
  • GPU_IVF_FLAT
  • GPU_IVF_PQ
  • HNSW
  • DISKANN
Types de métriques Types d'indices
  • Jaccard (JACCARD)
  • Hamming (HAMMING)
  • BIN_FLAT
  • BIN_IVF_FLAT
Types métriques Types d'indices
IP
  • INDEX_INVERTI_SPARSE
  • SPARSE_WAND

Il est recommandé de créer des index pour les champs vectoriels et les champs scalaires auxquels on accède fréquemment.

Préparations

Comme expliqué dans Gérer les collections, Milvus génère automatiquement un index et le charge en mémoire lors de la création d'une collection si l'une des conditions suivantes est spécifiée dans la demande de création de la collection :

  • La dimensionnalité du champ vectoriel et le type de métrique, ou

  • Le schéma et les paramètres de l'index.

L'extrait de code ci-dessous reprend le code existant pour établir une connexion avec une instance Milvus et créer une collection sans spécifier ses paramètres d'index. Dans ce cas, la collection n'a pas d'index et reste non chargée.

Pour préparer l'indexation, utilisez MilvusClient pour se connecter au serveur Milvus et configurer une collection à l'aide de create_schema(), add_field(), et create_collection().

Pour préparer l'indexation, utilisez MilvusClientV2 pour vous connecter au serveur Milvus et configurer une collection à l'aide de createSchema(), addField(), et createCollection().

Pour préparer l'indexation, utilisez MilvusClient pour vous connecter au serveur Milvus et configurer une collection à l'aide de 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
// 

Indexation d'une collection

Pour créer un index pour une collection ou indexer une collection, utilisez prepare_index_params() pour préparer les paramètres de l'index et create_index() pour créer l'index.

Pour créer un index pour une collection ou indexer une collection, utilisez IndexParam pour préparer les paramètres de l'index et createIndex() pour créer l'index.

Pour créer un index pour une collection ou indexer une collection, utilisez la commande 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
// 
Paramètre Description de l'objet
field_name Le nom du fichier cible auquel cet objet s'applique.
metric_type L'algorithme utilisé pour mesurer la similarité entre les vecteurs. Les valeurs possibles sont IP, L2, COSINE, JACCARD, HAMMING. Cette option n'est disponible que si le champ spécifié est un champ vectoriel. Pour plus d'informations, voir Index pris en charge dans Milvus.
index_type Nom de l'algorithme utilisé pour organiser les données dans le champ spécifique. Pour les algorithmes applicables, voir Index en mémoire et Index sur disque.
index_name Le nom du fichier d'index généré après l'application de cet objet.
params Les paramètres de réglage fin pour le type d'index spécifié. Pour plus de détails sur les clés et les plages de valeurs possibles, voir Index en mémoire.
collection_name Le nom d'une collection existante.
index_params Un objet IndexParams contenant une liste d'objets IndexParam.
sync Contrôle la façon dont l'index est construit en fonction de la demande du client. Valeurs valides :
  • True (par défaut) : Le client attend que l'index soit entièrement construit avant de revenir. Cela signifie que vous n'obtiendrez pas de réponse tant que le processus ne sera pas terminé.
  • False: Le client retourne immédiatement après la réception de la demande et l'index est construit en arrière-plan. Pour savoir si la création de l'index est terminée, utilisez la méthode describe_index().
Paramètre Description
fieldName Le nom du champ cible auquel s'applique cet objet IndexParam.
indexName Le nom du fichier d'index généré après l'application de cet objet.
indexType Le nom de l'algorithme utilisé pour classer les données dans le champ spécifique. Pour les algorithmes applicables, voir Index en mémoire et Index sur disque.
metricType La métrique de distance à utiliser pour l'index. Les valeurs possibles sont IP, L2, COSINE, JACCARD, HAMMING.
extraParams Paramètres d'index supplémentaires. Pour plus de détails, voir Index en mémoire et Index sur disque.
Paramètre Paramètre Description
collection_name Nom d'une collection existante.
field_name Le nom du champ dans lequel créer un index.
index_type Le type d'index à créer.
metric_type Le type de métrique utilisé pour mesurer la distance vectorielle.
index_name Le nom de l'index à créer.
params Autres paramètres spécifiques à l'index.

notes

Actuellement, vous ne pouvez créer qu'un seul fichier d'index pour chaque champ d'une collection.

Vérifier les détails de l'index

Une fois que vous avez créé un index, vous pouvez en vérifier les détails.

Pour vérifier les détails de l'index, utilisez list_indexes() pour lister les noms d'index et describe_index() pour obtenir les détails de l'index.

Pour vérifier les détails de l'index, utilisez describeIndex() pour obtenir les détails de l'index.

Pour vérifier les détails de l'index, utilisez describeIndex() pour obtenir les détails de l'index.

# 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"
//   }
// ]
// 

Vous pouvez vérifier le fichier d'index créé sur un champ spécifique et collecter les statistiques sur le nombre de lignes indexées à l'aide de ce fichier d'index.

Supprimer un index

Vous pouvez simplement supprimer un index s'il n'est plus nécessaire.

Avant de supprimer un index, assurez-vous qu'il a été libéré.

Pour supprimer un index, utilisez drop_index().

Pour supprimer un index, utilisez dropIndex().

Pour supprimer un index, utilisez 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
// 

Traduit parDeepL

Try Managed Milvus for Free

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

Get Started
Feedback

Cette page a-t - elle été utile ?