Operadores geométricosCompatible with Milvus 2.6.4+
Milvus admite un conjunto de operadores para el filtrado espacial en los campos GEOMETRY, que son esenciales para gestionar y analizar datos geométricos. Estos operadores permiten recuperar entidades basándose en las relaciones geométricas entre objetos.
Todos los operadores geométricos funcionan tomando dos argumentos geométricos: el nombre del campo GEOMETRY definido en el esquema de su colección y un objeto geométrico de destino representado en formato Well-Known Text (WKT).
Sintaxis de uso
Para filtrar en un campo GEOMETRY, utilice un operador geométrico en una expresión:
General:
{operator}(geo_field, '{wkt}')Basado en la distancia:
ST_DWITHIN(geo_field, '{wkt}', distance)
Donde
operatores uno de los operadores geométricos admitidos (por ejemplo,ST_CONTAINS,ST_INTERSECTS). Los nombres de los operadores deben estar en mayúsculas o minúsculas. Para obtener una lista de los operadores admitidos, consulte Operadores de geometría admitidos.geo_fieldes el nombre del campoGEOMETRY.'{wkt}'es la representación WKT de la geometría a consultar.distancees el umbral específico deST_DWITHIN.
Para obtener más información sobre los campos GEOMETRY en Milvus, consulte Campo geométrico.
Operadores de geometría admitidos
La siguiente tabla enumera los operadores de geometría disponibles en Milvus.
Los nombres de los operadores deben estar en mayúsculas o minúsculas. No mezcle mayúsculas y minúsculas dentro del mismo nombre de operador.
Operador |
Descripción |
Ejemplo |
|---|---|---|
|
Devuelve TRUE si dos geometrías son espacialmente idénticas, lo que significa que tienen el mismo conjunto de puntos y dimensión. |
¿Son dos geometrías (A y B) exactamente iguales en el espacio? |
|
Devuelve TRUE si la geometría A contiene completamente a la geometría B, teniendo sus interiores al menos un punto en común. |
¿Contiene un límite urbano (A) a un parque concreto (B)? |
|
Devuelve TRUE si las geometrías A y B se intersecan parcialmente pero no se contienen completamente. |
¿Se cruzan dos carreteras (A y B) en una intersección? |
|
Devuelve TRUE si las geometrías A y B tienen al menos un punto en común. Se trata de la consulta espacial más general y más utilizada. |
¿Se cruza una zona de búsqueda (A) con alguna de las ubicaciones de las tiendas (B)? |
|
Devuelve TRUE si las geometrías A y B tienen la misma dimensión, se solapan parcialmente y ninguna contiene totalmente a la otra. |
¿Se solapan dos terrenos (A y B)? |
|
Devuelve TRUE si las geometrías A y B comparten un límite común pero sus interiores no se cruzan. |
¿Comparten frontera dos propiedades vecinas (A y B)? |
|
Devuelve TRUE si la geometría A está completamente contenida dentro de la geometría B, teniendo sus interiores al menos un punto en común. Es la inversa de |
¿Se encuentra un punto de interés concreto (A) dentro de un radio de búsqueda definido (B)? |
|
Devuelve TRUE si la distancia entre la geometría A y la geometría B es menor o igual que la distancia especificada. Nota: Actualmente, la geometría B sólo admite puntos. La unidad de distancia es el metro. |
Encuentra todos los puntos dentro de 5000 metros de un punto específico (B). |
ST_EQUALS / st_iguales
El operador ST_EQUALS devuelve TRUE si dos geometrías son espacialmente idénticas, lo que significa que tienen el mismo conjunto de puntos y dimensión. Esto es útil para verificar si dos objetos geométricos almacenados representan exactamente la misma ubicación y forma.
Ejemplo
Supongamos que desea comprobar si una geometría almacenada (como un punto o un polígono) es exactamente igual a una geometría de destino. Por ejemplo, puede comparar un punto almacenado con un punto de interés específico.
# The filter expression to check if a geometry matches a specific point
filter = "ST_EQUALS(geo_field, 'POINT(10 20)')"
ST_CONTAINS / st_contains
El operador ST_CONTAINS devuelve TRUE si la primera geometría contiene completamente a la segunda. Esto es útil para encontrar puntos dentro de un polígono, o polígonos más pequeños dentro de uno más grande.
Ejemplo
Imagine que dispone de una colección de distritos urbanos y desea encontrar un punto de interés específico, como un restaurante, que se encuentre dentro de los límites de un distrito determinado.
# 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
El operador ST_CROSSES devuelve TRUE si la intersección de dos geometrías forma una geometría con una dimensión inferior a las geometrías originales. Esto se aplica típicamente a una línea que cruza un polígono u otra línea.
Ejemplo
Desea encontrar todas las rutas de senderismo (cadenas de líneas) que cruzan una línea límite específica (otra cadena de líneas) o entran en una zona protegida (polígono).
# 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
El operador ST_INTERSECTS devuelve TRUE si dos geometrías tienen algún punto de sus límites o interiores en común. Se trata de un operador de uso general para detectar cualquier forma de solapamiento espacial.
Ejemplo
Si tiene una colección de carreteras y desea encontrar todas las carreteras que cruzan o tocan una cadena de líneas específica que representa una nueva carretera propuesta, puede utilizar 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
El operador ST_OVERLAPS devuelve TRUE si dos geometrías de la misma dimensión tienen una intersección parcial, donde la intersección en sí tiene la misma dimensión que las geometrías originales, pero no es igual a ninguna de ellas.
Ejemplo
Tiene un conjunto de regiones de venta superpuestas y desea encontrar todas las regiones que se superponen parcialmente con una nueva zona de venta propuesta.
# 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_TOQUES / st_touches
El operador ST_TOUCHES devuelve TRUE si los límites de dos geometrías se tocan, pero sus interiores no se intersecan. Esto es útil para detectar adyacencias.
Ejemplo
Si dispone de un mapa de parcelas inmobiliarias y desea encontrar todas las parcelas que son directamente adyacentes a un parque público sin que se solapen.
# 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
El operador ST_WITHIN devuelve TRUE si la primera geometría está completamente dentro del interior o en el límite de la segunda geometría. Es el inverso de ST_CONTAINS.
Ejemplo
Desea encontrar todas las zonas residenciales pequeñas que se encuentran completamente dentro de una zona de parque designada más grande.
# 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))')"
Para obtener más información sobre cómo utilizar un campo GEOMETRY, consulte Campo de geometría.
ST_DWITHIN / st_dwithin
El operador ST_DWITHIN devuelve TRUE si la distancia entre la geometría A y la geometría B es menor o igual que un valor especificado (en metros). Actualmente, la geometría B debe ser un punto.
Ejemplo
Supongamos que dispone de una colección de ubicaciones de tiendas y desea encontrar todas las tiendas situadas a menos de 5.000 metros de la ubicación de un cliente concreto.
# Find all stores within 5000 meters of the point (120 30)
filter = "ST_DWITHIN(geo_field, 'POINT(120 30)', 5000)"