Milvus
Zilliz
Casa
  • Guida per l'utente
    • Indici
  • Home
  • Docs
  • Guida per l'utente

  • Indici

  • Indici scalari

  • RTREE

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

  1. 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.

  2. 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.

  3. Aggiungere il nodo radice: Aggiungere un nodo radice il cui MBR copre tutti i gruppi interni, ottenendo una struttura ad albero bilanciata in altezza.

How Retree Works Come funziona Retree

Fase 2: accelerazione delle query

  1. Formare l'MBR della query: calcolare l'MBR per la geometria della query.

  2. 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.

  3. Raccogliere i candidati: Scendere nei rami che si intersecano per raccogliere i nodi foglia candidati.

  4. 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
)

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started
Feedback

Questa pagina è stata utile?