OData-functie search.in in Azure AI Search

Een veelvoorkomend scenario in OData-filterexpressies is om te controleren of één veld in elk document gelijk is aan een van de vele mogelijke waarden. Zo implementeren sommige toepassingen beveiligingsbeperkingen , door een veld met een of meer principal-id's te controleren op basis van een lijst met principal-id's die de gebruiker de query uitgeeft. Een van de manieren om een query als deze te schrijven, is door de operatoren en or de eq volgende operatoren te gebruiken:

    group_ids/any(g: g eq '123' or g eq '456' or g eq '789')

Er is echter een kortere manier om dit te schrijven, met behulp van de search.in functie:

    group_ids/any(g: search.in(g, '123, 456, 789'))

Belangrijk

Naast korter en gemakkelijker leesbaar te zijn, biedt het gebruik search.in ook prestatievoordelen en voorkomt u bepaalde groottebeperkingen van filters wanneer er honderden of zelfs duizenden waarden in het filter moeten worden opgenomen. Daarom raden we u ten zeerste aan om in plaats van een complexere scheiding van gelijkheidsexpressies te gebruiken search.in .

Notitie

Versie 4.01 van de OData-standaard heeft onlangs de in operator geïntroduceerd, die vergelijkbaar gedrag heeft als de search.in functie in Azure AI Search. Azure AI Search biedt echter geen ondersteuning voor deze operator, dus u moet in plaats daarvan de search.in functie gebruiken.

Syntaxis

Het volgende EBNF (Extended Backus-Naur Form) definieert de grammatica van de search.in functie:

search_in_call ::=
    'search.in(' variable ',' string_literal(',' string_literal)? ')'

Er is ook een interactief syntaxisdiagram beschikbaar:

De search.in functie test of een bepaald tekenreeksveld of een bereikvariabele gelijk is aan een van een bepaalde lijst met waarden. Gelijkheid tussen de variabele en elke waarde in de lijst wordt op hoofdlettergevoelige wijze bepaald, op dezelfde manier als voor de eq operator. Daarom is een expressie vergelijkbaar met search.in(myfield, 'a, b, c')myfield eq 'a' or myfield eq 'b' or myfield eq 'c', behalve dat dit search.in veel betere prestaties oplevert.

Er zijn twee overbelastingen van de search.in functie:

  • search.in(variable, valueList)
  • search.in(variable, valueList, delimiters)

De parameters worden gedefinieerd in de volgende tabel:

Parameternaam Type Description
variable Edm.String Een tekenreeksveldreferentie (of een bereikvariabele voor een tekenreeksverzamelingsveld in het geval dat search.in wordt gebruikt in een any of all expressie).
valueList Edm.String Een tekenreeks met een door scheidingstekens gescheiden lijst met waarden die overeenkomen met de variable parameter. Als de delimiters parameter niet is opgegeven, zijn de standaardscheidingstekens spatie en komma.
delimiters Edm.String Een tekenreeks waarbij elk teken wordt behandeld als scheidingsteken bij het parseren van de valueList parameter. De standaardwaarde van deze parameter is ' ,' dat alle waarden met spaties en/of komma's ertussen worden gescheiden. Als u andere scheidingstekens dan spaties en komma's wilt gebruiken omdat uw waarden deze tekens bevatten, kunt u alternatieve scheidingstekens opgeven, zoals '|' in deze parameter.

Prestaties van search.in

Als u gebruikt search.in, kunt u een reactietijd van een sub seconde verwachten wanneer de tweede parameter een lijst met honderden of duizenden waarden bevat. Er is geen expliciete limiet voor het aantal items dat u kunt doorgeven search.in, hoewel u nog steeds beperkt bent door de maximale aanvraaggrootte. De latentie neemt echter toe naarmate het aantal waarden groeit.

Voorbeelden

Zoek alle hotels met een naam die gelijk is aan 'Sea View motel' of 'Budget hotel'. Zinnen bevatten spaties. Dit is een standaardscheidingsteken. U kunt een alternatief scheidingsteken tussen enkele aanhalingstekens opgeven als de derde tekenreeksparameter:

    search.in(HotelName, 'Sea View motel,Budget hotel', ',')

Zoek alle hotels met een naam die gelijk is aan 'Sea View motel' of 'Budget hotel' gescheiden door |):

    search.in(HotelName, 'Sea View motel|Budget hotel', '|')

Zoek alle hotels met kamers met het label 'wifi' of 'tub':

    Rooms/any(room: room/Tags/any(tag: search.in(tag, 'wifi, tub')))

Zoek een overeenkomst op zinnen in een verzameling, zoals 'verwarmde handdoekrekken' of 'haardroger inbegrepen' in tags.

    Rooms/any(room: room/Tags/any(tag: search.in(tag, 'heated towel racks,hairdryer included', ','))

Zoek alle hotels zonder het label 'motel' of 'cabin':

    Tags/all(tag: not search.in(tag, 'motel, cabin'))

Volgende stappen