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)
}