Azure Cognitive Search의 OData 컬렉션 연산자 - any
및 all
Azure Cognitive Search 사용할 OData 필터 식을 작성할 때 컬렉션 필드를 필터링하는 것이 유용한 경우가 많습니다. 이 용도로 any
및 all
연산자를 사용할 수 있습니다.
구문
다음 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.ismatch 와 search.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)에서 and 와 or 의 조합을 사용하는 식 |
eq , ne , lt , gt , le 또는 ge 를 사용하여 비교 and 를 사용하여 다른 하위 식과 비교 결합 or 을 사용하여 eq 를 제외한 다른 하위 식과 비교 결합 CNF(Conjunctive Normal Form)에서 and 와 or 의 조합을 사용하는 식 |
이 제한 사항에 대한 자세한 내용과 예제는 Azure Cognitive Search에서 컬렉션 필터 문제 해결을 참조하세요. 제한 사항이 있는 이유에 대한 자세한 내용은 Azure Cognitive Search의 컬렉션 필터 이해를 참조하세요.