Insertion d'entités
Ce sujet décrit comment insérer des données dans Milvus depuis le côté client.
Vous pouvez également utiliser MilvusDM pour migrer des données vers Milvus. MilvusDM est un outil open source spécifiquement conçu pour l'importation et l'exportation de données avec Milvus.
Milvus 2.1 prend en charge le type de données VARCHAR
pour les champs scalaires. Lors de la création d'un index pour un champ scalaire de type VARCHAR, le type d'index par défaut est un arbre trie.
L'exemple suivant insère 2 000 lignes de données générées aléatoirement en tant que données d'exemple (l'exemple de la CLI Milvus utilise un fichier CSV distant pré-construit contenant des données similaires). Les applications réelles peuvent utiliser des vecteurs de plus haute dimension que l'exemple. Vous pouvez préparer vos propres données pour remplacer l'exemple.
Préparer les données
Tout d'abord, préparez les données à insérer. Le type de données à insérer doit correspondre au schéma de la collection, sinon Milvus générera une exception.
Milvus prend en charge les valeurs par défaut pour les champs scalaires, à l'exception des champs de clé primaire. Cela signifie que lors de l'insertion ou de la mise à jour des données, certains champs peuvent être laissés vides. Pour plus d'informations, consultez la création d'une collection.
Après avoir activé le schéma dynamique, vous pouvez ajouter des champs dynamiques aux données. Pour plus d'informations, consultez le schéma dynamique.
bookIDs := make([]int64, 0, 2000)
wordCounts := make([]int64, 0, 2000)
bookIntros := make([][]float32, 0, 2000)
for i := 0; i < 2000; i++ {
bookIDs = append(bookIDs, int64(i))
wordCounts = append(wordCounts, int64(i+10000))
v := make([]float32, 0, 2)
for j := 0; j < 2; j++ {
v = append(v, rand.Float32())
}
bookIntros = append(bookIntros, v)
}
idColumn := entity.NewColumnInt64("book_id", bookIDs)
wordColumn := entity.NewColumnInt64("word_count", wordCounts)
introColumn := entity.NewColumnFloatVector("book_intro", 2, bookIntros)
Insérer des données dans Milvus
Insérez les données dans une collection.
En spécifiant le partition_name
, vous pouvez choisir dans quelle partition insérer les données.
_, err = milvusClient.Insert(
context.Background(), // ctx
"book", // CollectionName
"", // partitionName
idColumn, // columnarData
wordColumn, // columnarData
introColumn, // columnarData
)
if err != nil {
log.Fatal("failed to insert data:", err.Error())
}
Paramètre | Description |
---|---|
ctx |
Contexte utilisé pour contrôler le processus d'appel API. |
CollectionName |
Nom de la collection dans laquelle insérer des données. |
partitionName |
Nom de la partition dans laquelle insérer les données. Si laissé vide, les données seront insérées dans la partition par défaut. |
columnarData |
Données à insérer dans chaque champ. |
Après avoir inséré des entités dans une collection déjà indexée, vous n'avez pas besoin de réindexer la collection car Milvus créera automatiquement un index pour les données nouvellement insérées.
Rafraîchir les données dans Milvus
Lorsque des données sont insérées dans Milvus, elles sont insérées dans des segments. Les segments doivent atteindre une certaine taille pour être scellés et indexés. Les segments non scellés seront interrogés par une recherche par force brute. Pour éviter cette situation, il est préférable d'appeler flush()
. La méthode flush()
scelle tous les segments restants et les envoie à l'index. Il est très important d'appeler cette méthode uniquement lorsque la session d'insertion se termine. Appeler trop fréquemment cette méthode peut entraîner des données fragmentées, qui devront être nettoyées ultérieurement.
Limitations
Fonctionnalité | Limite maximale |
---|---|
Dimension du vecteur | 32 768 |
Mise à jour des données
Préparation des données
Tout d'abord, préparez les données à mettre à jour. Le type de données à mettre à jour doit correspondre au schéma de la collection, sinon Milvus lancera une exception.
Milvus prend en charge les valeurs par défaut pour les champs scalaires, à l'exception des champs de clé primaire. Cela signifie que lors du processus d'insertion ou de mise à jour des données, certains champs peuvent rester vides. Pour plus d'informations, veuillez vous référer à la création de la collection.
nEntities := 3000
dim := 8
idList := make([]int64, 0, nEntities)
randomList := make([]float64, 0, nEntities)
embeddingList := make([][]float32, 0, nEntities)
for i := 0; i < nEntities; i++ {
idList = append(idList, int64(i))
}
for i := 0; i < nEntities; i++ {
randomList = append(randomList, rand.Float64())
}
for i := 0; i < nEntities; i++ {
vec := make([]float32, 0, dim)
for j := 0; j < dim; j++ {
vec = append(vec, rand.Float32())
}
embeddingList = append(embeddingList, vec)
}
idColData := entity.NewColumnInt64("ID", idList)
randomColData := entity.NewColumnDouble("random", randomList)
embeddingColData := entity.NewColumnFloatVector("embeddings", dim, embeddingList)
Mise à jour des données
Mettez à jour les données dans la collection.
if _, err := c.Upsert(ctx, collectionName, "", idColData, embeddingColData);
err != nil {
log.Fatalf("échec de la mise à jour des données, err: %v", err)
}