Insertion des Entités

Ce section décrit comment insérer des données dans Milvus côté client.

Vous pouvez également utiliser MilvusDM pour migrer des données vers Milvus. MilvusDM est un outil open source spécialement conçu pour l'importation et l'exportation de données Milvus.

Milvus 2.1 prend en charge le type de données VARCHAR sur 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 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 du monde réel utilisent souvent des vecteurs de dimension plus élevée que dans l'exemple. Vous pouvez préparer vos propres données pour remplacer les données d'exemple.

Préparation des 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 lèvera 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, voir la création d'une collection.

Après avoir activé le schéma dynamique, vous pouvez ajouter des champs dynamiques aux données. Pour des informations détaillées, voir Schéma Dynamique.

import random
data = [
  [i for i in range(2000)],
  [str(i) for i in range(2000)],
  [i for i in range(10000, 12000)],
  [[random.random() for _ in range(2)] for _ in range(2000)],
  [],
  None,
]

data.append([str("dy"*i) for i in range(2000)])

Insertion de Données dans Milvus

Insérez les données dans la collection.

En spécifiant partition_name, vous pouvez choisir dans quelle partition insérer les données.

from pymilvus import Collection
collection = Collection("book")      # Obtenir une collection existante.
mr = collection.insert(data)
Paramètre Description
data Les données à insérer dans Milvus.
partition_name (optionnel) Le nom de la partition dans laquelle les données seront insérées.

Après avoir inséré des entités dans une collection précédemment indexée, il n'est pas nécessaire de ré-indexer la collection, car Milvus créera automatiquement des index pour les données nouvellement insérées. Pour plus d'informations, voir Est-il Possible de Créer des Index Après l'Insertion de Vecteurs?

Actualisation des 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 utiliseront une recherche par force brute. Pour éviter cette situation, il est préférable d'appeler flush() pour toute donnée restante. L'appel à flush() scellera tout segment restant et l'enverra à l'index. Il est important d'appeler cette méthode uniquement à la fin d'une session d'insertion. L'appeler trop fréquemment peut entraîner des données fragmentées qui devront être nettoyées ultérieurement.

Limitations

Caractéristique Limite Maximale
Dimension du vecteur 32 768

Entité Upsert

La mise à jour upsert est une combinaison d'opérations d'insertion et de suppression. Dans le contexte de la base de données vectorielle Milvus, la mise à jour est une opération au niveau des données. Elle écrase l'entité existante si le champ spécifié existe dans la collection, et insère une nouvelle entité si la valeur spécifiée n'existe pas.

L'exemple suivant met à jour 3 000 lignes de données générées aléatoirement en tant que données d'exemple. Lors de l'opération de mise à jour, il est important de noter que cette opération peut affecter les performances car elle implique la suppression de 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 lèvera 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, veuillez vous référer à la création de collections.

import random
nb = 3000
dim = 8
vectors = [[random.random() for _ in range(dim)] for _ in range(nb)]
data = [
    [i for i in range(nb)],
    [str(i) for i in range(nb)],
    [i for i in range(10000, 10000+nb)],
    vectors,
    [str("dy"*i) for i in range(nb)]
]

Mise à Jour des Données

Mettez à jour les données de la collection.

from pymilvus import Collection
collection = Collection("book")  # Obtenir la collection existante.
mr = collection.upsert(data)

Supprimer une Entité

Milvus prend en charge la suppression d'entités à l'aide d'expressions booléennes via les clés primaires.

Préparer une expression booléenne

Préparez une expression booléenne pour filtrer les entités à supprimer.

Milvus ne prend en charge que la suppression d'entités avec des clés primaires explicitement spécifiées, ce qui peut être réalisé en utilisant l'opérateur "in". D'autres opérateurs ne peuvent être utilisés que dans le filtrage scalaire pour la recherche de requêtes ou de vecteurs.

L'exemple suivant filtre les données en utilisant les valeurs de clé primaire 0 et 1.

expr = "book_id in [0,1]"

Similaire à la clause WHERE SQL

Supprimer une entité

Utilisez l'expression booléenne que vous avez créée pour supprimer des entités. Milvus renverra la liste des ID des entités qui ont été supprimées.

from pymilvus import Collection
collection = Collection("book")      # Obtenir la collection existante.
collection.delete(expr)

Compacter les données

Milvus prend en charge la compression automatique des données par défaut. Vous pouvez configurer Milvus pour activer ou désactiver la compression automatique.

Si la compression automatique est désactivée, vous pouvez toujours compresser manuellement les données.

Compresser manuellement les données

Étant donné que la compression prend généralement beaucoup de temps, les demandes de compression sont traitées de manière asynchrone.

from pymilvus import Collection
collection = Collection("book")      # Obtenir la collection existante.
collection.compact()

Vérifier l'état de compression

Vous pouvez utiliser l'ID de compression retourné lors du déclenchement de la compression manuelle pour vérifier l'état de compression.

collection.get_compaction_state()