ジオメトリ演算子Compatible with Milvus 2.6.4+
Milvusは、ジオメトリデータの管理や分析に不可欠な、GEOMETRY フィールドに対する空間フィルタリングのための演算子群をサポートしています。これらの演算子により、オブジェクト間の幾何学的関係に基づいてエンティティを検索することができます。
すべてのジオメトリ演算子は、コレクションスキーマで定義されたGEOMETRY フィールド名と、WKT(Well-Known Text)形式で表現されたターゲットジオメトリオブジェクトの 2 つのジオメトリ引数を取ることで機能します。
構文の使用
GEOMETRY フィールドをフィルタリングするには、式の中でジオメトリ演算子を使用します:
一般:
{operator}(geo_field, '{wkt}')距離ベース:
ST_DWITHIN(geo_field, '{wkt}', distance)
ここで
operatorは、サポートされているジオメトリ演算子の 1 つです(例:ST_CONTAINS,ST_INTERSECTS)。演算子名はすべて大文字またはすべて小文字にする必要があります。サポートされている演算子のリストについては、「サポートされているジオメトリ演算子」を参照してください。geo_fieldはGEOMETRYフィールドの名前です。'{wkt}'は、クエリするジオメトリの WKT 表現です。distanceは、ST_DWITHIN用の閾値です。
Milvus のGEOMETRY フィールドについては、ジオメトリ フィールドを参照してください。
サポートされているジオメトリ演算子
以下の表は Milvus で使用できるジオメトリ演算子の一覧です。
演算子名はすべて大文字またはすべて小文字にする必要があります。同じ演算子名に大文字と小文字を混在させないでください。
演算子 |
説明 |
例 |
|---|---|---|
|
2つのジオメトリが空間的に同一である場合に TRUE を返します。 |
2つの形状(AとB)は空間的に全く同じか? |
|
形状 A が形状 B を完全に含み、それらの内部が少なくとも 1 つの共通点を持つ場合に TRUE を返す。 |
都市の境界(A)は特定の公園(B)を含むか? |
|
形状 A と B が部分的に交差しているが、完全に含まれていない場合に TRUE を返す。 |
2つの道路(AとB)は交差点で交差しているか? |
|
ジオメトリAとBが少なくとも1つの共通点を持つ場合にTRUEを返す。これは最も一般的で広く使われている空間クエリです。 |
検索エリア(A)は店舗ロケーション(B)のいずれかと交差するか? |
|
ジオメトリ A と B が同じ次元で、部分的に重なり、どちらも他方を完全に含まない場合に TRUE を返す。 |
2つの土地区画(AとB)は重なっているか? |
|
ジオメトリ A と B が共通の境界を共有しているが、内部が交差していない場合に TRUE を返す。 |
隣接する2つの敷地(AとB)は境界を共有しているか? |
|
ジオメトリ A がジオメトリ B に完全に含まれ、それらの内部が少なくとも 1 つの共通点を持つ場合に TRUE を返します。これは |
指定された検索半径(B)内に特定の注目点(A)があるか。 |
|
ジオメトリ A とジオメトリ B の距離が指定された距離以下であれば TRUE を返す。 注:ジオメトリ B は現在ポイントのみをサポートしています。距離の単位はメートルです。 |
特定の点(B)から 5000 メートル以内のすべての点を検索します。 |
ST_EQUALS / st_equals
ST_EQUALS 演算子は、2 つのジオメトリが空間的に同一である場合、つまり点の集合と寸法が同じである場合に TRUE を返します。これは、格納されている 2 つのジオメトリ オブジェクトがまったく同じ位置と形状を表しているかどうかを確認するのに便利です。
例
ストアされたジオメトリ(点や多角形など)がターゲット ジオメトリとまったく同じかどうかを確認したいとします。例えば、保存されている点と特定の点を比較することができます。
# The filter expression to check if a geometry matches a specific point
filter = "ST_EQUALS(geo_field, 'POINT(10 20)')"
ST_CONTAINS / st_contains
ST_CONTAINS 演算子は、1 番目のジオメトリが 2 番目のジオメトリを完全に含む場合に TRUE を返します。これは、多角形内の点や、大きな多角形内の小さな多角形を見つけるのに便利です。
例
市区町村のコレクションがあり、指定した市区町村の境界内にある特定のポイント(レストランなど)を見つけたいとします。
# The filter expression to find geometries completely within a specific polygon.
filter = "ST_CONTAINS(geo_field, 'POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))')"
ST_CROSSES / st_crosses
ST_CROSSES 演算子は、2 つのジオメトリの交点が元のジオメトリよりも小さい次元のジオメトリを形成する場合、TRUE を返します。これは通常、多角形や他の線と交差する線に適用されます。
例
特定の境界線(別の線文字列)を横切るか、保護区域(ポリゴン)に入るすべてのハイキング・コース(線文字列)を見つけたい。
# The filter expression to find geometries that cross a line string.
filter = "ST_CROSSES(geo_field, 'LINESTRING(5 0, 5 10)')"
ST_INTERSECTS / st_intersects
ST_INTERSECTS 演算子は、2 つのジオメトリの境界または内部に共通点がある場合、TRUE を返します。これは、あらゆる形式の空間的な重なりを検出するための汎用演算子です。
例
道路のコレクションがあり、提案されている新しい道路を表す特定の線文字列を横切る、または接触するすべての道路を見つけたい場合、ST_INTERSECTS を使用できます。
# The filter expression to find geometries that intersect with a specific line string.
filter = "ST_INTERSECTS(geo_field, 'LINESTRING (1 1, 2 2)')"
ST_OVERLAPS / st_overlaps
ST_OVERLAPS 演算子は、同じ次元の2つのジオメトリが部分的に交差する場合、TRUE を返します。交差点自体は元のジオメトリと同じ次元ですが、どちらとも等しくありません。
例
重なっている販売地域のセットがあり、新しい販売地域案と部分的に重なっているすべての地域を見つけたい。
# The filter expression to find geometries that partially overlap with a polygon.
filter = "ST_OVERLAPS(geo_field, 'POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))')"
ST_TOUCHES / st_touches
ST_TOUCHES 演算子は、2 つのジオメトリの境界が接触しているが、内部が交差していない場合、TRUE を返します。これは隣接を検出するのに便利です。
例
不動産区画のマップがあり、公共公園に重複なく直接隣接する区画をすべて見つけたい場合。
# The filter expression to find geometries that only touch a line string at their boundaries.
filter = "ST_TOUCHES(geo_field, 'LINESTRING(0 0, 1 1)')"
ST_WITHIN / st_within
ST_WITHIN 演算子は、1 番目のジオメトリが 2 番目のジオメトリの内部または境界に完全に含まれる場合、TRUE を返します。これはST_CONTAINS の逆数です。
例
指定された大きな公園領域内にある小さな住宅地をすべて検索したい。
# The filter expression to find geometries that are completely within a larger polygon.
filter = "ST_WITHIN(geo_field, 'POLYGON((110 38, 115 38, 115 42, 110 42, 110 38))')"
GEOMETRY フィールドの使用方法の詳細については、ジオメトリ フィールドを参照してください。
ST_DWITHIN / st_dwithin
ST_DWITHIN 演算子は、ジオメトリ A とジオメトリ B の距離が指定された値(メートル単位)以下の場合にTRUE を返します。現在、ジオメトリ B は点でなければなりません。
例
店舗位置のコレクションがあり、特定の顧客の位置から 5,000 メートル以内のすべての店舗を検索したいとします。
# Find all stores within 5000 meters of the point (120 30)
filter = "ST_DWITHIN(geo_field, 'POINT(120 30)', 5000)"