Milvus este o bază de date vectorială open-source, gândită pentru colecții mari. Același API funcționează în Milvus Lite (bibliotecă Python, datele într-un fișier local), în modul standalone (Docker) și în modul distribuit (Kubernetes). Zilliz Cloud este serviciul administrat bazat pe Milvus.
Documentația Milvus 3.0 descrie patru straturi, independente ca scalare și recuperare: access layer (proxy-uri fără stare, care validează cererile și agregă rezultatele), Coordinator (un singur coordonator activ în cluster: DDL, timestamp-uri, gestionarea WAL, a nodurilor de interogare și a sarcinilor de compactare și indexare), worker nodes (Streaming Node pentru datele noi și WAL, Query Node pentru datele istorice din object storage, Data Node pentru compactare și construcția indecșilor) și storage (etcd pentru metadate, object storage MinIO / S3 / Azure Blob, WAL pe Kafka, Pulsar sau Woodpecker).
Milvus suportă mai multe tipuri de index (de exemplu HNSW, IVF_FLAT, DISKANN). DISKANN combină un graf Vamana ținut pe disc cu Product Quantization în memorie, pentru colecții mai mari decât memoria disponibilă. O colecție trebuie încărcată în memorie (load_collection) pentru căutare; dacă o creezi cu parametri de index, Milvus o încarcă automat.
Concepte cheie și caracteristici
| Concept / Parametru | Descriere practică |
|---|---|
MilvusClient(uri, token) |
Clientul Python; cu un nume de fișier ("milvus_demo.db") pornește Milvus Lite. |
create_schema / add_field |
Schema colecției: câmp primar, câmp vectorial (FLOAT_VECTOR cu dim) și câmpuri scalare. |
prepare_index_params / add_index |
Tipul indexului (HNSW, IVF_FLAT, DISKANN etc.), metrica (COSINE, L2, IP) și parametrii (M, efConstruction). |
search(..., filter=, search_params=) |
Căutare cu filtru pe câmpuri scalare ("subject == 'biology'") și parametri de index (ef, cel puțin cât limit). |
load_collection / release_collection |
Încarcă în memorie indexul și datele câmpurilor, sau le eliberează. |
partition key |
Repartizarea automată a datelor în partiții după un câmp, de exemplu pentru multitenancy. |
Exemple practice și scenarii reale
Exemplul 1: Schemă, index HNSW și căutare
from pymilvus import MilvusClient, DataType
client = MilvusClient(uri="http://localhost:19530", token="root:Milvus")
schema = MilvusClient.create_schema(auto_id=True)
schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)
schema.add_field(field_name="vector", datatype=DataType.FLOAT_VECTOR, dim=1536)
schema.add_field(field_name="categorie", datatype=DataType.VARCHAR, max_length=64)
index_params = client.prepare_index_params()
index_params.add_index(field_name="vector", index_type="HNSW", metric_type="COSINE",
params={"M": 16, "efConstruction": 200})
client.create_collection("catalog", schema=schema, index_params=index_params)
res = client.search(
collection_name="catalog",
data=[vector_intrebare],
anns_field="vector",
filter="categorie == 'carti'",
limit=10,
search_params={"params": {"ef": 64}},
output_fields=["categorie"],
)
Greșeli frecvente și capcane
- Folosești API-ul ORM vechi (
connections.connect,Collection,FieldSchema) din exemplele mai vechi. Documentația actuală foloseșteMilvusClient. - Cauți într-o colecție neîncărcată. Dacă ai creat colecția fără parametri de index, apelează
load_collectionînainte de căutare. - Setezi
efmai mic decâtlimit. Documentația cereefcel puțin cât numărul de rezultate.