Dela via


Logiska OData-operatorer i Azure AI Search – and, or, not

OData-filteruttryck i Azure AI Search är booleska uttryck som utvärderas till true eller false. Du kan skriva ett komplext filter genom att skriva en serie enklare filter och skapa dem med hjälp av logiska operatorer från boolesk algebra:

  • and: En binär operator som utvärderas till true om både dess underuttryck till vänster och höger utvärderas till true.
  • or: En binär operator som utvärderas till true om något av dess underuttryck till vänster eller höger utvärderas till true.
  • not: En unary-operator som utvärderas till true om dess underuttryck utvärderas till false, och vice versa.

Med dessa, tillsammans med samlingsoperatorerna any och all, kan du skapa filter som kan uttrycka mycket komplexa sökvillkor.

Syntax

Följande EBNF (Extended Backus-Naur Form) definierar grammatiken för ett OData-uttryck som använder de logiska operatorerna.

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

Ett interaktivt syntaxdiagram är också tillgängligt:

Det finns två former av logiska uttryck: binärt (and/or), där det finns två underuttryck och unary (not), där det bara finns ett. Underuttrycken kan vara booleska uttryck av alla slag:

  • Fält eller intervallvariabler av typen Edm.Boolean
  • Funktioner som returnerar värden av typen Edm.Boolean, till exempel geo.intersects eller search.ismatch
  • Jämförelseuttryck, till exempel rating gt 4
  • Samlingsuttryck, till exempel Rooms/any(room: room/Type eq 'Deluxe Room')
  • Booleska literaler true eller false.
  • Andra logiska uttryck som konstruerats med hjälp av and, oroch not.

Viktigt!

Det finns vissa situationer där inte alla typer av underuttryck kan användas med and/or, särskilt i lambda-uttryck. Mer information finns i OData-insamlingsoperatorer i Azure AI Search .

Logiska operatorer och null

De flesta booleska uttryck som funktioner och jämförelser kan inte generera null värden, och de logiska operatorerna kan inte tillämpas direkt på literalen null (till exempel x and null tillåts inte). Booleska fält kan dock vara null, så du måste vara medveten om hur operatorerna and, oroch not beter sig i närvaro av null. Detta sammanfattas i följande tabell, där b är ett fält av typen Edm.Boolean:

Uttryck Resultat när b är 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

När ett booleskt fält b visas självt i ett filteruttryck beter det sig som om det hade skrivits b eq true, så om b är nullutvärderas uttrycket till false. not b På samma sätt fungerar det som not (b eq true), så det utvärderas till true. På så sätt null beter sig fälten på samma sätt som false. Detta stämmer överens med hur de fungerar när de kombineras med andra uttryck med hjälp av and och or, enligt tabellen ovan. Trots detta utvärderas fortfarande en direkt jämförelse med false (b eq false) till false. Är med andra ord null inte lika med false, även om det beter sig som det i booleska uttryck.

Exempel

Matcha dokument där fältet rating är mellan 3 och 5, inklusive:

    rating ge 3 and rating le 5

Matcha dokument där alla element i ratings fältet är mindre än 3 eller större än 5:

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

Matcha dokument där fältet location finns inom den angivna polygonen och dokumentet innehåller inte termen "offentlig".

    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')

Matcha dokument för hotell i Vancouver, Kanada där det finns ett deluxe rum med ett baspris mindre än 160:

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

Nästa steg