Filtraggio dei metadati Milvus: filtraggio JSON e dei metadati in Milvus
JSON, o JavaScript Object Notation, è un formato di dati flessibile per l’archiviazione e la trasmissione. Utilizza coppie chiave-valore in modo adattivo, rendendolo perfetto per database NoSQL e risultati API. Grazie alla sua flessibilità, è un formato di dati molto diffuso. I parametri di ricerca sono fondamentali per definire le specifiche di ogni richiesta di ricerca, come i campi vettoriali utilizzati, i vettori di query e i limiti sul numero di risultati restituiti.
Molte demo di Milvus iniziano con dati di testo grezzi, come file di tipo .txt, .pdf o .csv. Ma sapevi che puoi caricare e lavorare con JSON grezzo con Milvus? Consulta questa pagina della documentazione JSON per maggiori dettagli.
Milvus Client è un wrapper attorno all’oggetto collection di Milvus che utilizza un formato JSON flessibile “key”:value per consentire definizioni di dati senza schema. Consulta la documentazione di Milvus Client per maggiori informazioni.
Milvus Client senza schema e il free tier cloud di Zilliz sono un ottimo modo per usare Milvus rapidamente! Milvus Client è quasi veloce quanto definire in anticipo uno schema completo, ma con una programmazione meno soggetta a errori. Rispetto a “enable_dynamic_field”, Milvus Client è molto più veloce, offrendo un approccio più fluido all’uso di una minore definizione dello schema iniziale. Lo schema senza schema è:
- id (str): Nome del campo chiave primaria.
- vector (str): Nome del campo vettoriale.
Tutto qui! Il resto dei campi può essere determinato in modo flessibile quando i dati vengono inseriti in Milvus.
Per rendere tutto questo più concreto, passiamo ad alcuni esempi di codice su come usare Milvus Client. Il codice completo si trova nel mio repo github Bootcamp.
Esempio di codice - caricare dati JSON grezzi direttamente in Milvus
I dati grezzi stessi potrebbero essere in formato JSON. Questo è utile, ad esempio, se i tuoi dati provengono da un database NoSQL come MongoDB. Di seguito i dati JSON utilizzati sono la classificazione dei generi dei film IMDB da Kaggle
# !pip install numpy pandas json pprint pymilvus torch sentence-transformers
# Import common libraries.
import pandas as pd
import json
# Read JSON data.
df = pd.read_json('data/tiny_parsed_data.json')
# Concatenate Title and Description into 'text' column.
df['text'] = df['title'] + ' ' + df['description']
display(df.head(2))
Avvia un server di prova gratuito Zilliz cloud. Puoi avere fino a 2 collection, ciascuna fino a 1 milione di vettori, in una prova gratuita alla volta. Il codice in questo notebook usa fully-man
- Scegli l’opzione predefinita "Starter" quando esegui il provisioning > Create collection > Assegnale un nome > Create cluster and collection.
- Nella pagina principale del Cluster, copia la tua
API Keye salvala localmente in una variabile .env ‘ZILLIZ_API_KEY’. - Sempre nella pagina principale del Cluster, copia il
Public Endpoint URI.
import os
from pymilvus import connections, utility
TOKEN = os.getenv("ZILLIZ_API_KEY")
# Connect to Zilliz cloud using endpoint URI and API key TOKEN.
CLUSTER_ENDPOINT="https://in03-xxxx.api.gcp-us-west1.zillizcloud.com:443"
connections.connect(
alias='default',
token=TOKEN,
uri=CLUSTER_ENDPOINT,)
# Check if the server is ready and get collection name.
print(f"Type of server: {utility.get_server_version()}")
Scegli un modello di embedding. Di seguito, ne ho scelto uno da HuggingFace. Lo sto eseguendo sul mio laptop, quindi devo assicurarmi che DEVICE=cpu.
import torch
from sentence_transformers import SentenceTransformer
# Initialize torch settings
torch.backends.cudnn.deterministic = True
DEVICE = torch.device('cuda:3' if torch.cuda.is_available() else 'cpu')
# Carica il modello dall’hub dei modelli huggingface.
model_name = "WhereIsAI/UAE-Large-V1"
encoder = SentenceTransformer(model_name, device=DEVICE)
# Ottieni i parametri del modello e salvali per dopo.
EMBEDDING_DIM = encoder.get_sentence_embedding_dimension()
MAX_SEQ_LENGTH_IN_TOKENS = encoder.get_max_seq_length()
# Visualizza i parametri del modello.
print(f"model_name: {model_name}")
print(f"EMBEDDING_DIM: {EMBEDDING_DIM}")
print(f"MAX_SEQ_LENGTH: {MAX_SEQ_LENGTH}")
Importa MilvusClient e crea la collection. Nota che non dobbiamo specificare uno schema! Inoltre, puoi semplicemente usare il nostro indice predefinito di sistema, chiamato AUTOINDEX. Nell’open source e nel piano gratuito il valore predefinito è HNSW. Su Zilliz cloud a pagamento, AUTOINDEX sarà ulteriormente ottimizzato usando indici proprietari.
from pymilvus import MilvusClient
import pprint
# Set the Milvus collection name.
COLLECTION_NAME = "imdb_metadata"
# Use no-schema Milvus client.
mc = MilvusClient(
uri=CLUSTER_ENDPOINT,
token=TOKEN)
# Check if the collection already exists, if so drop it.
has = utility.has_collection(COLLECTION_NAME)
if has:
drop_result = utility.drop_collection(COLLECTION_NAME)
print(f"Successfully dropped collection: `{COLLECTION_NAME}`")
# Create the collection.
mc.create_collection(COLLECTION_NAME,
EMBEDDING_DIM,
consistency_level="Eventually",
auto_id=True,
overwrite=True,
# skip setting params, if using AUTOINDEX
)
print(f"Successfully created collection: `{COLLECTION_NAME}`")
pprint.pprint(mc.describe_collection(COLLECTION_NAME))
Una semplice strategia di suddivisione in chunk consiste nel mantenere il campo ‘text’ come un singolo chunk a meno che non superi i 512 caratteri di lunghezza. Di seguito, possiamo vedere che il campo text dei dati JSON era piuttosto breve. Nessuna riga ha dovuto essere suddivisa in chunk più piccoli.
# Use the embedding model parameters.
chunk_size = 512
chunk_overlap = np.round(chunk_size * 0.10, 0)
# Chunk a batch of data from pandas DataFrame and inspect it.
BATCH_SIZE = 100
batch = imdb_chunk_text(BATCH_SIZE, df, chunk_size)
display(batch.head(2))
Ora che abbiamo chunk di testo, embedding vettoriali per ogni chunk di testo e tutti i metadati originali, inseriamo quei dati nel database vettoriale Milvus.
# Convert the DataFrame to a list of dictionaries
chunk_list = batch.to_dict(orient='records')
# Insert data into the Milvus collection.
start_time = time.time()
insert_result = mc.insert( COLLECTION_NAME, data=chunk_list, progress_bar=True )
end_time = time.time()
print(f"Milvus Client insert time for {batch.shape[0]} vectors: {end_time - start_time} seconds")
Facciamo una domanda e recuperiamo le risposte dai nostri dati sui film.
SAMPLE_QUESTION = "Dystopia science fiction with a robot."
# Embed the question using the same encoder.
query_embeddings = _utils.embed_query(encoder, [SAMPLE_QUESTION])
TOP_K = 2
# Run semantic vector search using your query and the vector database.
start_time = time.time()
results = mc.search(
COLLECTION_NAME,
data=query_embeddings,
output_fields=OUTPUT_FIELDS,
limit=TOP_K,
consistency_level="Eventually",
filter='film_year >= 2019', )
elapsed_time = time.time() - start_time
print(f"Milvus Client search time for {len(chunk_list)} vectors: {elapsed_time} seconds")
tempo di ricerca
Scorrendo i primi 2 risultati, vediamo.
Sembra piuttosto buono. Ma cosa succede se vogliamo applicare un filtro sui metadati sull’array JSON ‘Genres’?
Filtraggio dei metadati attraverso campi JSON e array JSON
Una nuova funzionalità in Milvus 2.3 è la possibilità di filtrare i metadati JSON grezzi. Di seguito, mostrerò un esempio usando il filtro dei metadati con un campo e un array.
Supponiamo che volessi vedere film più vecchi, più rétro e rigorosamente del genere Sci-Fi.
SAMPLE_QUESTION = "Dystopia science fiction with a robot."
# Embed the question using the same encoder.
query_embeddings = _utils.embed_query(encoder, [SAMPLE_QUESTION])
TOP_K = 2
# Run semantic vector search using your query and the vector database.
start_time = time.time()
results = mc.search(
COLLECTION_NAME,
data=query_embeddings,
output_fields=OUTPUT_FIELDS,
limit=TOP_K,
consistency_level="Eventually",
filter='json_contains(Genres, "Sci-Fi") and film_year < 2019',
)
elapsed_time = time.time() - start_time
print(f"Milvus Client search time for {len(chunk_list)} vectors: {elapsed_time} seconds")
Scorrendo i primi 2 risultati, ora le raccomandazioni di film sono cambiate per corrispondere al filtro.
Molte demo di Milvus iniziano con dati testuali grezzi come file di tipo .txt, .pdf o .csv. Questa volta abbiamo visto come caricare dati JSON direttamente in una raccolta di database vettoriale Milvus. Abbiamo anche visto come usare il comodo filtro dei metadati sui campi JSON e il filtro json_contains() sui tipi di dati array JSON. Il codice completo per questo articolo del blog è nel mio repo GitHub Bootcamp.
Introduzione alla ricerca ibrida
La ricerca ibrida è una potente funzionalità di Milvus che consente agli utenti di combinare più campi vettoriali in un’unica ricerca. Questa funzionalità è particolarmente utile in scenari di ricerca complessi in cui un’entità può essere rappresentata da più vettori diversi. Integrando i risultati di più ricerche vettoriali tramite strategie di reranking, la ricerca ibrida consente agli utenti di ottenere maggiore accuratezza e risultati più pertinenti.
In Milvus, la ricerca ibrida può essere usata per combinare diversi tipi di dati, come testo, immagini e audio, in un’unica query di ricerca. Questo consente agli utenti di eseguire ricerche più complete e recuperare risultati più pertinenti. Ad esempio, una ricerca ibrida può combinare embedding di testo con embedding di immagini per trovare prodotti che corrispondano sia a una descrizione testuale sia a un esempio visivo.
Per usare efficacemente la ricerca ibrida in Milvus, è importante comprendere i diversi campi vettoriali e come possono essere combinati. Selezionando e combinando con attenzione i campi vettoriali, gli utenti possono migliorare l’accuratezza e la pertinenza dei loro risultati di ricerca. Inoltre, l’uso di strategie di reranking può aiutare a perfezionare ulteriormente i risultati di ricerca e garantire che vengano restituiti i risultati più pertinenti.
Gestione dei dati con i metadati
I metadati svolgono un ruolo cruciale nella gestione dei dati in Milvus. I metadati vengono usati per descrivere la struttura e l’organizzazione dei dati, rendendo più semplice cercare, filtrare e analizzare. In Milvus, i metadati vengono usati per gestire i file di dati, incluse informazioni sui dati, come il nome della raccolta, il campo vettoriale e il tipo di indice.
Usando efficacemente i metadati, gli utenti possono migliorare le prestazioni e l’accuratezza delle loro ricerche. I metadati consentono agli utenti di organizzare i propri dati in modo da renderli facili da recuperare e analizzare. Ad esempio, usando i metadati per etichettare i dati con parole chiave pertinenti, gli utenti possono filtrare e cercare rapidamente punti dati specifici.
Oltre a migliorare le prestazioni di ricerca, i metadati possono anche aiutare a garantire l’integrità e la coerenza dei dati. Usando i metadati per tracciare modifiche e aggiornamenti ai dati, gli utenti possono garantire che i loro dati rimangano accurati e aggiornati. Questo è particolarmente importante in ambienti di dati su larga scala in cui i dati vengono costantemente aggiornati e modificati.
JSON e filtro dei metadati
JSON (JavaScript Object Notation) è un formato di dati flessibile ampiamente utilizzato nei database NoSQL e nei risultati delle API. Milvus supporta il caricamento e l’elaborazione di dati JSON grezzi, rendendo semplice l’integrazione con altri sistemi. Il filtraggio dei metadati è una potente funzionalità di Milvus che consente agli utenti di filtrare i metadati JSON grezzi in base a condizioni specifiche.
Utilizzando il filtraggio dei metadati, gli utenti possono migliorare l’accuratezza delle loro ricerche e ridurre la quantità di dati irrilevanti. Ad esempio, gli utenti possono filtrare i dati JSON in base a campi o valori specifici, come filtrare i film per genere o anno di uscita. Questo consente agli utenti di eseguire ricerche più mirate e recuperare risultati più pertinenti.
In Milvus, il filtraggio dei metadati può essere utilizzato in combinazione con la ricerca vettoriale per perfezionare ulteriormente i risultati di ricerca. Applicando filtri sui metadati alle query di ricerca vettoriale, gli utenti possono garantire che vengano restituiti solo i dati più pertinenti. Questo può contribuire a migliorare l’accuratezza della ricerca e a ridurre la quantità di dati irrilevanti che devono essere elaborati.
Creazione e gestione degli indici per la ricerca vettoriale
La creazione degli indici è un passaggio fondamentale per ottimizzare le prestazioni della ricerca vettoriale in Milvus. Un indice è una struttura dati che migliora la velocità di recupero dei dati consentendo al database di individuare rapidamente dati specifici. In Milvus, gli indici possono essere creati sui campi vettoriali per migliorare le prestazioni delle ricerche vettoriali.
In Milvus sono disponibili diversi tipi di indici, ciascuno con i propri vantaggi e casi d’uso. Ad esempio, l’indice HNSW (Hierarchical Navigable Small World) è comunemente utilizzato per ricerche vettoriali ad alta dimensionalità grazie alla sua efficienza e accuratezza. Altri tipi di indici, come IVF (Inverted File) e PQ (Product Quantization), offrono diversi compromessi tra velocità e accuratezza della ricerca.
Per creare e gestire gli indici in modo efficace, è importante comprendere le caratteristiche dei dati e i requisiti specifici della ricerca. Selezionando il tipo di indice appropriato e regolando i parametri dell’indice, gli utenti possono migliorare significativamente le prestazioni delle loro ricerche. Inoltre, aggiornare e mantenere regolarmente gli indici può contribuire a garantire che le prestazioni di ricerca rimangano ottimali man mano che i dati evolvono.
Ottimizzazione delle prestazioni della ricerca ibrida
Le prestazioni della ricerca ibrida possono essere ottimizzate utilizzando varie tecniche, tra cui la creazione di indici, il filtraggio dei metadati e l’ottimizzazione delle query. Creando indici sui campi vettoriali, gli utenti possono migliorare le prestazioni delle ricerche vettoriali. Gli indici consentono al database di individuare rapidamente i dati pertinenti, riducendo il tempo necessario per eseguire le ricerche.
Il filtraggio dei metadati è un’altra tecnica importante per ottimizzare le prestazioni della ricerca ibrida. Utilizzando filtri sui metadati, gli utenti possono ridurre la quantità di dati irrilevanti che devono essere elaborati, migliorando l’accuratezza e la velocità della ricerca. Ad esempio, filtrare i dati in base a campi o valori specifici può aiutare a restringere i risultati di ricerca e garantire che vengano restituiti solo i dati più pertinenti.
Anche l’ottimizzazione delle query è fondamentale per migliorare le prestazioni della ricerca ibrida. Ottimizzando la struttura e i parametri delle query di ricerca, gli utenti possono ridurre le risorse computazionali necessarie per le ricerche e migliorare le prestazioni. Ciò può includere tecniche come il raggruppamento delle query in batch, l’uso di strutture dati efficienti e la regolazione dei parametri delle query.
In questa sezione abbiamo discusso le migliori pratiche per ottimizzare le prestazioni della ricerca ibrida in Milvus. Utilizzando tecniche come la creazione di indici, il filtraggio dei metadati e l’ottimizzazione delle query, gli utenti possono migliorare l’accuratezza e la velocità delle loro ricerche, assicurandosi di recuperare i risultati più pertinenti.
Continua a leggere

Zilliz Named "Highest Performer" and "Easiest to Use" in G2's Summer 2025 Grid® Report for Vector Databases
Zilliz shines in G2's Summer 2025 Grid® Report as both "Highest Performer" and "Easiest to Use," solving the performance-usability dilemma.

Demystifying the Milvus Sizing Tool
Explore how to use the Sizing Tool to select the optimal configuration for your Milvus deployment.

Optimizing Embedding Model Selection with TDA Clustering: A Strategic Guide for Vector Databases
Discover how Topological Data Analysis (TDA) reveals hidden embedding model weaknesses and helps optimize vector database performance.



