RTREECompatible with Milvus 2.6.4+
Индекс RTREE - это древовидная структура данных, которая ускоряет запросы к полям GEOMETRY в Milvus. Если в вашей коллекции хранятся геометрические объекты, такие как точки, линии или полигоны, в формате Well-known text (WKT) и вы хотите ускорить пространственную фильтрацию, RTREE - идеальный выбор.
Как это работает
Milvus использует индекс RTREE для эффективной организации и фильтрации геометрических данных, следуя двухфазному процессу:
Этап 1: Создание индекса
Создайте узлы листа: Для каждого геометрического объекта вычислите его минимальный прямоугольник (Minimum Bounding Rectangle, MBR) - наименьший прямоугольник, который полностью содержит объект, и сохраните его в качестве узла листа.
Сгруппируйте в более крупные блоки: Объедините близлежащие листовые узлы в группы и оберните каждую группу новым MBR, формируя внутренние узлы. Например, группа B содержит D и E; группа C содержит F и G.
Добавьте корневой узел: Добавьте корневой узел, MBR которого охватывает все внутренние группы, в результате чего получится сбалансированная по высоте древовидная структура.
Как работает Retree
Этап 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. Если для целевого поля 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(), чтобы удалить существующий индекс из коллекции.
В версии 2.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
)