Triturazione JSON in Milvus: filtraggio JSON 88,9 volte più veloce e flessibile
I moderni sistemi di intelligenza artificiale producono più dati JSON semi-strutturati che mai. Le informazioni sui clienti e sui prodotti vengono compattate in un oggetto JSON, i microservizi emettono log JSON a ogni richiesta, i dispositivi IoT trasmettono le letture dei sensori in payload JSON leggeri e le applicazioni AI di oggi si standardizzano sempre più su JSON per l'output strutturato. Il risultato è una marea di dati di tipo JSON che confluiscono nei database vettoriali.
Tradizionalmente, esistono due modi per gestire i documenti JSON:
Predefinire ogni campo di JSON in uno schema fisso e costruire un indice: Questo approccio offre buone prestazioni di interrogazione, ma è rigido. Quando il formato dei dati cambia, ogni campo nuovo o modificato comporta un'altra serie di dolorosi aggiornamenti del Data Definition Language (DDL) e migrazioni dello schema.
Memorizzare l'intero oggetto JSON come una singola colonna (sia il tipo JSON che Dynamic Schema in Milvus utilizzano questo approccio): Questa opzione offre un'eccellente flessibilità, ma a scapito delle prestazioni delle query. Ogni richiesta richiede il parsing JSON in runtime e spesso una scansione completa della tabella, con conseguente latenza che aumenta con la crescita del set di dati.
Un tempo si trattava di un dilemma tra flessibilità e prestazioni.
Non più con la nuova funzione JSON Shredding di Milvus.
Con l'introduzione di JSON Shredding, Milvus raggiunge ora l'agilità senza schema con le prestazioni dell'archiviazione colonnare, rendendo finalmente i dati semi-strutturati su larga scala flessibili e facili da interrogare.
Come funziona la triturazione JSON
La triturazione JSON accelera le query JSON trasformando i documenti JSON basati su righe in archivi colonnari altamente ottimizzati. Milvus conserva la flessibilità di JSON per la modellazione dei dati e ottimizza automaticamente l'archiviazione colonnare, migliorando significativamente l'accesso ai dati e le prestazioni delle query.
Per gestire in modo efficiente campi JSON scarsi o rari, Milvus dispone anche di un indice invertito per le chiavi condivise. Tutto questo avviene in modo trasparente per gli utenti: è possibile inserire documenti JSON come di consueto, lasciando a Milvus il compito di gestire internamente la strategia di archiviazione e indicizzazione ottimale.
Quando Milvus riceve record JSON grezzi con forme e strutture diverse, analizza ogni chiave JSON per verificarne il rapporto di occorrenza e la stabilità del tipo (se il tipo di dati è coerente tra i documenti). In base a questa analisi, ogni chiave viene classificata in una delle tre categorie:
Chiavi digitate: Chiavi che appaiono nella maggior parte dei documenti e che hanno sempre lo stesso tipo di dati (ad esempio, tutti i numeri interi o tutte le stringhe).
Chiavi dinamiche: Chiavi che compaiono frequentemente ma con tipi di dati misti (ad esempio, a volte una stringa, a volte un numero intero).
Chiavi condivise: Chiavi poco frequenti, rade o annidate, al di sotto di una soglia di frequenza configurabile.
Milvus gestisce ogni categoria in modo diverso per massimizzare l'efficienza:
Lechiavi digitate sono memorizzate in colonne dedicate e fortemente tipizzate.
Lechiavi dinamiche sono collocate in colonne dinamiche in base al tipo di valore effettivo osservato in fase di esecuzione.
Sia le colonne tipizzate che quelle dinamiche sono memorizzate in formati colonnari Arrow/Parquet per una scansione rapida e un'esecuzione altamente ottimizzata delle query.
Lechiavi condivise sono consolidate in una colonna binary-JSON compatta, accompagnata da un indice invertito a chiave condivisa. Questo indice accelera le interrogazioni sui campi a bassa frequenza, eliminando precocemente le righe irrilevanti e limitando la ricerca ai soli documenti che contengono la chiave interrogata.
Questa combinazione di archiviazione colonnare adattiva e indicizzazione invertita costituisce il nucleo del meccanismo di triturazione JSON di Milvus, consentendo flessibilità e prestazioni elevate su scala.
Il flusso di lavoro complessivo è illustrato di seguito:
Dopo aver illustrato le basi del funzionamento di JSON Shredding, diamo un'occhiata più da vicino alle funzionalità chiave che rendono questo approccio flessibile e performante.
Sminuzzamento e Columnarizzazione
Quando viene scritto un nuovo documento JSON, Milvus lo scompone e lo riorganizza in una memoria colonnare ottimizzata:
Le chiavi digitate e dinamiche vengono identificate automaticamente e memorizzate in colonne dedicate.
Se il JSON contiene oggetti annidati, Milvus genera automaticamente nomi di colonne basati sul percorso. Ad esempio, un campo
nameall'interno di un oggettouserpuò essere memorizzato con il nome di colonna/user/name.Le chiavi condivise vengono memorizzate insieme in un'unica colonna JSON binaria e compatta. Poiché queste chiavi appaiono di rado, Milvus costruisce un indice inverso per esse, consentendo un filtraggio rapido e permettendo al sistema di individuare rapidamente le righe che contengono la chiave specificata.
Gestione intelligente delle colonne
Oltre alla triturazione di JSON in colonne, Milvus aggiunge un ulteriore livello di intelligenza attraverso la gestione dinamica delle colonne, assicurando che la triturazione di JSON rimanga flessibile con l'evoluzione dei dati.
Colonne create secondo le necessità: Quando nei documenti JSON in arrivo compaiono nuove chiavi, Milvus raggruppa automaticamente i valori con la stessa chiave in una colonna dedicata. In questo modo si conservano i vantaggi in termini di prestazioni dell'archiviazione colonnare senza richiedere agli utenti di progettare schemi a priori. Milvus deduce anche il tipo di dati dei nuovi campi (ad esempio, INTEGER, DOUBLE, VARCHAR) e seleziona per essi un formato colonnare efficiente.
Ogni chiave viene gestita automaticamente: Milvus analizza ed elabora ogni chiave del documento JSON. Ciò garantisce un'ampia copertura delle query senza costringere gli utenti a predefinire i campi o a creare indici in anticipo.
Ottimizzazione delle query
Una volta riorganizzati i dati nelle colonne giuste, Milvus seleziona il percorso di esecuzione più efficiente per ogni query:
Scansione diretta delle colonne per le chiavi digitate e dinamiche: Se una query si rivolge a un campo che è già stato suddiviso in una propria colonna, Milvus può eseguire una scansione diretta della colonna. Questo riduce la quantità totale di dati da elaborare e sfrutta il calcolo colonnare accelerato SIMD per un'esecuzione ancora più rapida.
Ricerca indicizzata per le chiavi condivise: Se la query coinvolge un campo che non è stato promosso in una propria colonna (tipicamente una chiave rara), Milvus la valuta rispetto alla colonna della chiave condivisa. L'indice invertito costruito su questa colonna consente a Milvus di identificare rapidamente le righe che contengono la chiave specificata e di saltare le altre, migliorando significativamente le prestazioni per i campi a bassa frequenza.
Gestione automatica dei metadati: Milvus mantiene costantemente i metadati e i dizionari globali in modo che le query rimangano accurate ed efficienti, anche quando la struttura dei documenti JSON in arrivo si evolve nel tempo.
Parametri di riferimento delle prestazioni
Abbiamo progettato un benchmark per confrontare le prestazioni delle query memorizzando l'intero documento JSON come un singolo campo grezzo rispetto all'utilizzo della nuova funzione JSON Shredding.
Ambiente e metodologia di test
Hardware: cluster da 1 core/8GB
Set di dati: 1 milione di documenti da JSONBench
Metodologia: Misurare QPS e latenza attraverso diversi modelli di query
Risultati: chiavi digitate
Questo test ha misurato le prestazioni quando si interroga una chiave presente nella maggior parte dei documenti.
| Espressione della query | QPS (senza triturazione) | QPS (con triturazione) | Aumento delle prestazioni |
|---|---|---|---|
| json['time_us'] > 0 | 8.69 | 287.5 | 33x |
| json['kind'] == 'commit' | 8.42 | 126.1 | 14.9x |
Risultati: chiavi condivise
Questo test si è concentrato sull'interrogazione di chiavi rade e annidate che rientrano nella categoria "condivisa".
| Espressione della query | QPS (senza triturazione) | QPS (con triturazione) | Incremento delle prestazioni |
|---|---|---|---|
| json['identity']['seq'] > 0 | 4.33 | 385 | 88.9x |
| json['identity']['did'] == 'xxxxx' | 7.6 | 352 | 46.3x |
Le query a chiave condivisa mostrano i miglioramenti più evidenti (fino a 89 volte più veloci), mentre le query a chiave digitata offrono una velocità costante di 15-30 volte. Nel complesso, ogni tipo di query trae vantaggio da JSON Shredding, con evidenti guadagni di prestazioni su tutta la linea.
Provatelo ora
Se lavorate con i log delle API, i dati dei sensori IoT o i payload delle applicazioni in rapida evoluzione, JSON Shredding vi offre la rara possibilità di avere sia flessibilità che prestazioni elevate.
La funzione è ora disponibile e potete provarla subito. Per ulteriori dettagli è possibile consultare questo documento.
Avete domande o volete un approfondimento su una qualsiasi funzione dell'ultima versione di Milvus? Unitevi al nostro canale Discord o inviate problemi su GitHub. Potete anche prenotare una sessione individuale di 20 minuti per ottenere approfondimenti, indicazioni e risposte alle vostre domande tramite 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



