• Über Milvus
  • Los geht's
  • Konzepte
  • Benutzerhandbuch
    • Sammlungen
    • Schema & Datenfelder
    • Einfügen & Löschen
    • Indizes
    • Suche
    • Einbettungen & Reranking
    • Optimierung der Speicherung
  • Datenimport
  • AI-Tools
  • Leitfaden für die Verwaltung
  • Werkzeuge
  • Integrationen
  • Anleitungen
  • FAQs
  • API Reference

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

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

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

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

How Retree Works So funktioniert Retree

Phase 2: Abfragen beschleunigen

  1. Bilden Sie den Abfrage-MBR: Berechnen Sie den MBR für Ihre Abfragegeometrie.

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

  3. Kandidaten sammeln: Steigen Sie in die sich schneidenden Zweige hinab, um mögliche Blattknoten zu sammeln.

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