RTREECompatible with Milvus 2.6.4+
El índice RTREE es una estructura de datos en forma de árbol que acelera las consultas sobre los campos GEOMETRY en Milvus. Si su colección almacena objetos geométricos como puntos, líneas o polígonos en formato de texto bien conocido (WKT ) y desea acelerar el filtrado espacial, RTREE es una opción ideal.
Cómo funciona
Milvus utiliza un índice RTREE para organizar y filtrar eficazmente los datos geométricos, siguiendo un proceso en dos fases:
Fase 1: Construir el índice
Crear nodos hoja: Para cada objeto geométrico, calcule su rectángulo de contorno mínimo (MBR), que es el rectángulo más pequeño que contiene completamente el objeto, y guárdelo como nodo hoja.
Agrupar en rectángulos mayores: Agrupa los nodos hoja cercanos y envuelve cada grupo con un nuevo MBR, formando nodos internos. Por ejemplo, el grupo B contiene D y E; el grupo C contiene F y G.
Añada el nodo raíz: Añada un nodo raíz cuya RBM cubra todos los grupos internos, dando como resultado una estructura de árbol equilibrada en altura.
Cómo funciona Retree
Fase 2: Acelerar las consultas
Formar el MBR de la consulta: Calcule el MBR para su geometría de consulta.
Pode las ramas: Empezando por la raíz, compare el MBR de la consulta con cada nodo interno. Omita cualquier rama cuyo MBR no se cruce con el MBR de la consulta.
Recopilar candidatos: Descienda por las ramas que se cruzan para reunir los nodos hoja candidatos.
Coincidencia exacta: Para cada candidato, realice un predicado espacial exacto para determinar las coincidencias verdaderas.
Crear un índice RTREE
Puede crear un índice RTREE en un campo GEOMETRY definido en el esquema de su colección.
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
)
Consulta con RTREE
Puede filtrar con operadores geométricos en la expresión filter. Cuando existe un RTREE en el campo GEOMETRY de destino, Milvus lo utiliza para eliminar candidatos automáticamente. Sin el índice, el filtro vuelve a una exploración completa.
Para obtener una lista completa de los operadores específicos de geometría disponibles, consulte Operadores de geometría.
Ejemplo 1 Sólo filtro
Buscar todos los objetos geométricos dentro de un polígono determinado:
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
Ejemplo 2: Búsqueda vectorial + filtro espacial
Encuentra los vectores más cercanos que también intersecan una línea:
# 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
Para más información sobre cómo utilizar un campo GEOMETRY, consulte Campo geométrico.
Eliminar un índice
Utilice el método drop_index() para eliminar un índice existente de una colección.
En v2.6.3 o versiones anteriores, debes liberar la colección antes de eliminar un índice escalar.
A partir de la versión 2.6.4, puedes eliminar un índice escalar directamente cuando ya no lo necesites, sin necesidad de liberar primero la colección.
client.drop_index(
collection_name="geo_demo", # Name of the collection
index_name="rtree_geo" # Name of the index to drop
)