Déchiquetage JSON dans Milvus : filtrage JSON 88,9 fois plus rapide et flexible
Les systèmes d'IA modernes produisent plus de données JSON semi-structurées que jamais. Les informations sur les clients et les produits sont comprimées dans un objet JSON, les microservices émettent des journaux JSON à chaque requête, les appareils IoT diffusent les relevés des capteurs dans des charges utiles JSON légères, et les applications d'IA d'aujourd'hui normalisent de plus en plus JSON pour les sorties structurées. Il en résulte un flot de données de type JSON qui se déversent dans les bases de données vectorielles.
Traditionnellement, il existe deux façons de traiter les documents JSON :
prédéfinir chaque champ JSON dans un schéma fixe et construire un index : Cette approche offre de bonnes performances d'interrogation, mais elle est rigide. Dès que le format des données change, chaque champ nouveau ou modifié déclenche une nouvelle série de mises à jour DDL (Data Definition Language) et de migrations de schéma pénibles.
Stocker l'intégralité de l'objet JSON en tant que colonne unique (le type JSON et le schéma dynamique dans Milvus utilisent tous deux cette approche) : Cette option offre une excellente flexibilité, mais au détriment des performances des requêtes. Chaque requête nécessite une analyse JSON au moment de l'exécution et souvent un balayage complet de la table, ce qui entraîne une latence qui augmente au fur et à mesure que l'ensemble de données s'accroît.
Il s'agissait auparavant d'un dilemme entre flexibilité et performance.
Ce n'est plus le cas avec la nouvelle fonctionnalité JSON Shredding de Milvus.
Avec l'introduction de JSON Shredding, Milvus permet désormais une agilité sans schéma avec les performances du stockage en colonnes, rendant enfin les données semi-structurées à grande échelle à la fois flexibles et conviviales pour les requêtes.
Fonctionnement du déchiquetage JSON
Le déchiquetage JSON accélère les requêtes JSON en transformant les documents JSON basés sur des lignes en un stockage en colonnes hautement optimisé. Milvus préserve la flexibilité de JSON pour la modélisation des données tout en optimisant automatiquement le stockage en colonnes, ce qui améliore considérablement l'accès aux données et les performances des requêtes.
Pour traiter efficacement les champs JSON rares ou épars, Milvus dispose également d'un index inversé pour les clés partagées. Tout cela se passe de manière transparente pour les utilisateurs : vous pouvez insérer des documents JSON comme d'habitude et laisser Milvus gérer la stratégie de stockage et d'indexation optimale en interne.
Lorsque Milvus reçoit des enregistrements JSON bruts dont la forme et la structure varient, il analyse chaque clé JSON en fonction de son taux d'occurrence et de la stabilité de son type (si son type de données est cohérent d'un document à l'autre). Sur la base de cette analyse, chaque clé est classée dans l'une des trois catégories suivantes :
Les clés typées : Les clés qui apparaissent dans la plupart des documents et qui ont toujours le même type de données (par exemple, tous les entiers ou toutes les chaînes).
Clés dynamiques: Les clés qui apparaissent fréquemment mais dont les types de données sont mixtes (par exemple, parfois une chaîne de caractères, parfois un nombre entier).
Clés partagées : Clés peu fréquentes, éparses ou imbriquées, dont la fréquence est inférieure à un seuil configurable.
Milvus traite chaque catégorie différemment pour maximiser l'efficacité :
Lesclés typées sont stockées dans des colonnes dédiées et fortement typées.
Lesclés dynamiques sont placées dans des colonnes dynamiques en fonction du type de valeur réel observé lors de l'exécution.
Les colonnes typées et dynamiques sont stockées dans des formats de colonnes Arrow/Parquet pour un balayage rapide et une exécution des requêtes hautement optimisée.
Lesclés partagées sont consolidées dans une colonne binaire-JSON compacte, accompagnée d'un index inversé des clés partagées. Cet index accélère les requêtes sur les champs à faible fréquence en éliminant rapidement les lignes non pertinentes et en limitant la recherche aux seuls documents qui contiennent la clé demandée.
Cette combinaison de stockage en colonnes adaptatif et d'indexation inversée constitue le cœur du mécanisme de déchiquetage JSON de Milvus, permettant à la fois une flexibilité et des performances élevées à l'échelle.
Le flux de travail global est illustré ci-dessous :
Maintenant que nous avons couvert les bases du fonctionnement du déchiquetage JSON, examinons de plus près les capacités clés qui rendent cette approche à la fois flexible et très performante.
Déchiquetage et mise en colonnes
Lorsqu'un nouveau document JSON est écrit, Milvus le décompose et le réorganise en un stockage en colonnes optimisé :
Les clés typées et dynamiques sont automatiquement identifiées et stockées dans des colonnes dédiées.
Si le JSON contient des objets imbriqués, Milvus génère automatiquement des noms de colonnes basés sur le chemin. Par exemple, un champ
nameà l'intérieur d'un objetuserpeut être stocké avec le nom de colonne/user/name.Les clés partagées sont stockées ensemble dans une seule colonne JSON binaire compacte. Comme ces clés apparaissent rarement, Milvus construit un index inversé pour elles, ce qui permet un filtrage rapide et permet au système de localiser rapidement les lignes qui contiennent la clé spécifiée.
Gestion intelligente des colonnes
Outre le déchiquetage JSON en colonnes, Milvus ajoute une couche d'intelligence supplémentaire par le biais de la gestion dynamique des colonnes, ce qui garantit que le déchiquetage JSON reste flexible au fur et à mesure de l'évolution des données.
Colonnes créées en fonction des besoins : Lorsque de nouvelles clés apparaissent dans les documents JSON entrants, Milvus regroupe automatiquement les valeurs ayant la même clé dans une colonne dédiée. Cela permet de préserver les avantages en termes de performances du stockage en colonnes sans exiger des utilisateurs qu'ils conçoivent des schémas en amont. Milvus déduit également le type de données des nouveaux champs (par exemple, INTEGER, DOUBLE, VARCHAR) et sélectionne un format en colonnes efficace pour eux.
Chaque clé est traitée automatiquement : Milvus analyse et traite chaque clé du document JSON. Cela garantit une large couverture des requêtes sans obliger les utilisateurs à prédéfinir des champs ou à construire des index à l'avance.
Optimisation des requêtes
Une fois les données réorganisées dans les bonnes colonnes, Milvus sélectionne le chemin d'exécution le plus efficace pour chaque requête :
Analyses directes des colonnes pour les clés typées et dynamiques : Si une requête cible un champ qui a déjà été divisé en sa propre colonne, Milvus peut analyser cette colonne directement. Cela permet de réduire la quantité totale de données à traiter et de tirer parti du calcul en colonnes accéléré par SIMD pour une exécution encore plus rapide.
Recherche indexée pour les clés partagées : Si la requête implique un champ qui n'a pas été promu dans sa propre colonne (généralement une clé rare), Milvus l'évalue par rapport à la colonne des clés partagées. L'index inversé construit sur cette colonne permet à Milvus d'identifier rapidement les lignes qui contiennent la clé spécifiée et de sauter les autres, ce qui améliore considérablement les performances pour les champs à faible fréquence.
Gestion automatique des métadonnées : Milvus maintient en permanence les métadonnées et les dictionnaires globaux afin que les requêtes restent précises et efficaces, même si la structure des documents JSON entrants évolue au fil du temps.
Critères de performance
Nous avons conçu un benchmark pour comparer les performances de requête du stockage de l'intégralité du document JSON en tant que champ brut unique par rapport à l'utilisation de la nouvelle fonctionnalité de déchiquetage JSON.
Environnement de test et méthodologie
Matériel : cluster 1 core/8GB
Jeu de données : 1 million de documents provenant de JSONBench
Méthodologie : Mesure du QPS et de la latence pour différents types de requêtes
Résultats : clés typées
Ce test a mesuré les performances lors de l'interrogation d'une clé présente dans la plupart des documents.
| Expression de la requête | QPS (sans déchiquetage) | QPS (avec déchiquetage) | Amélioration des performances |
|---|---|---|---|
| json['time_us'] > 0 | 8.69 | 287.5 | 33x |
| json['kind'] == 'commit' | 8.42 | 126.1 | 14.9x |
Résultats : clés partagées
Ce test s'est concentré sur l'interrogation de clés peu nombreuses et imbriquées qui tombent dans la catégorie "partagée".
| Expression de la requête | QPS (sans déchiquetage) | QPS (avec déchiquetage) | Amélioration des performances |
|---|---|---|---|
| json['identity']['seq'] > 0 | 4.33 | 385 | 88.9x |
| json['identity']['did'] == 'xxxxx' | 7.6 | 352 | 46.3x |
Les requêtes à clé partagée présentent les améliorations les plus spectaculaires (jusqu'à 89× plus rapides), tandis que les requêtes à clé typée offrent des accélérations constantes de 15 à 30×. Dans l'ensemble, chaque type de requête bénéficie de JSON Shredding, avec des gains de performance évidents.
Essayez-le maintenant
Que vous travailliez avec des logs d'API, des données de capteurs IoT ou des charges utiles d'application en évolution rapide, JSON Shredding vous offre la rare possibilité de bénéficier à la fois d'une flexibilité et de performances élevées.
La fonctionnalité est maintenant disponible et nous vous invitons à l'essayer dès maintenant. Vous pouvez également consulter cette documentation pour plus de détails.
Vous avez des questions ou souhaitez approfondir une fonctionnalité de la dernière version de Milvus ? Rejoignez notre canal Discord ou déposez des questions sur GitHub. Vous pouvez également réserver une session individuelle de 20 minutes pour obtenir des informations, des conseils et des réponses à vos questions dans le cadre des Milvus Office Hours.
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word



