Limites de StructArray

La prise en charge de StructArray couvre la définition du schéma, l’insertion de charges utiles, l’indexation, les modes de recherche et les filtres spécifiques à StructArray. Utilisez cette page comme référence en matière de limites avant de vous fier au comportement de StructArray en production.

La plupart des limites de StructArray proviennent de l’une des trois sources suivantes : le modèle de schéma StructArray, le mode de recherche que vous choisissez pour les sous-champs vectoriels et la version de Milvus sur laquelle s’exécute votre collection.

Aperçu des limites

DomaineLimite
Forme du schémaUne structure (Struct) ne peut être utilisée que comme type d’élément d’un champ de type tableau (Array). La structure (Struct) n’est pas prise en charge en tant que champ de collection de niveau supérieur.
Schéma des sous-champsTous les éléments Struct d’un même champ StructArray partagent un schéma Struct prédéfini.
La capacitémax_capacity est obligatoire et limite le nombre d'éléments Struct qu'une entité peut stocker dans le champ StructArray.
Modifications des sous-champsUne fois qu’un champ StructArray a été créé, vous ne pouvez plus y ajouter de sous-champs.
Chemin d’accès aux sous-champsUtilisez des chemins de type structArray[subfield], tels que chunks[emb], pour les index, les cibles de recherche, les champs de sortie et les filtres. N’utilisez pas chunks.emb.
Insertion de formeInsérez un champ StructArray sous la forme d’un tableau d’objets. N’utilisez pas la syntaxe de chemin d’accès à l’intérieur des charges utiles d’insertion.
Index vectorielsUn champ vecteur ou un sous-champ vecteur n'accepte qu'un seul index. Utilisez des sous-champs vecteurs distincts pour la recherche EmbeddingList et la recherche au niveau des éléments.
FonctionsLes fonctions de champ ne sont pas prises en charge pour les champs ou sous-champs situés à l'intérieur d'un champ StructArray.
Champs pouvant prendre la valeur nullLes champs StructArray pouvant prendre la valeur null sont soumis à des restrictions de version. Lorsqu'ils sont pris en charge, la valeur null s'applique à l'ensemble du champ StructArray, et non à chaque élément Struct individuellement.
Ajout dynamique d’un champL'ajout d'un champ StructArray à une collection existante dépend de la version et nécessite que le champ ajouté soit nullable.

Limites du schéma

LimiteDétails
Struct n'est pas un type de champ de niveau supérieur.Créez un champ StructArray en tant qu datatype=DataType.ARRAY, avec element_type=DataType.STRUCT et un struct_schema.
Tous les éléments partagent un même schéma.Chaque élément Struct d’un champ StructArray respecte la même liste de sous-champs et les mêmes types de données de sous-champs.
max_capacity est obligatoire.Le nombre d’éléments Struct dans une entité ne doit pas dépasser l’ max_capacity configurée pour le champ StructArray.
Les sous-champs existants sont fixes.Vous ne pouvez pas ajouter de nouveaux sous-champs à un champ StructArray existant. Pour modifier le schéma des sous-champs, supprimez le champ StructArray, puis ajoutez-le à nouveau avec le schéma mis à jour.
Les StructArray imbriqués ne sont pas pris en charge.Un champ StructArray ne peut pas contenir de sous-champs imbriqués de type Array, ArrayOfVector, Struct ou ArrayOfStruct.
Les fonctions ne sont pas prises en charge à l’intérieur d’un StructArray.Ne définissez pas de fonctions de champ pour les champs StructArray ni pour leurs sous-champs.

Pour des exemples de création de schéma, voir Créer un champ StructArray.

Types de données pris en charge pour les sous-champs

Les sous-champs StructArray sont mappés à un stockage physique de type tableau. Le tableau suivant répertorie les types physiques pris en charge et non pris en charge.

Type physique du sous-champ StructPrise en chargeRemarques
ArrayPrise en chargeDéfinissez le sous-champ comme suit : ` DataType.BOOL`.
ArrayPrise en chargeDéfinissez le sous-champ comme suit : DataType.INT8, DataType.INT16, DataType.INT32 ou DataType.INT64.
ArrayPrise en chargeDéfinissez le sous-champ comme suit : DataType.FLOAT ou DataType.DOUBLE.
ArrayPrise en chargeDéfinissez le sous-champ comme suit : DataType.VARCHAR et définissez max_length.
ArrayOfVectorPris en chargeDéfinissez le sous-champ comme « DataType.FLOAT_VECTOR » et définissez « dim ».
ArrayOfVectorPrise en chargeDéfinissez le sous-champ comme « DataType.FLOAT16_VECTOR » et configurez « dim ».
ArrayOfVectorPrise en chargeDéfinissez le sous-champ comme « DataType.BFLOAT16_VECTOR » et configurez « dim ».
ArrayOfVectorPrise en chargeDéfinissez le sous-champ comme suit : « DataType.INT8_VECTOR » et définissez « dim ».
ArrayOfVectorPrise en chargeDéfinissez le sous-champ comme « DataType.BINARY_VECTOR » et configurez « dim ».
ArrayOfVectorNon pris en chargeLes sous-champs de vecteurs clairsemés ne sont pas pris en charge dans les champs StructArray.
ArrayNon pris en chargeUtilisez « VARCHAR », et non « String ».
ArrayNon pris en chargeLes sous-champs JSON ne sont pas pris en charge dans les champs StructArray.
ArrayNon pris en chargeLes sous-champs de géométrie et les fonctions SIG ne sont pas pris en charge dans les champs StructArray.
ArrayNon pris en chargeLes sous-champs de type « Texte » ne sont pas pris en charge dans les champs StructArray.
ArrayNon pris en chargeLes sous-champs « Timestamptz » et les expressions spécifiques à l'heure ne sont pas pris en charge dans les champs StructArray.
Array, ArrayOfVector, Struct ou ArrayOfStructNon pris en chargeLes champs StructArray ne prennent pas en charge les sous-champs imbriqués de type tableau, tableau vectoriel, Struct ou tableau de Struct.

Limites relatives aux schémas nullables et dynamiques

Le comportement des StructArray pouvant contenir des valeurs nulles et l'ajout dynamique de champs StructArray dépendent de la version.

FonctionnalitéLimite
Champ StructArray pouvant prendre la valeur nullPris en charge à partir de Milvus 3.0.0. Définissez l'nullable=True e sur le StructArray parent ; ne configurez pas les sous-champs Struct comme pouvant être nuls de manière indépendante.
Valeur nulle en PythonUtilisez ` None ` pour insérer une valeur `StructArray` nulle en Python. N’utilisez pas ` Null ` ni ` null`.
Portée de la valeur nulleLa valeur nulle s'applique à l'ensemble du champ StructArray. Par exemple, chunks=None n'est valide que lorsque chunks est nul.
Valeur StructArray partiellement nulleLorsqu’un champ StructArray contient une valeur de tableau valide, ne mélangez pas de tableaux de sous-champs null avec des tableaux de sous-champs valides au sein d’une même valeur.
Ajout dynamique d’un champ StructArrayPris en charge à partir de Milvus 3.0.0.
Exigence de nullabilité pour l’ajout dynamiqueUn champ StructArray ajouté à une collection existante doit être non nul, car les entités existantes n’ont pas de valeur pour ce nouveau champ.
Entités existantes après un ajout dynamiqueLes entités existantes renvoient la valeur « null » pour le champ StructArray ajouté.

Milvus 3.0.0 et les versions ultérieures prennent en charge les champs StructArray pouvant être nuls, les tableaux vectoriels pouvant être nuls et l’ajout dynamique de champs StructArray dans les déploiements autonomes et distribués. Les versions antérieures de Milvus ne prennent pas en charge ces fonctionnalités.

Dans Zilliz Cloud, ces fonctionnalités sont disponibles sur les clusters à la demande exécutant Milvus 3.0.0 ou une version ultérieure. Les clusters de service ne les prennent pas en charge.

Pour des exemples d’insertion avec des champs StructArray pouvant prendre la valeur null, consultez la section « Insérer des données dans des champs StructArray ».

Limites d’insertion

LimiteDétails
Forme de la charge utileInsérez le champ StructArray sous la forme d’un tableau d’objets Struct, par exemple chunks: [{"text": "...", "emb": [...]}].
Noms des sous-champsÀ l’intérieur de chaque objet Struct, utilisez des noms de sous-champs tels que text et emb, et non des chemins d’accès tels que chunks[text].
Conformité au schémaChaque élément Struct doit respecter le schéma Struct.
CapacitéLe nombre d’éléments Struct dans une entité ne doit pas dépasser max_capacity.
Dimensions vectoriellesLes valeurs vectorielles doivent correspondre aux dim s configurées pour leurs sous-champs vectoriels.
Duplication en mode rechercheSi vous avez besoin à la fois de la recherche EmbeddingList et de la recherche au niveau des éléments, enregistrez les vecteurs dans deux sous-champs vectoriels distincts.

Limites d’index et de métriques

Un sous-champ vectoriel StructArray peut être indexé soit pour la recherche EmbeddingList, soit pour la recherche au niveau des éléments. Un même sous-champ vectoriel ne peut pas utiliser les deux familles de métriques, car chaque champ vectoriel ou sous-champ vectoriel n’accepte qu’un seul index.

Mode de rechercheFamille de métriquesNiveau de résultat
Recherche EmbeddingListMAX_SIM, MAX_SIM_COSINE, MAX_SIM_IP, MAX_SIM_L2, ou métriques binaires MAX_SIM_* Résultats au niveau de l’entité.
Recherche au niveau des élémentsMesures vectorielles classiques telles que L2, IP, COSINE, HAMMING ou JACCARDRésultats au niveau des éléments pouvant inclure l'offset de l'élément correspondant.

Utilisez des sous-champs vectoriels distincts lorsque les deux modes sont requis. Par exemple, utilisez chunks[emb_list_vector] pour la recherche EmbeddingList et chunks[emb] pour la recherche au niveau des éléments.

Les sous-champs vectoriels StructArray comptent comme des sous-champs vectoriels lorsque vous planifiez votre schéma de collection. Veillez à ce que le nombre total de champs vectoriels et de sous-champs vectoriels reste dans les limites de votre version cible et de votre niveau de service.

Pour connaître la matrice des types d’index et des types de métriques pris en charge, consultez la section Champs StructArray d’index.

Limites de recherche

Comportement de recherchePrise en charge et limites
Recherche EmbeddingList de basePrise en charge sur les sous-champs vectoriels StructArray indexés à l’aide de métriques de type « MAX_SIM* ». Renvoie des résultats au niveau des entités.
Recherche de base au niveau des élémentsPrise en charge sur les sous-champs vectoriels StructArray indexés à l'aide de métriques vectorielles standard. Peut renvoyer les décalages des éléments correspondants.
Recherche par plagePrise en charge en fonction du mode de recherche et de la prise en charge des index/métriques de la version cible. Pour connaître le comportement de la recherche par plage dans le cadre de requêtes StructArray au niveau des éléments, vérifiez votre version cible.
Recherche par regroupementLa recherche par regroupement au niveau des éléments peut renvoyer des indices de position. Le comportement de la recherche hybride par regroupement pour les requêtes StructArray au niveau des éléments dépend de la version.
Recherche hybrideUne requête de recherche hybride ne peut inclure des requêtes de sous-champs vectoriels StructArray que si la version cible prend en charge cette combinaison de recherche. Chaque requête suit toujours la famille de métriques du sous-champ vectoriel indexé.
Sortie de décalageLes décalages sont disponibles pour les résultats de recherche au niveau des éléments. La recherche EmbeddingList renvoie des résultats au niveau des entités et n’utilise pas les décalages d’éléments comme unité de résultat principale.

Limites des filtres et des opérateurs

Le filtrage scalaire StructArray est géré par des opérateurs StructArray, tels que « element_filter » et la famille « MATCH_* ». La matrice détaillée de prise en charge des prédicats se trouve dans la section « Opérateurs StructArray ».

En résumé :

  • Utilisez « $[subfield] » uniquement à l’intérieur des opérateurs StructArray.

  • Utilisez des sous-champs scalaires pour les prédicats scalaires.

  • N’utilisez pas de sous-champs vectoriels comme entrées de prédicats scalaires « $[...] ».

  • La syntaxe JSON Path, les fonctions JSON, les fonctions de conteneurs de tableaux, les fonctions de correspondance de texte, les fonctions de géométrie/SIG et les expressions Timestamptz ne sont pas prises en charge pour les prédicats au niveau des éléments de StructArray.

  • Privilégiez les comparaisons booléennes explicites telles que « $[has_code] == true » plutôt que les expressions booléennes nues.

  1. Pour créer un champ StructArray, consultez la section Créer un champ StructArray.

  2. Pour insérer des données, consultez la section « Insérer des données dans des champs StructArray ».

  3. Pour créer des index vectoriels et scalaires, consultez la rubrique « Indexer des champs StructArray ».

  4. Pour revoir la syntaxe des filtres StructArray, consultez la section « Opérateurs StructArray ».