Azure AI Search의 OData 컬렉션 연산자 - any
및 all
Azure AI Search와 함께 사용할 OData 필터 식을 작성할 때 컬렉션 필드를 필터링하는 것이 유용한 경우가 많습니다. 이 작업은 연산자와 all
연산자를 any
사용하여 수행할 수 있습니다.
구문
다음 EBNF(Extended Backus-Naur Form)는 사용하거나 all
사용하는 any
OData 식의 문법을 정의합니다.
collection_filter_expression ::=
field_path'/all(' lambda_expression ')'
| field_path'/any(' lambda_expression ')'
| field_path'/any()'
lambda_expression ::= identifier ':' boolean_expression
다음과 같은 대화형 구문 다이어그램도 사용할 수 있습니다.
참고 항목
전체 EBNF는 Azure AI Search의 OData 식 구문 참조를 참조하세요.
컬렉션을 필터링하는 식에는 세 가지 형식이 있습니다.
- 처음 두 개는 컬렉션 필드를 반복하여 람다 식의 형식으로 제공된 조건자를 각 컬렉션 요소에 적용합니다.
- 조건자가 컬렉션의 모든 요소에 대해 true이면 반환
true
을 사용하는all
식입니다. - 조건자가 컬렉션의 하나 이상의 요소에 대해 true이면 반환
true
을 사용하는any
식입니다.
- 조건자가 컬렉션의 모든 요소에 대해 true이면 반환
- 세 번째 형태의 컬렉션 필터는 람다 식 없이 사용하여
any
컬렉션 필드가 비어 있는지 여부를 테스트합니다. 컬렉션에 요소가 있으면 반환됩니다true
. 컬렉션이 비어 있으면 해당 컬렉션이 반환됩니다false
.
컬렉션 필터의 람다 식은 프로그래밍 언어의 루프 본문과 같습니다. 반복하는 동안 컬렉션의 현재 요소를 보유하는 범위 변수라는 변수를 정의합니다. 또한 각 컬렉션 요소의 범위 변수에 적용할 필터 기준이 되는 또 다른 부울 식을 정의합니다.
예제
필드에 정확히 문자열 "wifi"가 포함된 문서를 tags
일치합니다.
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 AI Search의 컬렉션 필터 문제 해결을 참조하세요. 이러한 제한 사항이 존재하는 이유에 대한 자세한 내용은 Azure AI Search의 컬렉션 필터 이해를 참조하세요.