RTREECompatible with Milvus 2.6.4+
الفهرس RTREE هو هيكل بيانات قائم على الشجرة يعمل على تسريع الاستعلامات على GEOMETRY الحقول في ميلفوس. إذا كانت مجموعتك تخزن كائنات هندسية مثل النقاط أو الخطوط أو المضلعات بتنسيق نص معروف جيدًا (WKT ) وتريد تسريع التصفية المكانية، فإن RTREE هو الخيار المثالي.
كيف يعمل
يستخدم Milvus فهرس RTREE لتنظيم وتصفية البيانات الهندسية بكفاءة، باتباع عملية من مرحلتين:
المرحلة 1: بناء الفهرس
إنشاء العقد الورقية: لكل كائن هندسي، قم بحساب الحد الأدنى للمستطيل المحيط به (MBR)، وهو أصغر مستطيل يحتوي على الكائن بالكامل، وقم بتخزينه كعقدة ورقة.
جمِّع في مربعات أكبر: قم بتجميع العقد الورقية القريبة معًا ولف كل مجموعة مع MBR جديد، لتكوين عقد داخلية. على سبيل المثال، تحتوي المجموعة B على D وE؛ وتحتوي المجموعة C على F وG.
أضف عقدة الجذر: أضف عقدة جذر تغطي MBR جميع المجموعات الداخلية، مما ينتج عنه بنية شجرة متوازنة الارتفاع.
كيف يعمل ريتري
المرحلة 2: تسريع الاستعلامات
تشكيل MBR الاستعلام: احسب MBR لهندسة الاستعلام الخاص بك.
تشذيب الفروع: بدءًا من الجذر، قارن MBR للاستعلام بكل عقدة داخلية. تخطي أي فروع لا يتقاطع MBR الخاص بها مع MBR للاستعلام.
اجمع الفروع المرشحة: النزول إلى الفروع المتقاطعة لجمع العقد الورقية المرشحة.
التطابق التام: لكل مرشح، قم بإجراء مسند مكاني دقيق لتحديد التطابقات الحقيقية.
إنشاء فهرس RTREE
يمكنك إنشاء فهرس RTREE على حقل GEOMETRY محدد في مخطط مجموعتك.
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. في حالة وجود RTREE على الحقل المستهدف GEOMETRY ، يستخدمه ميلفوس لتشذيب المرشحين تلقائيًا. بدون الفهرس، يعود عامل التصفية إلى المسح الكامل.
للاطلاع على قائمة كاملة بالمشغلات المتاحة الخاصة بالهندسة، راجع مشغلات الهندسة.
مثال 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() لإزالة فهرس موجود من مجموعة.
في الإصدار 2.6.3 أو الإصدار 2.6.3 أو الإصدارات الأقدم، يجب عليك تحرير المجموعة قبل إسقاط فهرس قياسي.
اعتبارًا من الإصدار 2.6.4 أو الإصدار الأحدث، يمكنك إسقاط فهرس قياسي مباشرةً بمجرد عدم الحاجة إليه - لا حاجة لتحرير المجموعة أولاً.
client.drop_index(
collection_name="geo_demo", # Name of the collection
index_name="rtree_geo" # Name of the index to drop
)