OData-funktion search.in
i Azure AI Search
Ett vanligt scenario i OData-filteruttryck är att kontrollera om ett enda fält i varje dokument är lika med ett av många möjliga värden. Det är till exempel så här vissa program implementerar säkerhetstrimning – genom att kontrollera ett fält som innehåller ett eller flera huvudnamns-ID:t mot en lista över huvudnamns-ID:t som representerar användaren som utfärdar frågan. Ett sätt att skriva en fråga som den här är att använda operatorerna eq
och or
:
group_ids/any(g: g eq '123' or g eq '456' or g eq '789')
Det finns dock ett kortare sätt att skriva detta med hjälp av search.in
funktionen:
group_ids/any(g: search.in(g, '123, 456, 789'))
Viktigt!
Förutom att vara kortare och enklare att läsa ger användning search.in
även prestandafördelar och undviker vissa storleksbegränsningar för filter när det finns hundratals eller till och med tusentals värden att inkludera i filtret. Därför rekommenderar vi starkt att du använder search.in
i stället för en mer komplex disjunction av likhetsuttryck.
Kommentar
Version 4.01 av OData-standarden har nyligen introducerat operatornin
, som har liknande beteende som search.in
funktionen i Azure AI Search. Azure AI Search stöder dock inte den här operatorn, så du måste använda search.in
funktionen i stället.
Syntax
Följande EBNF (Extended Backus-Naur Form) definierar funktionens search.in
grammatik:
search_in_call ::=
'search.in(' variable ',' string_literal(',' string_literal)? ')'
Ett interaktivt syntaxdiagram är också tillgängligt:
Kommentar
Se syntaxreferens för OData-uttryck för Azure AI Search för hela EBNF.
Funktionen search.in
testar om ett visst strängfält eller intervallvariabel är lika med en av en viss lista med värden. Likhet mellan variabeln och varje värde i listan bestäms på ett skiftlägeskänsligt sätt, på samma sätt som för operatorn eq
. Därför motsvarar myfield eq 'a' or myfield eq 'b' or myfield eq 'c'
ett uttryck som search.in(myfield, 'a, b, c')
, förutom att det search.in
ger mycket bättre prestanda.
Det finns två överlagringar av search.in
funktionen:
search.in(variable, valueList)
search.in(variable, valueList, delimiters)
Parametrarna definieras i följande tabell:
Parameternamn | Typ | Beskrivning |
---|---|---|
variable |
Edm.String |
En strängfältreferens (eller en intervallvariabel över ett strängsamlingsfält i det fall där search.in används i ett eller all ett any uttryck). |
valueList |
Edm.String |
En sträng som innehåller en avgränsad lista med värden som ska matchas mot parametern variable . Om parametern delimiters inte anges är standardavgränsarna utrymme och kommatecken. |
delimiters |
Edm.String |
En sträng där varje tecken behandlas som en avgränsare när parametern valueList parsas. Standardvärdet för den här parametern innebär ' ,' att alla värden med blanksteg och/eller kommatecken mellan dem separeras. Om du behöver använda andra avgränsare än blanksteg och kommatecken eftersom dina värden innehåller dessa tecken, kan du ange alternativa avgränsare, till exempel '|' i den här parametern. |
Prestanda för search.in
Om du använder search.in
kan du förvänta dig svarstid under sekunden när den andra parametern innehåller en lista med hundratals eller tusentals värden. Det finns ingen explicit gräns för hur många objekt du kan skicka till search.in
, även om du fortfarande begränsas av den maximala begärandestorleken. Svarstiden ökar dock när antalet värden växer.
Exempel
Hitta alla hotell med namn som är lika med antingen "Sea View Motel" eller "Budget hotel". Fraser innehåller blanksteg, vilket är en standardgränsare. Du kan ange en alternativ avgränsare inom enkla citattecken som den tredje strängparametern:
search.in(HotelName, 'Sea View motel,Budget hotel', ',')
Hitta alla hotell med namnet "Sea View Motel" eller "Budget hotel" avgränsat med |):
search.in(HotelName, 'Sea View motel|Budget hotel', '|')
Hitta alla hotell med rum som har taggen "wifi" eller "tub":
Rooms/any(room: room/Tags/any(tag: search.in(tag, 'wifi, tub')))
Hitta en matchning på fraser i en samling, till exempel "uppvärmda handduksställ" eller "hårtork som ingår" i taggar.
Rooms/any(room: room/Tags/any(tag: search.in(tag, 'heated towel racks,hairdryer included', ','))
Hitta alla hotell utan taggen "motell" eller "cabin":
Tags/all(tag: not search.in(tag, 'motel, cabin'))