RTREECompatible with Milvus 2.6.4+
L'index RTREE est une structure de données arborescente qui accélère les requêtes sur les champs GEOMETRY dans Milvus. Si votre collection stocke des objets géométriques tels que des points, des lignes ou des polygones au format Well-known text (WKT) et que vous souhaitez accélérer le filtrage spatial, RTREE est un choix idéal.
Fonctionnement
Milvus utilise un index RTREE pour organiser et filtrer efficacement les données géométriques, en suivant un processus en deux phases :
Phase 1 : Construction de l'index
Créer des nœuds feuilles : Pour chaque objet géométrique, calculez son rectangle minimal de délimitation (MBR), qui est le plus petit rectangle contenant entièrement l'objet, et stockez-le en tant que nœud feuille.
Regrouper en boîtes plus grandes : Regroupez les nœuds feuilles proches et entourez chaque groupe d'un nouveau MBR, en formant des nœuds internes. Par exemple, le groupe B contient D et E; le groupe C contient F et G.
Ajoutez le nœud racine : Ajoutez un nœud racine dont le RBM couvre tous les groupes internes, ce qui permet d'obtenir une structure arborescente équilibrée en hauteur.
Fonctionnement de Retree
Phase 2 : Accélérer les requêtes
Formez le MBR de la requête : calculez le MBR pour la géométrie de votre requête.
Élaguez les branches : En commençant par la racine, comparez le MBR de la requête à chaque nœud interne. Sautez toutes les branches dont le MBR ne croise pas le MBR de la requête.
Collecter les candidats : Descendez dans les branches qui se croisent pour rassembler les nœuds feuilles candidats.
Correspondance exacte : Pour chaque candidat, effectuer un prédicat spatial exact pour déterminer les vraies correspondances.
Création d'un index RTREE
Vous pouvez créer un index RTREE sur un champ GEOMETRY défini dans votre schéma de collecte.
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
)
Interroger avec RTREE
Vous filtrez avec des opérateurs géométriques dans l'expression filter. Lorsqu'un index RTREE existe sur le champ cible GEOMETRY, Milvus l'utilise pour élaguer automatiquement les candidats. Sans l'index, le filtre revient à un balayage complet.
Pour obtenir la liste complète des opérateurs spécifiques à la géométrie disponibles, reportez-vous à la section Opérateurs de géométrie.
Exemple 1 : Filtre uniquement
Recherche de tous les objets géométriques à l'intérieur d'un polygone donné :
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
Exemple 2 : Recherche vectorielle + filtre spatial
Recherche les vecteurs les plus proches qui coupent également une ligne :
# 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
Pour plus d'informations sur l'utilisation d'un champ GEOMETRY, voir Champ géométrique.
Supprimer un index
Utilisez la méthode drop_index() pour supprimer un index existant d'une collection.
Dans la version 2.6.3 ou antérieure, vous devez libérer la collection avant de supprimer un index scalaire.
À partir de la version 2.6.4, vous pouvez supprimer un index scalaire directement lorsqu'il n'est plus nécessaire, sans avoir à libérer la collection au préalable.
client.drop_index(
collection_name="geo_demo", # Name of the collection
index_name="rtree_geo" # Name of the index to drop
)