INDICECompatible with Milvus 2.6.4+
L'indice RTREE è una struttura di dati ad albero che accelera le interrogazioni sui campi GEOMETRY in Milvus. Se la vostra collezione memorizza oggetti geometrici come punti, linee o poligoni in formato Well-known text (WKT) e volete accelerare il filtraggio spaziale, RTREE è la scelta ideale.
Come funziona
Milvus utilizza un indice RTREE per organizzare e filtrare in modo efficiente i dati geometrici, seguendo un processo in due fasi:
Fase 1: costruzione dell'indice
Creare i nodi foglia: Per ogni oggetto geometrico, calcolare il suo Minimum Bounding Rectangle (MBR), cioè il rettangolo più piccolo che contiene completamente l'oggetto, e memorizzarlo come nodo foglia.
Raggruppare in riquadri più grandi: Raggruppare i nodi foglia vicini e avvolgere ogni gruppo con un nuovo MBR, formando nodi interni. Ad esempio, il gruppo B contiene D ed E; il gruppo C contiene F e G.
Aggiungere il nodo radice: Aggiungere un nodo radice il cui MBR copre tutti i gruppi interni, ottenendo una struttura ad albero bilanciata in altezza.
Come funziona Retree
Fase 2: accelerazione delle query
Formare l'MBR della query: calcolare l'MBR per la geometria della query.
Potare i rami: A partire dalla radice, confrontare l'MBR della query con ogni nodo interno. Saltare i rami il cui MBR non si interseca con l'MBR della query.
Raccogliere i candidati: Scendere nei rami che si intersecano per raccogliere i nodi foglia candidati.
Corrispondenza esatta: Per ogni candidato, eseguire un predicato spaziale esatto per determinare le corrispondenze reali.
Creare un indice RTREE
È possibile creare un indice RTREE su un campo GEOMETRY definito nello schema della raccolta.
from pymilvus import MilvusClient
client = MilvusClient(uri="http://localhost:19530") # Replace with your server address
# Assume you have defined a GEOMETRY field named "geo" in your collection schema
# Prepare index parameters
index_params = client.prepare_index_params()
# Add RTREE index on the "geo" field
index_params.add_index(
field_name="geo",
index_type="RTREE", # Spatial index for GEOMETRY
index_name="rtree_geo", # Optional, name your index
params={} # No extra params needed
)
# Create the index on the collection
client.create_index(
collection_name="geo_demo",
index_params=index_params
)
Interrogazione con RTREE
Si filtra con gli operatori geometrici nell'espressione filter. Quando esiste un indice RTREE sul campo GEOMETRY di destinazione, Milvus lo utilizza per selezionare automaticamente i candidati. Senza l'indice, il filtro ricade in una scansione completa.
Per un elenco completo degli operatori specifici per la geometria, consultare Operatori geometrici.
Esempio 1: Solo filtro
Trova tutti gli oggetti geometrici all'interno di un determinato poligono:
filter_expr = "ST_CONTAINS(geo, 'POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))')"
res = client.query(
collection_name="geo_demo",
filter=filter_expr,
output_fields=["id", "geo"],
limit=10
)
print(res) # Expected: a list of rows where geo is entirely inside the polygon
Esempio 2: Ricerca vettoriale + filtro spaziale
Trova i vettori più vicini che intersecano una linea:
# Assume you've also created an index on "vec" and loaded the collection.
query_vec = [[0.1, 0.2, 0.3, 0.4, 0.5]]
filter_expr = "ST_INTERSECTS(geo, 'LINESTRING (1 1, 2 2)')"
hits = client.search(
collection_name="geo_demo",
data=query_vec,
limit=5,
filter=filter_expr,
output_fields=["id", "geo"]
)
print(hits) # Expected: top-k by vector similarity among rows whose geo intersects the line
Per ulteriori informazioni su come utilizzare un campo GEOMETRY, consultare Campo geometrico.
Eliminare un indice
Usare il metodo drop_index() per rimuovere un indice esistente da una collezione.
Nella versione 2.6.3 o precedente, è necessario rilasciare la collezione prima di eliminare un indice scalare.
Dalla versione 2.6.4 o successiva, è possibile eliminare direttamente un indice scalare quando non è più necessario, senza dover prima rilasciare l'insieme.
client.drop_index(
collection_name="geo_demo", # Name of the collection
index_name="rtree_geo" # Name of the index to drop
)