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 |
---|---|
|
|
Types de métriques | Types d'indices |
---|---|
|
|
Types métriques | Types d'indices |
---|---|
IP |
|
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 :
|
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
//