Azure AI Search의 OData 논리 연산자 - and
, or
not
Azure AI Search의 OData 필터 식은 평가 true
되는 부울 식입니다 false
. 일련의 간단한 필터를 작성하고 부울 대수의 논리 연산자를 사용하여 작성하여 복잡한 필터를 작성할 수 있습니다.
and
: 왼쪽 및 오른쪽 하위 식이 모두true
로 평가되면true
로 평가되는 이항 연산자입니다.or
: 왼쪽 및 오른쪽 하위 식 중 하나가true
로 평가되면true
로 평가되는 이항 연산자입니다.not
: 하위 식이 계산되는지 또는 그 반대로 계산되는지를 평가하는true
false
단항 연산자입니다.
컬렉션 연산 any
자와 all
함께 매우 복잡한 검색 조건을 표현할 수 있는 필터를 생성할 수 있습니다.
구문
다음 EBNF(Extended Backus-Naur Form)는 논리 연산자를 사용하는 OData 식의 문법을 정의합니다.
logical_expression ::=
boolean_expression ('and' | 'or') boolean_expression
| 'not' boolean_expression
다음과 같은 대화형 구문 다이어그램도 사용할 수 있습니다.
참고 항목
전체 EBNF는 Azure AI Search의 OData 식 구문 참조를 참조하세요.
논리 식에는 두 개의 하위 식이 있는 이진(and
/or
)과 단항식(not
)의 두 가지 형태가 있습니다. 여기서는 하나만 있습니다. 하위 식은 모든 종류의 부울 식일 수 있습니다.
- 형식의 필드 또는 범위 변수
Edm.Boolean
- 형식
Edm.Boolean
의 값을 반환하는 함수(예:geo.intersects
)search.ismatch
- 비교 식(예:
rating gt 4
) - 컬렉션 식(예: )
Rooms/any(room: room/Type eq 'Deluxe Room')
- 부울 리터럴
true
또는false
- 를 사용하여
and
or
생성된 기타 논리 식 및not
.
Important
특히 람다 식 내에서는 and
/or
과 함께 모든 종류의 하위 식을 사용할 수 없는 경우도 있습니다. 자세한 내용은 Azure AI Search의 OData 컬렉션 연산자를 참조하세요.
논리 연산자 및 null
함수 및 비교와 같은 대부분의 부울 식은 값을 생성 null
할 수 없으며 논리 연산자는 리터럴에 null
직접 적용할 수 없습니다(예 x and null
: 허용되지 않음). 그러나 부울 필드는 될 null
수 있으므로 null이 있을 때 , or
및 not
연산자가 어떻게 동작하는지 and
알고 있어야 합니다. 다음 표에 요약되어 있습니다. 여기서 b
형식 Edm.Boolean
의 필드는 다음과 같습니다.
식 | b 가 null 인 경우의 결과 |
---|---|
b |
false |
not b |
true |
b eq true |
false |
b eq false |
false |
b eq null |
true |
b ne true |
true |
b ne false |
true |
b ne null |
false |
b and true |
false |
b and false |
false |
b or true |
true |
b or false |
false |
부울 필드가 필터 식에 단독으로 나타나면 마치 부울 필드가 작성된 b eq true
것처럼 동작하므로,이 경우 b
null
식이 계산됩니다false
.b
마찬가지로 다음과 not b
같이 not (b eq true)
동작하므로 .로 true
평가됩니다. 이러한 방식으로 null
필드는 .와 동일하게 false
동작합니다. 이는 위 표와 같이 사용 and
및 다른 식과 결합할 때 동작하는 방식과 or
일치합니다. 하지만 false
와 직접 비교하는 경우(b eq false
)에도 false
로 평가됩니다. 즉, null
부울 식에서처럼 동작하더라도 같지 false
않습니다.
예제
필드가 rating
3에서 5 사이인 문서(포함) 일치:
rating ge 3 and rating le 5
ratings
필드의 모든 요소가 3보다 작거나 5보다 큰 문서를 찾습니다.
ratings/all(r: r lt 3 or r gt 5)
location
필드가 지정된 다각형 내에 있고 문서에 “public”이라는 용어가 포함되지 않은 문서를 찾습니다.
geo.intersects(location, geography'POLYGON((-122.031577 47.578581, -122.031577 47.678581, -122.131577 47.678581, -122.031577 47.578581))') and not search.ismatch('public')
기본 요금이 160 미만인 deluxe 객실이 있는 캐나다 밴쿠버 호텔의 문서를 찾습니다.
Address/City eq 'Vancouver' and Address/Country eq 'Canada' and Rooms/any(room: room/Type eq 'Deluxe Room' and room/BaseRate lt 160)