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
| Domaine | Limite |
|---|---|
| Forme du schéma | Une 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-champs | Tous 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-champs | Une fois qu’un champ StructArray a été créé, vous ne pouvez plus y ajouter de sous-champs. |
| Chemin d’accès aux sous-champs | Utilisez 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 forme | Insé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 vectoriels | Un 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. |
| Fonctions | Les 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 null | Les 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 champ | L'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
| Limite | Dé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 Struct | Prise en charge | Remarques |
|---|---|---|
Array | Prise en charge | Définissez le sous-champ comme suit : ` DataType.BOOL`. |
Array | Prise en charge | Définissez le sous-champ comme suit : DataType.INT8, DataType.INT16, DataType.INT32 ou DataType.INT64. |
Array | Prise en charge | Définissez le sous-champ comme suit : DataType.FLOAT ou DataType.DOUBLE. |
Array | Prise en charge | Définissez le sous-champ comme suit : DataType.VARCHAR et définissez max_length. |
ArrayOfVector | Pris en charge | Définissez le sous-champ comme « DataType.FLOAT_VECTOR » et définissez « dim ». |
ArrayOfVector | Prise en charge | Définissez le sous-champ comme « DataType.FLOAT16_VECTOR » et configurez « dim ». |
ArrayOfVector | Prise en charge | Définissez le sous-champ comme « DataType.BFLOAT16_VECTOR » et configurez « dim ». |
ArrayOfVector | Prise en charge | Définissez le sous-champ comme suit : « DataType.INT8_VECTOR » et définissez « dim ». |
ArrayOfVector | Prise en charge | Définissez le sous-champ comme « DataType.BINARY_VECTOR » et configurez « dim ». |
ArrayOfVector | Non pris en charge | Les sous-champs de vecteurs clairsemés ne sont pas pris en charge dans les champs StructArray. |
Array | Non pris en charge | Utilisez « VARCHAR », et non « String ». |
Array | Non pris en charge | Les sous-champs JSON ne sont pas pris en charge dans les champs StructArray. |
Array | Non pris en charge | Les sous-champs de géométrie et les fonctions SIG ne sont pas pris en charge dans les champs StructArray. |
Array | Non pris en charge | Les sous-champs de type « Texte » ne sont pas pris en charge dans les champs StructArray. |
Array | Non pris en charge | Les sous-champs « Timestamptz » et les expressions spécifiques à l'heure ne sont pas pris en charge dans les champs StructArray. |
Array, ArrayOfVector, Struct ou ArrayOfStruct | Non pris en charge | Les 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 null | Pris 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 Python | Utilisez ` None ` pour insérer une valeur `StructArray` nulle en Python. N’utilisez pas ` Null ` ni ` null`. |
| Portée de la valeur nulle | La valeur nulle s'applique à l'ensemble du champ StructArray. Par exemple, chunks=None n'est valide que lorsque chunks est nul. |
| Valeur StructArray partiellement nulle | Lorsqu’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 StructArray | Pris en charge à partir de Milvus 3.0.0. |
| Exigence de nullabilité pour l’ajout dynamique | Un 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 dynamique | Les 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
| Limite | Détails |
|---|---|
| Forme de la charge utile | Insé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éma | Chaque é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 vectorielles | Les valeurs vectorielles doivent correspondre aux dim s configurées pour leurs sous-champs vectoriels. |
| Duplication en mode recherche | Si 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 recherche | Famille de métriques | Niveau de résultat |
|---|---|---|
| Recherche EmbeddingList | MAX_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éments | Mesures vectorielles classiques telles que L2, IP, COSINE, HAMMING ou JACCARD | Ré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 recherche | Prise en charge et limites |
|---|---|
| Recherche EmbeddingList de base | Prise 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éments | Prise 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 plage | Prise 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 regroupement | La 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 hybride | Une 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écalage | Les 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.
Pages associées
Pour créer un champ StructArray, consultez la section Créer un champ StructArray.
Pour insérer des données, consultez la section « Insérer des données dans des champs StructArray ».
Pour créer des index vectoriels et scalaires, consultez la rubrique « Indexer des champs StructArray ».
Pour revoir la syntaxe des filtres StructArray, consultez la section « Opérateurs StructArray ».