OData search.in
függvény az Azure AI Searchben
Az OData-szűrőkifejezések gyakori forgatókönyve annak ellenőrzése, hogy az egyes dokumentumok egyetlen mezője egyenlő-e a számos lehetséges érték egyikével. Egyes alkalmazások például így valósítják meg a biztonsági vágást : egy vagy több egyszerű azonosítót tartalmazó mezőnek a lekérdezést kibocsátó felhasználót képviselő egyszerű azonosítók listájában való ellenőrzésével. Egy ilyen lekérdezés írásának egyik módja az és or
az eq
operátorok használata:
group_ids/any(g: g eq '123' or g eq '456' or g eq '789')
Ezt azonban rövidebben is megírhatja a search.in
függvény használatával:
group_ids/any(g: search.in(g, '123, 456, 789'))
Fontos
Amellett, hogy rövidebb és könnyebben olvasható, a használata search.in
teljesítménybeli előnyöket is biztosít, és elkerüli a szűrők bizonyos méretkorlátozásait, ha több száz vagy akár több ezer értéket kell belefoglalni a szűrőbe. Ezért határozottan javasoljuk, hogy az egyenlőségi kifejezések összetettebb tiltása helyett használjon search.in
.
Feljegyzés
Az OData szabvány 4.01-es verziója nemrég bevezette az in
operátort, amely hasonló viselkedést mutat, mint az search.in
Azure AI Search függvénye. Az Azure AI Search azonban nem támogatja ezt az operátort, ezért inkább a függvényt search.in
kell használnia.
Syntax
A függvény nyelvtanát search.in
a következő EBNF (Extended Backus-Naur Form) határozza meg:
search_in_call ::=
'search.in(' variable ',' string_literal(',' string_literal)? ')'
Interaktív szintaxisdiagram is elérhető:
Feljegyzés
A teljes EBNF-hez tekintse meg az Azure AI Search OData-kifejezésszintaxis-hivatkozását.
A search.in
függvény ellenőrzi, hogy egy adott sztringmező vagy tartományváltozó egyenlő-e egy adott értéklista egyikével. A változó és a lista egyes értékei közötti egyenlőséget a kis- és nagybetűk megkülönböztetése határozza meg, ugyanúgy, mint az eq
operátor esetében. Ezért egy hasonló search.in(myfield, 'a, b, c')
kifejezés egyenértékű azzal myfield eq 'a' or myfield eq 'b' or myfield eq 'c'
, hogy search.in
sokkal jobb teljesítményt eredményez.
A függvénynek két túlterhelése search.in
van:
search.in(variable, valueList)
search.in(variable, valueList, delimiters)
A paraméterek a következő táblázatban vannak definiálva:
Paraméter neve | Típus | Leírás |
---|---|---|
variable |
Edm.String |
Sztringmező-hivatkozás (vagy egy tartományváltozó egy sztringgyűjtemény mező felett abban az esetben, ha search.in egy any kifejezésben vagy all kifejezésben használják). |
valueList |
Edm.String |
A paraméterrel variable egyező értékek elválasztott listáját tartalmazó sztring. Ha a delimiters paraméter nincs megadva, az alapértelmezett elválasztójelek a szóköz és a vessző. |
delimiters |
Edm.String |
Egy sztring, amelyben az egyes karakterek elválasztóként vannak kezelve a valueList paraméter elemzésekor. Ennek a paraméternek az alapértelmezett értéke azt ' ,' jelenti, hogy a szóközökkel és/vagy vesszőkkel rendelkező értékek külön lesznek választva. Ha szóközök és vesszők kivételével más elválasztójeleket kell használnia, mert az értékek tartalmazzák ezeket a karaktereket, alternatív elválasztójeleket is megadhat, például '|' ebben a paraméterben. |
A teljesítmény search.in
Ha használja search.in
, másodperc alatti válaszidőre számíthat, ha a második paraméter több száz vagy több ezer értéket tartalmazó listát tartalmaz. Nincs explicit korlátja az átengedhető search.in
elemek számának, bár a maximális kérelemméret továbbra is korlátozott. A késés azonban az értékek számának növekedésével nő.
Példák
Keresse meg az összes olyan szállodát, amelynek neve megegyezik a "Sea View motel" vagy a "Budget hotel" névvel. A kifejezések szóközöket tartalmaznak, ami az alapértelmezett elválasztójel. A harmadik sztringparaméterként megadhat egy alternatív elválasztójelet egyetlen idézőjelben:
search.in(HotelName, 'Sea View motel,Budget hotel', ',')
Keresse meg az összes olyan szállodát, amelynek neve "Sea View motel" vagy "Budget hotel" (|) által elválasztva van):
search.in(HotelName, 'Sea View motel|Budget hotel', '|')
Keresse meg az összes olyan szállodát, amelynek "wifi" vagy "tub" címkéje van:
Rooms/any(room: room/Tags/any(tag: search.in(tag, 'wifi, tub')))
Keressen egyezést a gyűjteményen belüli kifejezésekkel, például a címkékben található "fűtött törülközőtartókkal" vagy a "hajszárítóval együtt" kifejezésekkel.
Rooms/any(room: room/Tags/any(tag: search.in(tag, 'heated towel racks,hairdryer included', ','))
Keresse meg az összes szállodát a "motel" vagy a "kabin" címke nélkül:
Tags/all(tag: not search.in(tag, 'motel, cabin'))