メインコンテンツまでスキップ

RTREE

RTREE インデックスは、Zilliz Cloud の GEOMETRY フィールドに対するクエリを高速化するツリー構造のデータ構造です。コレクションが点、線、ポリゴンなどのジオメトリオブジェクトを Well-known text(WKT) 形式で格納していて、空間フィルタリングを高速化したい場合は、RTREE が理想的な選択肢です。

仕組み​

Zilliz Cloud は RTREE インデックスを使用して、2 段階のプロセスでジオメトリデータを効率的に整理およびフィルタリングします。

フェーズ 1: インデックスを構築する​

  1. リーフノードを作成する: 各ジオメトリオブジェクトについて、そのオブジェクトを完全に含む最小の矩形である Minimum Bounding Rectangle(MBR)を計算し、リーフノードとして格納します。

  2. より大きなボックスにグループ化する: 近接するリーフノードをまとめてクラスター化し、各グループを新しい MBR で包んで内部ノードを形成します。たとえば、グループ B には D と E が含まれ、グループ C には F と G が含まれます。

  3. ルートノードを追加する: すべての内部グループを MBR が覆うルートノードを追加し、高さのバランスが取れたツリー構造を形成します。

Asy8w0umqh9jJ1biNUHcialonfd

フェーズ 2: クエリを高速化する​

  1. クエリ MBR を形成する: クエリ対象のジオメトリの MBR を計算します。

  2. ブランチを枝刈りする: ルートから開始し、クエリ MBR を各内部ノードと比較します。MBR がクエリ MBR と交差しないブランチはスキップします。

  3. 候補を収集する: 交差するブランチに降りて、候補となるリーフノードを収集します。

  4. 完全一致: 各候補について、厳密な空間述語を実行して真の一致を判定します。

RTREE インデックスを作成する​

コレクションスキーマで定義された GEOMETRY フィールドに RTREE インデックスを作成できます。

python
from pymilvus import MilvusClient

client = MilvusClient(uri="YOUR_CLUSTER_ENDPOINT") # 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 が存在する場合、Zilliz Cloud はそれを使用して候補を自動的に枝刈りします。インデックスがない場合、フィルターはフルスキャンにフォールバックします。

使用可能なジオメトリ固有の演算子の一覧については、ジオメトリ演算子 を参照してください。

例 1: フィルターのみ​

指定されたポリゴン内にあるすべてのジオメトリオブジェクトを検索します。

python
filter_expr = "ST_WITHIN(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: ベクトル検索 + 空間フィルター​

直線と交差する最近傍ベクトルを検索します。

python
# 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() メソッドを使用して、コレクションから既存のインデックスを削除します。

Notes

Milvus v2.6.x と互換性のあるクラスターでは、不要になったスカラーインデックスを直接削除できます。コレクションを先にリリースする必要はありません。

python
client.drop_index(
collection_name="geo_demo", # Name of the collection
index_name="rtree_geo" # Name of the index to drop
)