Azure AI Search의 OData 지리 공간 함수 - geo.distancegeo.intersects

Azure AI Search는 및 함수를 통해 OData 필터 식에서 지리적 공간 쿼리를 geo.distancegeo.intersects 지원합니다. 이 함수는 geo.distance 두 점 사이의 거리를 킬로미터 단위로 반환합니다. 하나는 필드 또는 범위 변수이고 다른 하나는 필터의 일부로 전달되는 상수입니다. 지정된 geo.intersects 점이 지정된 다각형 내에 있으면 이 함수는 점이 필드 또는 범위 변수이고 다각형이 필터의 일부로 전달되는 상수로 지정된 경우를 반환 true 합니다.

geo.distance$orderby 매개 변수에서 함수를 사용하여 지정된 지점으로부터의 거리를 기준으로 검색 결과를 정렬할 수도 있습니다. $orderby 구문은 $filter 구문 geo.distance동일합니다. $orderby 사용할 geo.distance때 적용되는 필드는 형식 Edm.GeographyPoint 이어야 하며 정렬 가능해야 합니다.

참고 항목

$orderby 매개 변수에서 geo.distance를 사용하는 경우 함수에 전달하는 필드는 단일 지리 지점만 포함해야 합니다. 즉, Collection(Edm.GeographyPoint) 형식이 아닌 Edm.GeographyPoint 형식이어야 합니다. Azure AI Search에서 컬렉션 필드를 정렬할 수 없습니다.

구문

다음 EBNF(Extended Backus-Naur Form)는 함수 및 geo.intersects 함수의 geo.distance 문법과 해당 함수가 작동하는 지역 공간 값을 정의합니다.

geo_distance_call ::=
    'geo.distance(' variable ',' geo_point ')'
    | 'geo.distance(' geo_point ',' variable ')'

geo_point ::= "geography'POINT(" lon_lat ")'"

lon_lat ::= float_literal ' ' float_literal

geo_intersects_call ::=
    'geo.intersects(' variable ',' geo_polygon ')'

/* You need at least four points to form a polygon, where the first and
last points are the same. */
geo_polygon ::=
    "geography'POLYGON((" lon_lat ',' lon_lat ',' lon_lat ',' lon_lat_list "))'"

lon_lat_list ::= lon_lat(',' lon_lat)*

다음과 같은 대화형 구문 다이어그램도 사용할 수 있습니다.

참고 항목

전체 EBNF는 Azure AI Search에 대한 OData 식 구문 참조를 참조하세요.

geo.distance

이 함수는 geo.distance 형식 Edm.GeographyPoint 의 두 매개 변수를 Edm.Double 사용하고 두 매개 변수 사이의 거리(킬로미터)를 반환합니다. 이 서비스는 OData 지리 공간적 작업을 지원하고 일반적으로 미터 단위의 거리를 반환하는 다른 서비스와는 다릅니다.

매개 변수 중 하나는 지리 점 상수여야 하고 다른 매개 변수 geo.distance 는 필드 경로(또는 형식 Collection(Edm.GeographyPoint)필드를 반복하는 필터의 경우 범위 변수)여야 합니다. 이러한 매개 변수의 순서는 중요하지 않습니다.

지리 점 상수는 경도 및 위도가 숫자 상수인 형식 geography'POINT(<longitude> <latitude>)'입니다.

참고 항목

필터에서 geo.distance를 사용하는 경우 lt, le, gt 또는 ge를 사용하여 함수에서 반환된 거리와 상수를 비교해야 합니다. 연산 eq 자이며 ne 거리를 비교할 때 지원되지 않습니다. 예를 들어 geo.distance를 올바르게 사용하는 방법은 $filter=geo.distance(location, geography'POINT(-122.131577 47.678581)') le 5입니다.

geo.intersects

함수는 geo.intersects 형식 Edm.GeographyPoint 및 상수 Edm.GeographyPolygon 의 변수를 사용하고 점이 다각형 false 의 범위 내에 있으면 반환trueEdm.Boolean -- 합니다.

다각형은 경계 링을 정의하는 점 시퀀스로 저장된 2차원 표면입니다(아래 예제 참조). 다각형은 닫혀야 합니다. 즉, 첫 번째 점과 마지막 점 세트가 같아야 합니다. 다각형의 점이 시계 반대 방향으로 정렬되어야 합니다.

180번째 자오선에 걸친 지리 공간 쿼리 및 다각형

많은 지리 공간적 쿼리 라이브러리의 경우 경도 180도(날짜 변경선 근처)를 포함하는 쿼리를 작성하는 것이 금지되거나 다각형을 자오선 양쪽에 하나씩 2개로 분할하는 것과 같은 대체 방법이 필요합니다.

Azure AI Search에서 180도 경도를 포함하는 지리적 공간 쿼리는 쿼리 셰이프가 직사각형이고 좌표가 경도 및 위도(예 geo.intersects(location, geography'POLYGON((179 65, 179 66, -179 66, -179 65, 179 65))': )를 따라 그리드 레이아웃에 정렬되는 경우 예상대로 작동합니다. 그렇지 않은 경우 사각형이 아닌 도형이나 정렬되지 않은 도형의 경우 분할된 다각형 접근 방법을 고려해야 합니다.

지역 공간 함수 및 null

Azure AI Search의 다른 모든 비 컬렉션 필드와 마찬가지로 형식 Edm.GeographyPoint 필드에는 값이 포함될 null 수 있습니다. Azure AI Search에서 geo.intersects 필드가 평가되면 null결과는 항상 다음과 같습니다 false. 이 경우 동작 geo.distance 은 컨텍스트에 따라 달라집니다.

  • 필터 geo.distance 에서 필드의 결과는 . null 입니다 null. 즉, Null이 아닌 값과 null을 비교하면 false로 평가되기 때문에 문서가 일치하지 않습니다.
  • $orderby를 사용하여 결과를 정렬하는 경우 null 필드의 geo.distance는 가능한 최대 거리가 됩니다. 이러한 필드가 있는 문서는 정렬 방향이 사용될 때 다른 모든 문서보다 낮게 정렬되고(기본값), 방향 ascdesc이 다른 모든 문서보다 높습니다.

예제

필터 예시

지정된 참조 지점(위치가 형식 Edm.GeographyPoint필드)에서 10km 이내의 모든 호텔을 찾습니다.

    geo.distance(location, geography'POINT(-122.131577 47.678581)') le 10

다각형(위치가 형식 Edm.GeographyPoint필드)으로 설명된 지정된 뷰포트 내의 모든 호텔을 찾습니다. 다각형은 닫혀 있고 (첫 번째 및 마지막 점 집합은 동일해야 함) 점이 시계 반대 방향으로 나열되어야 합니다.

    geo.intersects(location, geography'POLYGON((-122.031577 47.578581, -122.031577 47.678581, -122.131577 47.678581, -122.031577 47.578581))')

Order-by 예제

호텔을 rating 내림차순으로 정렬한 다음, 지정된 좌표에서의 거리 오름차순으로 정렬합니다.

    rating desc,geo.distance(location, geography'POINT(-122.131577 47.678581)') asc

호텔을 search.scorerating 내림차순으로 정렬한 다음, 지정된 좌표에서의 거리로 오름차순 정렬하여 등급이 같은 두 호텔 중에서 가장 가까운 호텔이 먼저 나열되도록 합니다.

    search.score() desc,rating desc,geo.distance(location, geography'POINT(-122.131577 47.678581)') asc

다음 단계