Problemen met OData-verzamelingsfilters in Azure AI Search oplossen
Als u wilt filteren op verzamelingsvelden in Azure AI Search, kunt u deany
en all
operators samen met lambda-expressies gebruiken. Een lambda-expressie is een subfilter dat wordt toegepast op elk element van een verzameling.
Niet elke functie van filterexpressies is beschikbaar in een lambda-expressie. Welke functies beschikbaar zijn, is afhankelijk van het gegevenstype van het verzamelingsveld dat u wilt filteren. Dit kan leiden tot een fout als u probeert een functie te gebruiken in een lambda-expressie die niet wordt ondersteund in die context. Als u dergelijke fouten ondervindt tijdens het schrijven van een complex filter over verzamelingsvelden, helpt dit artikel u bij het oplossen van het probleem.
Veelvoorkomende verzamelingsfilterfouten
De volgende tabel bevat fouten die kunnen optreden bij het uitvoeren van een verzamelingsfilter. Deze fouten treden op wanneer u een functie gebruikt van filterexpressies die niet worden ondersteund in een lambda-expressie. Elke fout bevat enkele richtlijnen voor het herschrijven van uw filter om de fout te voorkomen. De tabel bevat ook een koppeling naar de relevante sectie van dit artikel met meer informatie over het voorkomen van die fout.
Foutmelding | Situatie | DETAILS |
---|---|---|
De functie ismatch heeft geen parameters die zijn gebonden aan de bereikvariabele's. Alleen afhankelijke veldverwijzingen worden ondersteund in lambda-expressies ('any' of 'all'). U kunt het filter echter wijzigen zodat de ismatch functie zich buiten de lambda-expressie bevindt en het opnieuw probeert. |
Een lambda-expressie gebruiken search.ismatch of search.ismatchscoring erin |
Regels voor het filteren van complexe verzamelingen |
Ongeldige lambda-expressie. Er is een test gevonden voor gelijkheid of ongelijkheid waarbij het tegenovergestelde werd verwacht in een lambda-expressie die wordt herhaald over een veld van het type Verzameling (Edm.String). Gebruik voor 'any' expressies van het formulier 'x eq y' of 'search.in(...)'. Gebruik voor 'all' expressies van het formulier 'x ne y', 'not (x eq y)' of 'niet search.in(...)'. | Filteren op een veld van het type Collection(Edm.String) |
Regels voor het filteren van tekenreeksverzamelingen |
Ongeldige lambda-expressie. Er is een niet-ondersteunde vorm van een complexe Boole-expressie gevonden. Gebruik voor 'any' expressies die 'OR's van AND's' zijn, ook wel bekend als Disjunctive Normal Form. Bijvoorbeeld: (a and b) or (c and d) waarbij a, b, c en d subexpressies of gelijkheidssubexpressies zijn. Gebruik voor 'all' expressies die 'AND's van OR's' zijn, ook wel bekendalsvorm. Bijvoorbeeld: (a or b) and (c or d) waarbij a, b, c en d subexpressies of ongelijkheid subexpressies zijn. Voorbeelden van vergelijkingsexpressies: 'x gt 5', 'x le 2'. Voorbeeld van een gelijkheidsexpressie: 'x eq 5'. Voorbeeld van een ongelijkheidsexpressie: 'x ne 5'. |
Filteren op velden van het typeCollection(Edm.DateTimeOffset) , Collection(Edm.Double) of Collection(Edm.Int32) Collection(Edm.Int64) |
Regels voor het filteren van vergelijkbare verzamelingen |
Ongeldige lambda-expressie. Er is een niet-ondersteund gebruik gevonden van geo.distance() of geo.intersects() in een lambda-expressie die wordt herhaald over een veld van het type Collection(Edm.GeographyPoint). Voor 'any' moet u geo.distance() vergelijken met behulp van de operators 'lt' of 'le' en ervoor zorgen dat elk gebruik van geo.intersects() niet wordt genegeerd. Voor 'all' moet u geo.distance() vergelijken met behulp van de operators 'gt' of 'ge' en ervoor zorgen dat elk gebruik van geo.intersects() wordt genegeerd. | Filteren op een veld van het type Collection(Edm.GeographyPoint) |
Regels voor het filteren van GeographyPoint-verzamelingen |
Ongeldige lambda-expressie. Complexe Boole-expressies worden niet ondersteund in lambda-expressies die worden herhaald over velden van het type Verzameling (Edm.GeographyPoint). Voor 'any' voegt u subexpressies toe met 'or'; 'en' wordt niet ondersteund. Voor 'all' voegt u subexpressies toe met 'and'; 'or' wordt niet ondersteund. | Filteren op velden van het type Collection(Edm.String) of Collection(Edm.GeographyPoint) |
Regels voor het filteren van tekenreeksverzamelingen Regels voor het filteren van GeographyPoint-verzamelingen |
Ongeldige lambda-expressie. Er is een vergelijkingsoperator gevonden (een van 'lt', 'le', 'gt' of 'ge'). Alleen gelijkheidsoperatoren zijn toegestaan in lambda-expressies die de velden van het type Verzameling (Edm.String) herhalen. Voor 'any', se expressies van het formulier 'x eq y'. Gebruik voor 'all' expressies van het formulier 'x ne y' of 'not (x eq y)'. | Filteren op een veld van het type Collection(Edm.String) |
Regels voor het filteren van tekenreeksverzamelingen |
Geldige verzamelingsfilters schrijven
De regels voor het schrijven van geldige verzamelingsfilters verschillen voor elk gegevenstype. In de volgende secties worden de regels beschreven door voorbeelden weer te geven van welke filterfuncties worden ondersteund en welke niet:
- Regels voor het filteren van tekenreeksverzamelingen
- Regels voor het filteren van Booleaanse verzamelingen
- Regels voor het filteren van GeographyPoint-verzamelingen
- Regels voor het filteren van vergelijkbare verzamelingen
- Regels voor het filteren van complexe verzamelingen
Regels voor het filteren van tekenreeksverzamelingen
Binnen lambda-expressies voor tekenreeksverzamelingen zijn eq
ne
en zijn de enige vergelijkingsoperatoren die kunnen worden gebruikt.
Notitie
Azure AI Search biedt geen ondersteuning voor de lt
gt
ge
/le
//operators voor tekenreeksen, binnen of buiten een lambda-expressie.
Het lichaam van een any
kan alleen op gelijkheid testen, terwijl het lichaam van een all
kan alleen op ongelijkheid testen.
Het is ook mogelijk om meerdere expressies te combineren in or
de hoofdtekst van een any
, en via and
in de hoofdtekst van een all
. Omdat de search.in
functie gelijk is aan het combineren van gelijkheidscontroles met or
, is het ook toegestaan in de hoofdtekst van een any
. Omgekeerd is not search.in
toegestaan in het lichaam van een all
.
Deze expressies zijn bijvoorbeeld toegestaan:
tags/any(t: t eq 'books')
tags/any(t: search.in(t, 'books, games, toys'))
tags/all(t: t ne 'books')
tags/all(t: not (t eq 'books'))
tags/all(t: not search.in(t, 'books, games, toys'))
tags/any(t: t eq 'books' or t eq 'games')
tags/all(t: t ne 'books' and not (t eq 'games'))
Hoewel deze expressies niet zijn toegestaan:
tags/any(t: t ne 'books')
tags/any(t: not search.in(t, 'books, games, toys'))
tags/all(t: t eq 'books')
tags/all(t: search.in(t, 'books, games, toys'))
tags/any(t: t eq 'books' and t ne 'games')
tags/all(t: t ne 'books' or not (t eq 'games'))
Regels voor het filteren van Booleaanse verzamelingen
Het type Edm.Boolean
ondersteunt alleen de eq
en ne
operators. Daarom is het niet erg logisch om dergelijke componenten te combineren waarmee dezelfde bereikvariabele and
/or
wordt gecontroleerd, omdat dat altijd zou leiden tot tautologieën of tegenstrijdigheden.
Hier volgen enkele voorbeelden van filters voor Booleaanse verzamelingen die zijn toegestaan:
flags/any(f: f)
flags/all(f: f)
flags/any(f: f eq true)
flags/any(f: f ne true)
flags/all(f: not f)
flags/all(f: not (f eq true))
In tegenstelling tot tekenreeksverzamelingen hebben Booleaanse verzamelingen geen limieten voor welke operator kan worden gebruikt in welk type lambda-expressie. Beide eq
en ne
kunnen worden gebruikt in de hoofdtekst van any
of all
.
Expressies zoals de volgende zijn niet toegestaan voor Booleaanse verzamelingen:
flags/any(f: f or not f)
flags/any(f: f or f)
flags/all(f: f and not f)
flags/all(f: f and f eq true)
Regels voor het filteren van GeographyPoint-verzamelingen
Waarden van het type Edm.GeographyPoint
in een verzameling kunnen niet rechtstreeks met elkaar worden vergeleken. In plaats daarvan moeten ze worden gebruikt als parameters voor de geo.distance
en geo.intersects
functies. De geo.distance
functie moet op zijn beurt worden vergeleken met een afstandswaarde met behulp van een van de vergelijkingsoperatoren lt
, le
of gt
ge
. Deze regels zijn ook van toepassing op niet-collection Edm.GeographyPoint-velden.
Net als tekenreeksverzamelingen hebben verzamelingen Edm.GeographyPoint
enkele regels voor de manier waarop de georuimtelijke functies kunnen worden gebruikt en gecombineerd in de verschillende typen lambda-expressies:
- Welke vergelijkingsoperatoren u met de
geo.distance
functie kunt gebruiken, is afhankelijk van het type lambda-expressie. Voorany
, kunt u alleenlt
gebruiken ofle
. Voorall
, kunt u alleengt
gebruiken ofge
. U kunt expressies die betrekkinggeo.distance
hebben op, maar u moet de vergelijkingsoperator wijzigen (geo.distance(...) lt x
wordtnot (geo.distance(...) ge x)
engeo.distance(...) le x
wordtnot (geo.distance(...) gt x)
). - In de hoofdtekst van een
all
, moet degeo.intersects
functie worden ontkend. Omgekeerd mag degeo.intersects
functie niet worden ontkend in de hoofdtekst van eenany
. - In de hoofdtekst van een
any
geo-ruimtelijke expressie kan worden gecombineerd met behulp vanor
. In de hoofdtekst van eenall
, kunnen dergelijke expressies worden gecombineerd met behulp vanand
.
De bovenstaande beperkingen bestaan om vergelijkbare redenen als de beperking van gelijkheid/ongelijkheid voor tekenreeksverzamelingen. Zie Informatie over OData-verzamelingsfilters in Azure AI Search voor meer informatie over deze redenen.
Hier volgen enkele voorbeelden van filters voor Edm.GeographyPoint
verzamelingen die zijn toegestaan:
locations/any(l: geo.distance(l, geography'POINT(-122 49)') lt 10)
locations/any(l: not (geo.distance(l, geography'POINT(-122 49)') ge 10) or geo.intersects(l, geography'POLYGON((-122.031577 47.578581, -122.031577 47.678581, -122.131577 47.678581, -122.031577 47.578581))'))
locations/all(l: geo.distance(l, geography'POINT(-122 49)') ge 10 and not geo.intersects(l, geography'POLYGON((-122.031577 47.578581, -122.031577 47.678581, -122.131577 47.678581, -122.031577 47.578581))'))
Expressies zoals de volgende zijn niet toegestaan voor Edm.GeographyPoint
verzamelingen:
locations/any(l: l eq geography'POINT(-122 49)')
locations/any(l: not geo.intersects(l, geography'POLYGON((-122.031577 47.578581, -122.031577 47.678581, -122.131577 47.678581, -122.031577 47.578581))'))
locations/all(l: geo.intersects(l, geography'POLYGON((-122.031577 47.578581, -122.031577 47.678581, -122.131577 47.678581, -122.031577 47.578581))'))
locations/any(l: geo.distance(l, geography'POINT(-122 49)') gt 10)
locations/all(l: geo.distance(l, geography'POINT(-122 49)') lt 10)
locations/any(l: geo.distance(l, geography'POINT(-122 49)') lt 10 and geo.intersects(l, geography'POLYGON((-122.031577 47.578581, -122.031577 47.678581, -122.131577 47.678581, -122.031577 47.578581))'))
locations/all(l: geo.distance(l, geography'POINT(-122 49)') le 10 or not geo.intersects(l, geography'POLYGON((-122.031577 47.578581, -122.031577 47.678581, -122.131577 47.678581, -122.031577 47.578581))'))
Regels voor het filteren van vergelijkbare verzamelingen
Deze sectie is van toepassing op alle volgende gegevenstypen:
Collection(Edm.DateTimeOffset)
Collection(Edm.Double)
Collection(Edm.Int32)
Collection(Edm.Int64)
Typen zoals Edm.Int32
en ondersteunen alle zes de vergelijkingsoperatoren: eq
, , lt
ne
, le
, , gt
en ge
Edm.DateTimeOffset
. Lambda-expressies over verzamelingen van deze typen kunnen eenvoudige expressies bevatten met behulp van een van deze operators. Dit geldt voor zowel any
als all
. Deze filters zijn bijvoorbeeld toegestaan:
ratings/any(r: r ne 5)
dates/any(d: d gt 2017-08-24T00:00:00Z)
not margins/all(m: m eq 3.5)
Er gelden echter beperkingen voor hoe dergelijke vergelijkingsexpressies kunnen worden gecombineerd tot complexere expressies binnen een lambda-expressie:
- Regels voor
any
:Eenvoudige ongelijkheidsexpressies kunnen niet nuttig worden gecombineerd met andere expressies. Deze expressie is bijvoorbeeld toegestaan:
ratings/any(r: r ne 5)
maar deze expressie is niet:
ratings/any(r: r ne 5 and r gt 2)
en hoewel deze expressie is toegestaan, is deze niet nuttig omdat de voorwaarden overlappen:
ratings/any(r: r ne 5 or r gt 7)
Eenvoudige vergelijkingsexpressies met betrekking tot , , , of
gt
ge
kunnen worden gecombineerd metand
/or
.le
lt
eq
Voorbeeld:ratings/any(r: r gt 2 and r le 5)
ratings/any(r: r le 5 or r gt 7)
Vergelijkingsexpressies gecombineerd met
and
(combinaties) kunnen verder worden gecombineerd met behulp vanor
. Dit formulier staat bekend in Booleaanse logica als 'Disjunctive Normal Form' (DNF). Voorbeeld:ratings/any(r: (r gt 2 and r le 5) or (r gt 7 and r lt 10))
- Regels voor
all
:Eenvoudige gelijkheidsexpressies kunnen niet nuttig worden gecombineerd met andere expressies. Deze expressie is bijvoorbeeld toegestaan:
ratings/all(r: r eq 5)
maar deze expressie is niet:
ratings/all(r: r eq 5 or r le 2)
en hoewel deze expressie is toegestaan, is deze niet nuttig omdat de voorwaarden overlappen:
ratings/all(r: r eq 5 and r le 7)
Eenvoudige vergelijkingsexpressies met betrekking tot , , , of
gt
ge
kunnen worden gecombineerd metand
/or
.le
lt
ne
Voorbeeld:ratings/all(r: r gt 2 and r le 5)
ratings/all(r: r le 5 or r gt 7)
Vergelijkingsexpressies gecombineerd met
or
(disjunctions) kunnen verder worden gecombineerd met behulp vanand
. Dit formulier staat bekend in Booleaanse logica als 'Cateive Normal Form' (CNF). Voorbeeld:ratings/all(r: (r le 2 or gt 5) and (r lt 7 or r ge 10))
Regels voor het filteren van complexe verzamelingen
Lambda-expressies boven complexe verzamelingen ondersteunen een veel flexibelere syntaxis dan lambda-expressies ten opzichte van verzamelingen primitieve typen. U kunt elke filterconstructie binnen een dergelijke lambda-expressie gebruiken die u buiten één kunt gebruiken, met slechts twee uitzonderingen.
Ten eerste worden de functies search.ismatch
en search.ismatchscoring
niet ondersteund in lambda-expressies. Zie Inzicht in OData-verzamelingsfilters in Azure AI Search voor meer informatie.
Ten tweede is het niet toegestaan om te verwijzen naar velden die niet zijn gebonden aan de bereikvariabele (zogenaamde vrije variabelen). Denk bijvoorbeeld aan de volgende twee equivalente OData-filterexpressies:
stores/any(s: s/amenities/any(a: a eq 'parking')) and details/margin gt 0.5
stores/any(s: s/amenities/any(a: a eq 'parking' and details/margin gt 0.5))
De eerste expressie is toegestaan, terwijl het tweede formulier wordt geweigerd omdat details/margin
deze niet is gebonden aan de bereikvariabele s
.
Deze regel is ook van toepassing op expressies met variabelen die zijn gebonden in een buitenbereik. Dergelijke variabelen zijn gratis met betrekking tot het bereik waarin ze worden weergegeven. De eerste expressie is bijvoorbeeld toegestaan, terwijl de tweede equivalente expressie niet is toegestaan omdat s/name
het bereik van de bereikvariabele a
vrij is:
stores/any(s: s/amenities/any(a: a eq 'parking') and s/name ne 'Flagship')
stores/any(s: s/amenities/any(a: a eq 'parking' and s/name ne 'Flagship'))
Deze beperking mag in de praktijk geen probleem zijn, omdat het altijd mogelijk is om filters te maken, zodat lambda-expressies alleen afhankelijke variabelen bevatten.
Cheatsheet voor verzamelingsfilterregels
De volgende tabel bevat een overzicht van de regels voor het samenstellen van geldige filters voor elk gegevenstype van de verzameling.
Gegevenstype | Functies die zijn toegestaan in lambda-expressies met any |
Functies die zijn toegestaan in lambda-expressies met all |
---|---|---|
Collection(Edm.ComplexType) |
Alles behalve search.ismatch en search.ismatchscoring |
Zelfde |
Collection(Edm.String) |
Vergelijkingen met eq of search.in Subexpressies combineren met or |
Vergelijkingen met ne of not search.in() Subexpressies combineren met and |
Collection(Edm.Boolean) |
Vergelijkingen met eq of ne |
Zelfde |
Collection(Edm.GeographyPoint) |
Gebruiken geo.distance met lt of le geo.intersects Subexpressies combineren met or |
Gebruiken geo.distance met gt of ge not geo.intersects(...) Subexpressies combineren met and |
Collection(Edm.DateTimeOffset) , , , Collection(Edm.Double) Collection(Edm.Int32) Collection(Edm.Int64) |
Vergelijkingen met behulp van eq , ne , lt , , gt , of le ge Vergelijkingen combineren met andere subexpressies met behulp van or Vergelijkingen combineren, behalve ne met andere subexpressies met behulp van and Expressies die combinaties van and en or in Disjunctive Normal Form (DNF) gebruiken |
Vergelijkingen met behulp van eq , ne , lt , , gt , of le ge Vergelijkingen combineren met andere subexpressies met behulp van and Vergelijkingen combineren, behalve eq met andere subexpressies met behulp van or Expressies die combinaties van en or in De Normale Vorm van and Java (CNF) gebruiken |
Zie Geldige verzamelingsfilters schrijven voor voorbeelden van het maken van geldige filters voor elke case.
Als u vaak filters schrijft en de regels van de eerste principes begrijpt, helpt u meer dan alleen om ze te onthouden, raadpleegt u Inzicht in OData-verzamelingsfilters in Azure AI Search.