Sdílet prostřednictvím


Logické operátory OData ve službě Azure AI Search – and, ornot

Výrazy filtru OData ve službě Azure AI Search jsou logické výrazy, které se vyhodnocují jako true nebo false. Složitý filtr můžete napsat tak, že napíšete řadu jednodušších filtrů a vytvoříte je pomocí logických operátorů z logické algebry:

  • and: Binární operátor, který se vyhodnocuje true , pokud se jeho levý i pravý dílčí výraz vyhodnotí jako true.
  • or: Binární operátor, který se vyhodnotí jako true jeden z jeho levého nebo pravého dílčího výrazu true.
  • not: Unární operátor, který se vyhodnotí true jako dílčí výraz falsea naopak.

Ty společně s operátory any kolekce a allumožňují vytvořit filtry, které mohou vyjádřit velmi složitá kritéria hledání.

Syntaxe

Následující ebNF (Extended Backus-Naur Form) definuje gramatiku výrazu OData, který používá logické operátory.

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

K dispozici je také interaktivní diagram syntaxe:

Existují dvě formy logických výrazů: binární (and/or), kde existují dva dílčí výrazy a unární (not), kde je jen jeden. Dílčí výrazy můžou být logické výrazy libovolného druhu:

  • Pole nebo proměnné rozsahu typu Edm.Boolean
  • Funkce, které vracejí hodnoty typu Edm.Boolean, například geo.intersects nebo search.ismatch
  • Porovnávací výrazy, například rating gt 4
  • Výrazy kolekce, například Rooms/any(room: room/Type eq 'Deluxe Room')
  • Logické literály true nebo false.
  • Jiné logické výrazy vytvořené pomocí and, ora not.

Důležité

V některých situacích se nedají použít and/orvšechny druhy dílčích výrazů, zejména uvnitř výrazů lambda. Podrobnosti najdete v tématu Operátory kolekce OData ve službě Azure AI Search .

Logické operátory a null

Většina logických výrazů, jako jsou funkce a porovnání, nemůže vytvořit null hodnoty a logické operátory nelze použít přímo na null literál (například x and null není povoleno). Logická pole však můžou být null, takže je třeba vědět, jak se andoroperátory a not operátory chovají v přítomnosti hodnoty null. Toto je shrnuto v následující tabulce, kde b je pole typu Edm.Boolean:

Výraz Výsledek, pokud b je 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

Když se v výrazu filtru zobrazí logické pole b , chová se, jako by bylo napsané b eq true, takže pokud b ano null, výraz se vyhodnotí jako false. Podobně se not b chová jako not (b eq true), takže se vyhodnotí jako true. Tímto způsobem null se pole chovají stejně jako false. To je konzistentní s tím, jak se chovají v kombinaci s jinými výrazy používajícími and a or, jak je znázorněno v tabulce výše. Navzdory tomu bude i nadále vyhodnoceno falsepřímé porovnání s false hodnotou (b eq false) . Jinými slovy, null není rovno false, i když se chová jako v logických výrazech.

Příklady

Porovná dokumenty, ve kterých je pole v rozsahu rating 3 až 5 včetně:

    rating ge 3 and rating le 5

Porovná dokumenty, ve kterých jsou všechny prvky ratings pole menší než 3 nebo větší než 5:

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

Porovná dokumenty, ve kterých location je pole v daném mnohoúhelníku, a dokument neobsahuje termín "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')

Shodovat dokumenty pro hotely ve Vancouveru, Kanada, kde je pokoj deluxe s základní sazbou nižší než 160:

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

Další kroky