Delen via


Logische OData-operators in Azure AI Search - and, ornot

OData-filterexpressies in Azure AI Search zijn Booleaanse expressies die evalueren of falsetrue . U kunt een complex filter schrijven door een reeks eenvoudigere filters te schrijven en deze op te stellen met behulp van de logische operatoren uit Booleaanse algebra:

  • and: Een binaire operator die evalueert true of zowel de linker- als de rechtersubexpressies worden geëvalueerd true.
  • or: Een binaire operator die evalueert true of een van de linker- of rechtersubexpressies resulteert in true.
  • not: Een unaire operator die evalueert true of de subexpressie resulteert in falseen omgekeerd.

Samen met de verzamelingsoperators any en allkunt u filters maken die zeer complexe zoekcriteria kunnen uitdrukken.

Syntaxis

Met het volgende EBNF-formulier (Extended Backus-Naur Form) definieert u de grammatica van een OData-expressie die gebruikmaakt van de logische operators.

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

Er is ook een interactief syntaxisdiagram beschikbaar:

Er zijn twee vormen van logische expressies: binair (and/or), waarbij er twee subexpressies zijn, en unaire (not), waarbij er slechts één is. De subexpressies kunnen Booleaanse expressies van elk type zijn:

  • Velden of bereikvariabelen van het type Edm.Boolean
  • Functies die waarden van het type Edm.Booleanretourneren, zoals geo.intersects of search.ismatch
  • Vergelijkingsexpressies, zoals rating gt 4
  • Verzamelingexpressies, zoals Rooms/any(room: room/Type eq 'Deluxe Room')
  • De Booleaanse letterlijke waarden true of false.
  • Andere logische expressies die zijn samengesteld met behulp van and, oren not.

Belangrijk

Er zijn enkele situaties waarin niet alle soorten subexpressie kunnen worden gebruikt met and/or, met name binnen lambda-expressies. Zie OData-verzamelingsoperators in Azure AI Search voor meer informatie.

Logische operators en null

De meeste Boole-expressies, zoals functies en vergelijkingen, kunnen geen waarden produceren null en de logische operatoren kunnen niet rechtstreeks worden toegepast op de null letterlijke waarde (bijvoorbeeld x and null niet toegestaan). Booleaanse velden kunnen echter zijn null, dus u moet zich bewust zijn van hoe de and, oren not operators zich gedragen in de aanwezigheid van null. Dit wordt samengevat in de volgende tabel, waarbij b een veld van het type Edm.Booleanis:

Expression Resultaat wanneer b is 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

Wanneer een Booleaanse veld b op zichzelf wordt weergegeven in een filterexpressie, gedraagt het zich alsof het is geschrevenb eq true, dus als b dat het isnull, wordt de expressie geëvalueerd.false Op dezelfde manier not b gedraagt het zich als not (b eq true), dus het evalueert naar true. Op deze manier null gedragen velden zich hetzelfde als false. Dit is consistent met hoe ze zich gedragen in combinatie met andere expressies die worden gebruikt and en or, zoals wordt weergegeven in de bovenstaande tabel. Ondanks dit zal een directe vergelijking met false (b eq false) nog steeds evalueren.false Met andere woorden, null is niet gelijk aan false, ook al gedraagt het zich als het in Boole-expressies.

Voorbeelden

Overeenkomen met documenten waarbij het rating veld tussen 3 en 5 ligt, inclusief:

    rating ge 3 and rating le 5

Overeenkomen met documenten waarbij alle elementen van het ratings veld kleiner zijn dan 3 of groter dan 5:

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

Overeenkomen met documenten waarin het location veld zich in de opgegeven veelhoek bevindt en het document bevat niet de term 'openbaar'.

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

Overeenkomen met documenten voor hotels in Vancouver, Canada waar er een deluxe kamer is met een basistarief minder dan 160:

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

Volgende stappen