RTREECompatible with Milvus 2.6.4+
O índice RTREE é uma estrutura de dados em árvore que acelera as consultas nos campos GEOMETRY em Milvus. Se a sua coleção armazena objectos geométricos como pontos, linhas ou polígonos em formato WKT (Well-known text) e pretende acelerar a filtragem espacial, RTREE é a escolha ideal.
Como funciona
O Milvus utiliza um índice RTREE para organizar e filtrar eficazmente os dados geométricos, seguindo um processo de duas fases:
Fase 1: Construir o índice
Criar nós folha: Para cada objeto geométrico, calcular o seu Minimum Bounding Rectangle (MBR), que é o retângulo mais pequeno que contém totalmente o objeto, e armazená-lo como um nó folha.
Agrupar em caixas maiores: Agrupe os nós folha próximos e envolva cada grupo com um novo MBR, formando nós internos. Por exemplo, o grupo B contém D e E; o grupo C contém F e G.
Adicionar o nó raiz: Adicione um nó raiz cujo MBR cubra todos os grupos internos, resultando em uma estrutura de árvore com altura balanceada.
Como o Retree funciona
Fase 2: Acelerar as consultas
Formar o MBR da consulta: Calcular o MBR para a geometria da consulta.
Podar ramos: Começando pela raiz, compare o MBR da consulta com cada nó interno. Ignore todos os ramos cujo MBR não se cruza com o MBR da consulta.
Coletar candidatos: Desça em ramos de interseção para reunir nós de folha candidatos.
Correspondência exacta: Para cada candidato, execute um predicado espacial exato para determinar as correspondências verdadeiras.
Criar um índice RTREE
É possível criar um índice RTREE num campo GEOMETRY definido no esquema de coleção.
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
)
Consultar com RTREE
É possível filtrar com operadores de geometria na expressão filter. Quando existe um índice RTREE no campo de destino GEOMETRY, o Milvus utiliza-o para eliminar automaticamente os candidatos. Sem o índice, o filtro volta a ser uma pesquisa completa.
Para obter uma lista completa dos operadores específicos de geometria disponíveis, consulte Operadores de geometria.
Exemplo 1: Filtrar apenas
Procurar todos os objectos geométricos num determinado polígono:
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
Exemplo 2: Pesquisa de vectores + filtro espacial
Encontrar os vectores mais próximos que também intersectam uma linha:
# 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 mais informações sobre como utilizar um campo GEOMETRY, consulte Campo de geometria.
Eliminar um índice
Utilize o método drop_index() para remover um índice existente de uma coleção.
Na versão 2.6.3 ou anterior, é necessário libertar a coleção antes de eliminar um índice escalar.
A partir da v2.6.4 ou posterior, pode eliminar um índice escalar diretamente quando este já não for necessário, sem necessidade de libertar primeiro a coleção.
client.drop_index(
collection_name="geo_demo", # Name of the collection
index_name="rtree_geo" # Name of the index to drop
)