RTREECompatible with Milvus 2.6.4+
Der Index RTREE ist eine baumbasierte Datenstruktur, die die Abfrage von GEOMETRY Feldern in Milvus beschleunigt. Wenn Ihre Sammlung geometrische Objekte wie Punkte, Linien oder Polygone im Well-known text (WKT)-F ormat speichert und Sie die räumliche Filterung beschleunigen möchten, ist RTREE eine ideale Wahl.
Wie das funktioniert
Milvus verwendet einen RTREE Index, um Geometriedaten effizient zu organisieren und zu filtern, und folgt dabei einem zweistufigen Prozess:
Phase 1: Aufbau des Index
Erstellen Sie Blattknoten: Berechnen Sie für jedes Geometrieobjekt sein Minimum Bounding Rectangle (MBR), d. h. das kleinste Rechteck, das das Objekt vollständig enthält, und speichern Sie es als Blattknoten.
Gruppieren in größere Boxen: Fassen Sie nahe gelegene Blattknoten zusammen und umhüllen Sie jede Gruppe mit einem neuen MBR, indem Sie interne Knoten bilden. Beispiel: Gruppe B enthält D und E; Gruppe C enthält F und G.
Fügen Sie den Wurzelknoten hinzu: Fügen Sie einen Wurzelknoten hinzu, dessen MBR alle internen Gruppen umfasst, so dass eine in der Höhe ausgeglichene Baumstruktur entsteht.
So funktioniert Retree
Phase 2: Abfragen beschleunigen
Bilden Sie den Abfrage-MBR: Berechnen Sie den MBR für Ihre Abfragegeometrie.
Beschneiden Sie Zweige: Vergleichen Sie, beginnend bei der Wurzel, den Abfrage-MBR mit jedem internen Knoten. Überspringen Sie alle Zweige, deren MBR sich nicht mit dem Abfrage-MBR überschneidet.
Kandidaten sammeln: Steigen Sie in die sich schneidenden Zweige hinab, um mögliche Blattknoten zu sammeln.
Exakte Übereinstimmung: Führen Sie für jeden Kandidaten ein exaktes räumliches Prädikat durch, um echte Übereinstimmungen zu ermitteln.
Erstellen eines RTREE-Index
Sie können einen RTREE Index für ein GEOMETRY Feld erstellen, das in Ihrem Sammlungsschema definiert ist.
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
)
Abfrage mit RTREE
Sie filtern mit Geometrieoperatoren im filter Ausdruck. Wenn ein RTREE auf dem Zielfeld GEOMETRY existiert, verwendet Milvus diesen, um Kandidaten automatisch auszusortieren. Ohne den Index fällt der Filter auf einen vollständigen Scan zurück.
Eine vollständige Liste der verfügbaren geometriespezifischen Operatoren finden Sie unter Geometrie-Operatoren.
Beispiel 1: Nur filtern
Suche nach allen geometrischen Objekten innerhalb eines bestimmten Polygons:
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
Beispiel 2: Vektorsuche + räumlicher Filter
Suche nach den nächstgelegenen Vektoren, die ebenfalls eine Linie schneiden:
# 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
Weitere Informationen über die Verwendung eines GEOMETRY Feldes finden Sie unter Geometriefeld.
Einen Index löschen
Verwenden Sie die Methode drop_index(), um einen vorhandenen Index aus einer Sammlung zu entfernen.
In v2.6.3 oder früher müssen Sie die Sammlung freigeben, bevor Sie einen skalaren Index löschen können.
Ab Version 2.6.4 können Sie einen skalaren Index direkt löschen, sobald er nicht mehr benötigt wird, ohne die Sammlung vorher freigeben zu müssen.
client.drop_index(
collection_name="geo_demo", # Name of the collection
index_name="rtree_geo" # Name of the index to drop
)