RTREECompatible with Milvus 2.6.4+
Indeks RTREE adalah struktur data berbasis pohon yang mempercepat kueri pada bidang GEOMETRY di Milvus. Jika koleksi Anda menyimpan objek geometris seperti titik, garis, atau poligon dalam format Well-known text (WKT) dan Anda ingin mempercepat pemfilteran spasial, RTREE merupakan pilihan yang ideal.
Bagaimana cara kerjanya
Milvus menggunakan indeks RTREE untuk mengatur dan memfilter data geometri secara efisien, dengan mengikuti proses dua tahap:
Fase 1: Membangun indeks
Membuat simpul daun: Untuk setiap objek geometri, hitung Minimum Bounding Rectangle (MBR), yaitu persegi panjang terkecil yang sepenuhnya berisi objek tersebut, dan simpan sebagai simpul daun.
Kelompokkan ke dalam kotak yang lebih besar: Kelompokkan simpul daun yang berdekatan dan bungkus setiap kelompok dengan MBR baru, membentuk simpul internal. Sebagai contoh, kelompok B berisi D dan E; kelompok C berisi F dan G.
Tambahkan simpul akar: Tambahkan simpul akar yang MBR-nya mencakup semua kelompok internal, sehingga menghasilkan struktur pohon yang seimbang.
Bagaimana Retree Bekerja
Tahap 2: Mempercepat kueri
Bentuk MBR kueri: Hitung MBR untuk geometri kueri Anda.
Pangkas cabang: Mulai dari akar, bandingkan MBR kueri dengan setiap simpul internal. Lewati semua cabang yang MBR-nya tidak bersinggungan dengan MBR kueri.
Kumpulkan kandidat: Turun ke cabang-cabang yang berpotongan untuk mengumpulkan kandidat simpul daun.
Pencocokan yang tepat: Untuk setiap kandidat, lakukan predikat spasial yang tepat untuk menentukan kecocokan yang benar.
Membuat indeks RTREE
Anda dapat membuat indeks RTREE pada bidang GEOMETRY yang didefinisikan dalam skema koleksi Anda.
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
)
Kueri dengan RTREE
Anda memfilter dengan operator geometri dalam ekspresi filter. Ketika sebuah RTREE ada pada bidang GEOMETRY target, Milvus menggunakannya untuk memangkas kandidat secara otomatis. Tanpa indeks, filter akan kembali ke pemindaian penuh.
Untuk daftar lengkap operator khusus geometri yang tersedia, lihat Operator Geometri.
Contoh 1: Filter saja
Menemukan semua objek geometri dalam poligon tertentu:
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
Contoh 2: Pencarian vektor + filter spasial
Menemukan vektor terdekat yang juga memotong garis:
# 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
Untuk informasi lebih lanjut mengenai cara menggunakan bidang GEOMETRY, lihat Bidang Geometri.
Menghapus indeks
Gunakan metode drop_index() untuk menghapus indeks yang ada dari koleksi.
Pada v2.6.3 atau yang lebih lama, Anda harus melepaskan koleksi sebelum menghapus indeks skalar.
Mulai v2.6.4 atau yang lebih baru, Anda dapat membuang indeks skalar secara langsung setelah indeks tersebut tidak lagi diperlukan-tidak perlu melepaskan koleksi terlebih dahulu.
client.drop_index(
collection_name="geo_demo", # Name of the collection
index_name="rtree_geo" # Name of the index to drop
)