Azure Cognitive Search의 OData 컬렉션 연산자 - anyall

Azure Cognitive Search 사용할 OData 필터 식을 작성할 때 컬렉션 필드를 필터링하는 것이 유용한 경우가 많습니다. 이 용도로 anyall 연산자를 사용할 수 있습니다.

구문

다음 EBNF(Extended Backus-Naur Form)는 any 또는 all을 사용하는 OData 식의 문법을 정의합니다.

collection_filter_expression ::=
    field_path'/all(' lambda_expression ')'
    | field_path'/any(' lambda_expression ')'
    | field_path'/any()'

lambda_expression ::= identifier ':' boolean_expression

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

참고

전체 EBNF는 Azure Cognitive Search의 OData 식 구문 참조를 참조하세요.

컬렉션을 필터링하는 식에는 세 가지 형식이 있습니다.

  • 처음 두 개는 컬렉션 필드를 반복하여 람다 식의 형식으로 제공된 조건자를 각 컬렉션 요소에 적용합니다.
    • all을 사용하는 식은 컬렉션의 모든 요소에 대해 조건자가 true인 경우 true를 반환합니다.
    • any를 사용하는 식은 컬렉션의 요소 중 하나에 대해 조건자가 true인 경우 true를 반환합니다.
  • 세 번째 형식의 컬렉션 필터는 람다 식 없이 any를 사용하여 컬렉션 필드가 비어 있는지 여부를 테스트합니다. 컬렉션에 요소가 있으면 true를 반환합니다. 컬렉션이 비어 있으면 false를 반환합니다.

컬렉션 필터의 람다 식은 프로그래밍 언어의 루프 본문과 같습니다. 반복하는 동안 컬렉션의 현재 요소가 포함되는 범위 변수라는 변수를 정의합니다. 또한 각 컬렉션 요소의 범위 변수에 적용할 필터 기준이 되는 또 다른 부울 식을 정의합니다.

tags 필드에 “wifi” 문자열이 정확히 포함된 문서를 찾습니다.

tags/any(t: t eq 'wifi')

ratings 필드의 모든 요소가 3~5(포함) 사이인 문서를 찾습니다.

ratings/all(r: r ge 3 and r le 5)

locations 필드의 지역 좌표 중 하나가 지정된 다각형 내에 있는 문서를 찾습니다.

locations/any(loc: geo.intersects(loc, geography'POLYGON((-122.031577 47.578581, -122.031577 47.678581, -122.131577 47.678581, -122.031577 47.578581))'))

rooms 필드가 비어 있는 문서를 찾습니다.

not rooms/any()

필드가 rooms/amenities "tv" rooms/baseRate 를 포함하고 100 미만인 문서를 일치합니다.

rooms/all(room: room/amenities/any(a: a eq 'tv') and room/baseRate lt 100.0)

제한 사항

필터 식의 모든 기능을 람다 식의 본문 내에서 사용할 수 있는 것은 아닙니다. 필터링하려는 컬렉션 필드의 데이터 형식에 따라 제한 사항이 다릅니다. 다음 표에는 제한 사항이 요약되어 있습니다.

데이터 형식 any가 있는 람다 식에서 허용되는 기능 all이 있는 람다 식에서 허용되는 기능
Collection(Edm.ComplexType) search.ismatchsearch.ismatchscoring을 제외한 모든 항목 동일
Collection(Edm.String) eq 또는 search.in과 비교

하위 식과 or 결합
ne 또는 not search.in()과 비교

하위 식과 and 결합
Collection(Edm.Boolean) eq 또는 ne와 비교 동일
Collection(Edm.GeographyPoint) lt 또는 le와 함께 geo.distance 사용

geo.intersects

하위 식과 or 결합
gt 또는 ge와 함께 geo.distance 사용

not geo.intersects(...)

하위 식과 and 결합
Collection(Edm.DateTimeOffset), Collection(Edm.Double), Collection(Edm.Int32), Collection(Edm.Int64) eq, ne, lt, gt, le 또는 ge를 사용하여 비교

or를 사용하여 다른 하위 식과 비교 결합

and를 사용하여 ne를 제외한 다른 하위 식과 비교 결합

DNF(Disjunctive Normal Form)에서 andor의 조합을 사용하는 식
eq, ne, lt, gt, le 또는 ge를 사용하여 비교

and를 사용하여 다른 하위 식과 비교 결합

or을 사용하여 eq를 제외한 다른 하위 식과 비교 결합

CNF(Conjunctive Normal Form)에서 andor의 조합을 사용하는 식

이 제한 사항에 대한 자세한 내용과 예제는 Azure Cognitive Search에서 컬렉션 필터 문제 해결을 참조하세요. 제한 사항이 있는 이유에 대한 자세한 내용은 Azure Cognitive Search의 컬렉션 필터 이해를 참조하세요.

다음 단계