Milvus
Zilliz
Home
  • Guia do utilizador
    • Índices
  • Home
  • Docs
  • Guia do utilizador

  • Índices

  • Índices escalares

  • RTREE

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

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

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

  3. Adicionar o nó raiz: Adicione um nó raiz cujo MBR cubra todos os grupos internos, resultando em uma estrutura de árvore com altura balanceada.

How Retree Works Como o Retree funciona

Fase 2: Acelerar as consultas

  1. Formar o MBR da consulta: Calcular o MBR para a geometria da consulta.

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

  3. Coletar candidatos: Desça em ramos de interseção para reunir nós de folha candidatos.

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

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started
Feedback

Esta página foi útil?