Operatory logiczne OData w usłudze Azure AI Search — and, , ornot

Wyrażenia filtru OData w usłudze Azure AI Search to wyrażenia logiczne, które oceniają wartość lub truefalse. Możesz napisać złożony filtr, pisząc serię prostszych filtrów i tworząc je przy użyciu operatorów logicznych z algebry logicznej:

  • and: operator binarny, który ocenia, true czy wyrażenie podrzędne po lewej i prawej stronie truedaje wartość .
  • or: operator binarny, który ocenia true , czy jedno z jej wyrażeń podrzędnych po lewej lub prawej stronie truedaje wartość .
  • not: jednoargumentowy operator, który ocenia true , czy jego wyrażenie podrzędne falsedaje w wyniku wartość , i na odwrót.

Razem z operatorami any kolekcji i allumożliwiają konstruowanie filtrów, które mogą wyrażać bardzo złożone kryteria wyszukiwania.

Składnia

Poniższy formularz EBNF (rozszerzony formularz Backus-Naur) definiuje gramatykę wyrażenia OData korzystającego z operatorów logicznych.

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

Dostępny jest również interakcyjny diagram składni:

Uwaga

Zobacz dokumentację składni wyrażeń OData dla usługi Azure AI Search , aby zapoznać się z pełną pełną NF.

Istnieją dwie formy wyrażeń logicznych: binarne (and/or), gdzie istnieją dwa wyrażenia podrzędne i jednoargumentowe (not), gdzie istnieje tylko jeden. Wyrażenia podrzędne mogą być wyrażeniami logicznymi dowolnego rodzaju:

  • Pola lub zmienne zakresu typu Edm.Boolean
  • Funkcje zwracające wartości typu Edm.Boolean, takie jak geo.intersects lub search.ismatch
  • Wyrażenia porównania, takie jak rating gt 4
  • Wyrażenia kolekcji, takie jak Rooms/any(room: room/Type eq 'Deluxe Room')
  • Literały true logiczne lub false.
  • Inne wyrażenia logiczne skonstruowane przy użyciu poleceń and, ori not.

Ważne

Istnieją sytuacje, w których nie wszystkie rodzaje wyrażenia podrzędnego mogą być używane z wyrażeniami and/orlambda, szczególnie wewnątrz wyrażeń lambda. Aby uzyskać szczegółowe informacje, zobacz Operatory kolekcji OData w usłudze Azure AI Search .

Operatory logiczne i null

Większość wyrażeń logicznych, takich jak funkcje i porównania, nie może wygenerować null wartości, a operatory logiczne nie mogą być stosowane bezpośrednio do null literału (na przykład x and null nie jest dozwolone). Jednak pola logiczne mogą mieć nullwartość , więc musisz wiedzieć, jak andoperatory , ori not zachowują się w obecności wartości null. Jest to podsumowanie w poniższej tabeli, gdzie b jest polem typu Edm.Boolean:

Expression Wynik, gdy b jest 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

Gdy pole b logiczne jest wyświetlane samodzielnie w wyrażeniu filtru, zachowuje się tak, jakby zostało zapisane b eq true, więc jeśli b ma nullwartość , wyrażenie daje wartość false. not b Podobnie zachowuje się tak, jak not (b eq true), więc ocenia wartość .true W ten sposób null pola zachowują się tak samo jak false. Jest to zgodne z zachowaniem w połączeniu z innymi wyrażeniami przy użyciu poleceń and i or, jak pokazano w powyższej tabeli. Pomimo tego bezpośrednie porównanie z false (b eq false) nadal będzie oceniać wartość false. Innymi słowy, null nie jest równa false, mimo że zachowuje się jak w wyrażeniach logicznych.

Przykłady

Dopasuj rating dokumenty z zakresu od 3 do 5 włącznie:

    rating ge 3 and rating le 5

Dopasuj dokumenty, w których wszystkie elementy ratings pola są mniejsze niż 3 lub większe niż 5:

    ratings/all(r: r lt 3 or r gt 5)

Dopasuj location dokumenty, w których pole znajduje się w danym wielokącie, a dokument nie zawiera terminu "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')

Dopasuj dokumenty dla hoteli w Vancouver, Kanada, gdzie znajduje się pokój typu deluxe z stawką podstawową mniejszą niż 160:

    Address/City eq 'Vancouver' and Address/Country eq 'Canada' and Rooms/any(room: room/Type eq 'Deluxe Room' and room/BaseRate lt 160)

Następne kroki