OData logikai operátorok az Azure AI Searchben – and
, , or
not
Az Azure AI Search OData-szűrőkifejezései olyan logikai kifejezések, amelyek kiértékelése vagy true
false
kiértékelése. Összetett szűrőt egyszerűbb szűrők megírásával és logikai algebra logikai operátorainak megírásával írhat:
and
: Egy bináris operátor, amely kiértékeli, hogytrue
a bal és a jobb oldali alkifejezések is atrue
.or
: Egy bináris operátor, amely kiértékeli, hogytrue
a bal vagy a jobb oldali alkifejezések egyikének értéke a következő lesztrue
.not
: Egy unary operátor, amely kiértékeli, hogytrue
az alkifejezése kiértékeli-e,false
és fordítva.
Ezek a gyűjtemény operátoraival any
all
együtt lehetővé teszik olyan szűrők összeállítását, amelyek nagyon összetett keresési feltételeket képesek kifejezni.
Syntax
A következő EBNF (Extended Backus-Naur Form) a logikai operátorokat használó OData-kifejezés nyelvtanát határozza meg.
logical_expression ::=
boolean_expression ('and' | 'or') boolean_expression
| 'not' boolean_expression
Interaktív szintaxisdiagram is elérhető:
Feljegyzés
A teljes EBNF-hez tekintse meg az Azure AI Search OData-kifejezésszintaxis-hivatkozását.
A logikai kifejezéseknek két formája van: bináris (and
/or
), ahol két alkifejezés van, és unary (not
), ahol csak egy van. Az alkifejezések tetszőleges logikai kifejezések lehetnek:
- Típusú mezők vagy tartományváltozók
Edm.Boolean
- Olyan függvények, amelyek típusértékeket
Edm.Boolean
adnak vissza, példáulgeo.intersects
vagysearch.ismatch
- Összehasonlító kifejezések, például
rating gt 4
- Gyűjteménykifejezések, például
Rooms/any(room: room/Type eq 'Deluxe Room')
- Logikai literálok
true
vagyfalse
. - Az ,
or
ésnot
a . használatávaland
létrehozott egyéb logikai kifejezések.
Fontos
Vannak olyan helyzetek, amikor nem minden alkifejezés használható and
/or
, különösen a lambda kifejezéseken belül. Részletekért tekintse meg az OData-gyűjtemény operátorainak adatait az Azure AI Searchben .
Logikai operátorok és null
A legtöbb logikai kifejezés, például a függvények és az összehasonlítások nem hozhatnak létre null
értékeket, és a logikai operátorok nem alkalmazhatók közvetlenül a null
literálra (például x and null
nem engedélyezett). A logikai mezők azonban lehetnek null
, ezért tisztában kell lennie azzal, hogy a , or
és not
az and
operátorok hogyan viselkednek null érték jelenlétében. Ezt a következő táblázatban foglaljuk össze, ahol b
egy típusmező Edm.Boolean
található:
Expression | Eredmény, ha 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 |
Amikor egy logikai mező b
önmagában jelenik meg egy szűrőkifejezésben, úgy viselkedik, mintha megírták b eq true
volna , tehát ha b
igen null
, akkor a kifejezés kiértékelése false
. Hasonlóképpen viselkedik not (b eq true)
, not b
így kiértékeli a .true
Így a mezők ugyanúgy viselkednek, null
mint false
a . Ez összhangban van azzal, hogy hogyan viselkednek más kifejezésekkel and
kombinálva, és or
a fenti táblázatban látható módon. Ennek ellenére a (b eq false
)-hez false
való közvetlen összehasonlítás továbbra is a következő leszfalse
: . Más szóval nem egyenlő, false
még akkor sem, null
ha logikai kifejezésekben ugyanúgy viselkedik.
Példák
Egyeznie kell azokkal a dokumentumokkal, ahol a rating
mező 3 és 5 között van, beleértve a következőt:
rating ge 3 and rating le 5
Egyezik azokkal a dokumentumokkal, amelyekben a ratings
mező összes eleme 3-nál kisebb vagy 5-nél nagyobb:
ratings/all(r: r lt 3 or r gt 5)
Egyezik azokkal a dokumentumokkal, amelyekben a location
mező az adott sokszögön belül van, és a dokumentum nem tartalmazza a "public" kifejezést.
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')
Egyeztesd a kanadai Vancouver szállodáinak dokumentumait, ahol egy 160-nál alacsonyabb alapkamattal rendelkező deluxe szoba található:
Address/City eq 'Vancouver' and Address/Country eq 'Canada' and Rooms/any(room: room/Type eq 'Deluxe Room' and room/BaseRate lt 160)