Azure Cognitive Search의 OData 논리 연산자 - and, or, not

Azure Cognitive Search의 OData 필터 식true 또는 false로 평가되는 부울 식입니다. 일련의 단순 필터를 작성하고 부울 대수의 논리 연산자로 복합 필터를 구성하여 복합 필터를 작성할 수 있습니다.

  • and: 왼쪽 및 오른쪽 하위 식이 모두 true로 평가되면 true로 평가되는 이항 연산자입니다.
  • or: 왼쪽 및 오른쪽 하위 식 중 하나가 true로 평가되면 true로 평가되는 이항 연산자입니다.
  • not: 하위 식이 false로 평가되면 true로 평가되고 그 반대의 경우도 마찬가지인 단항 연산자입니다.

컬렉션 연산자 anyall과 함께 위의 연산자를 사용하면 매우 복잡한 검색 조건을 표현할 수 있는 필터를 생성할 수 있습니다.

구문

다음 EBNF(Extended Backus-Naur Form)는 논리 연산자를 사용하는 OData 식의 문법을 정의합니다.

logical_expression ::=
    boolean_expression ('and' | 'or') boolean_expression
    | 'not' boolean_expression

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

참고

전체 EBNF는 Azure Cognitive 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을 사용하여 생성된 다른 논리 식

중요

특히 람다 식 내에서는 and/or과 함께 모든 종류의 하위 식을 사용할 수 없는 경우도 있습니다. 자세한 내용은 Azure Cognitive Search의 OData 컬렉션 연산자를 참조하세요.

논리 연산자 및 null

함수 및 비교와 같은 대부분의 부울 식은 null 값을 생성할 수 없으며 null 리터럴에 직접 논리 연산자를 적용할 수 없습니다(예: x and null은 허용되지 않음). 그러나 부울 필드는 null이 될 수 있으므로 Null이 있는 경우 and, or, not 연산자가 어떻게 동작하는지를 알고 있어야 합니다. 이 내용은 다음 표에 요약되어 있습니다. 여기서 bEdm.Boolean 형식의 필드입니다.

bnull인 경우의 결과
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는 필터 식에 단독으로 표시되는 경우 b eq true로 작성된 것처럼 동작하므로 bnull이면 식이 false로 평가됩니다. 마찬가지로, not bnot (b eq true)처럼 동작하므로 true로 평가됩니다. 이런 방식으로 null 필드는 false와 동일하게 동작합니다. 이 동작은 위의 표와 같이 andor를 사용하여 다른 식과 결합될 때의 동작과 일치합니다. 하지만 false와 직접 비교하는 경우(b eq false)에도 false로 평가됩니다. 즉, null은 부울 식에서 false처럼 동작하지만 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)

다음 단계