Operatori logici OData in Ricerca di intelligenza artificiale di Azure - and
, or
, not
Le espressioni di filtro OData in Ricerca di intelligenza artificiale di Azure sono espressioni booleane che restituiscono true
o false
. È possibile scrivere un filtro complesso scrivendo una serie di filtri più semplici e componendoli usando gli operatori logici dell'algebra booleana:
and
: operatore binario che restituiscetrue
se le espressioni secondarie a sinistra e destra restituisconotrue
.or
: operatore binario che restituiscetrue
se una delle relative espressioni secondarie sinistra o destra restituiscetrue
.not
: operatore unario che restituiscetrue
se la sottoespressione restituiscefalse
e viceversa.
Questi, insieme agli operatori any
di raccolta e all
, consentono di costruire filtri che possono esprimere criteri di ricerca molto complessi.
Sintassi
Il seguente EBNF (Extended Backus-Naur Form) definisce la grammatica di un'espressione OData che usa gli operatori logici.
logical_expression ::=
boolean_expression ('and' | 'or') boolean_expression
| 'not' boolean_expression
È disponibile anche un diagramma di sintassi interattivo:
Nota
Vedere Informazioni di riferimento sulla sintassi delle espressioni OData per Azure AI Search per l'EBNF completo.
Esistono due forme di espressioni logiche: binary (and
/or
), dove sono presenti due espressioni secondarie e unarie (not
), dove ne esiste una sola. Le espressioni secondarie possono essere espressioni booleane di qualsiasi tipo:
- Campi o variabili di intervallo di tipo
Edm.Boolean
- Funzioni che restituiscono valori di tipo
Edm.Boolean
, ad esempiogeo.intersects
osearch.ismatch
- Espressioni di confronto, ad esempio
rating gt 4
- Espressioni di raccolta, ad esempio
Rooms/any(room: room/Type eq 'Deluxe Room')
- Valori letterali booleani
true
ofalse
. - Altre espressioni logiche costruite usando
and
,or
enot
.
Importante
Esistono alcune situazioni in cui non tutti i tipi di sottoespressione possono essere usati con and
/or
, in particolare all'interno di espressioni lambda. Per informazioni dettagliate, vedere Operatori di raccolta OData in Ricerca di intelligenza artificiale di Azure.
Operatori logici e null
La maggior parte delle espressioni booleane, ad esempio funzioni e confronti, non può produrre null
valori e gli operatori logici non possono essere applicati direttamente al null
valore letterale( ad esempio, x and null
non è consentito). Tuttavia, i campi booleani possono essere null
, quindi è necessario essere consapevoli del comportamento degli and
operatori , or
e not
in presenza di null. Questo riepilogo è riportato nella tabella seguente, dove b
è un campo di tipo Edm.Boolean
:
Espressione | Risultato quando 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 |
Quando un campo b
booleano viene visualizzato da solo in un'espressione di filtro, si comporta come se fosse stato scritto b eq true
, quindi se b
è null
, l'espressione restituisce false
. Analogamente, not b
si comporta come not (b eq true)
, quindi restituisce true
. In questo modo, null
i campi si comportano come false
. Questo comportamento è coerente con il comportamento in combinazione con altre espressioni usando and
e or
, come illustrato nella tabella precedente. Nonostante ciò, un confronto diretto con false
(b eq false
) restituirà false
comunque . In altre parole, null
non è uguale a false
, anche se si comporta come in espressioni booleane.
Esempi
Trova la corrispondenza tra i documenti in cui il rating
campo è compreso tra 3 e 5, inclusi:
rating ge 3 and rating le 5
Trova la corrispondenza con i documenti in cui tutti gli elementi del ratings
campo sono minori di 3 o maggiori di 5:
ratings/all(r: r lt 3 or r gt 5)
Trova la corrispondenza con i documenti in cui il location
campo si trova all'interno del poligono specificato e il documento non contiene il termine "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')
Trova i documenti per gli hotel a Vancouver, Canada, dove c'è una camera deluxe con una tariffa di base inferiore a 160:
Address/City eq 'Vancouver' and Address/Country eq 'Canada' and Rooms/any(room: room/Type eq 'Deluxe Room' and room/BaseRate lt 160)