Milvus
Zilliz
홈페이지
  • 사용자 가이드
    • 색인
  • Home
  • Docs
  • 사용자 가이드

  • 색인

  • 스칼라 인덱스

  • RTREE

RTREECompatible with Milvus 2.6.4+

RTREE 인덱스는 Milvus의 GEOMETRY 필드에 대한 쿼리를 가속화하는 트리 기반 데이터 구조입니다. 컬렉션에 점, 선 또는 다각형과 같은 기하학적 개체를 WKT(잘 알려진 텍스트) 형식으로 저장하고 공간 필터링을 가속화하려는 경우 RTREE 인덱스가 이상적인 선택입니다.

작동 방식

Milvus는 RTREE 인덱스를 사용하여 2단계 프로세스에 따라 지오메트리 데이터를 효율적으로 구성하고 필터링합니다:

1단계: 인덱스 구축

  1. 리프 노드를 생성합니다: 각 지오메트리 객체에 대해 객체를 완전히 포함하는 가장 작은 사각형인 최소 바운딩 사각형 (MBR)을 계산하여 리프 노드로 저장합니다.

  2. 더 큰 상자로 그룹화합니다: 근처의 리프 노드를 함께 클러스터링하고 각 그룹을 새 MBR로 감싸서 내부 노드를 형성합니다. 예를 들어, 그룹 B에는 D와 E가 포함되고 그룹 C에는 F와 G가 포함됩니다.

  3. 루트 노드를 추가합니다: 모든 내부 그룹을 포함하는 MBR을 가진 루트 노드를 추가하여 높이가 균형 잡힌 트리 구조를 만듭니다.

How Retree Works Retree 작동 방식

2단계: 쿼리 가속화

  1. 쿼리MBR 구성: 쿼리 지오메트리에 대한 MBR을 계산합니다.

  2. 가지를 잘라냅니다: 루트에서 시작하여 쿼리 MBR을 각 내부 노드와 비교합니다. MBR이 쿼리 MBR과 교차하지 않는 브랜치는 모두 건너뜁니다.

  3. 후보를 수집합니다: 교차하는 분기로 내려가서 후보 리프 노드를 수집합니다.

  4. 정확히 일치: 각 후보에 대해 정확한 공간 술어를 수행하여 실제 일치 여부를 결정합니다.

RTREE 인덱스 만들기

컬렉션 스키마에 정의된 GEOMETRY 필드에 RTREE 인덱스를 만들 수 있습니다.

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
)

RTREE로 쿼리하기

filter 표현식에서 지오메트리 연산자를 사용하여 필터링합니다. 대상 GEOMETRY 필드에 RTREE 이 존재하면 Milvus는 이를 사용하여 후보를 자동으로 정리합니다. 인덱스가 없으면 필터는 전체 검색으로 돌아갑니다.

사용 가능한 지오메트리별 연산자의 전체 목록은 지오메트리 연산자를 참조하세요.

예제 1: 필터만

지정된 다각형 내의 모든 도형 개체를 찾습니다:

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

예 2: 벡터 검색 + 공간 필터

선과 교차하는 가장 가까운 벡터를 찾습니다:

# 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

GEOMETRY 필드 사용 방법에 대한 자세한 내용은 기하학 필드를 참조하세요.

색인 삭제

drop_index() 메서드를 사용하여 컬렉션에서 기존 인덱스를 제거합니다.

  • v2.6.3 이하에서는 스칼라 인덱스를 삭제하기 전에 컬렉션을 해제해야 합니다.

  • v2.6.4 이상에서는 더 이상 필요하지 않은 스칼라 인덱스는 컬렉션을 먼저 해제할 필요 없이 바로 삭제할 수 있습니다.

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
피드백

이 페이지가 도움이 되었나요?