• О Милвусе
  • Начать
  • Концепции
  • Руководство пользователя
  • Импорт данных
  • Инструменты искусственного интеллекта
  • Руководство по администрированию
  • Инструменты
  • Интеграции
  • Учебники
  • Вопросы и ответы
  • API Reference

RTREECompatible with Milvus 2.6.4+

Индекс RTREE - это древовидная структура данных, которая ускоряет запросы к полям GEOMETRY в Milvus. Если в вашей коллекции хранятся геометрические объекты, такие как точки, линии или полигоны, в формате Well-known text (WKT) и вы хотите ускорить пространственную фильтрацию, RTREE - идеальный выбор.

Как это работает

Milvus использует индекс RTREE для эффективной организации и фильтрации геометрических данных, следуя двухфазному процессу:

Этап 1: Создание индекса

  1. Создайте узлы листа: Для каждого геометрического объекта вычислите его минимальный прямоугольник (Minimum Bounding Rectangle, 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

Вы можете создать индекс 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
)

Попробуйте Managed Milvus бесплатно

Zilliz Cloud работает без проблем, поддерживается Milvus и в 10 раз быстрее.

Начать
Обратная связь

Была ли эта страница полезной?