Funkce OData search.in
ve službě Azure AI Search
Běžným scénářem ve výrazech filtru OData je kontrola, jestli se jedno pole v každém dokumentu rovná jedné z mnoha možných hodnot. Takto například některé aplikace implementují oříznutí zabezpečení – kontrolou pole obsahujícího jedno nebo více ID objektu zabezpečení na seznamu ID objektů zabezpečení představujících uživatele, který dotaz vydává. Jedním zezpůsobůch eq
or
group_ids/any(g: g eq '123' or g eq '456' or g eq '789')
Existuje však kratší způsob, jak to napsat pomocí search.in
funkce:
group_ids/any(g: search.in(g, '123, 456, 789'))
Důležité
Kromě toho, že je kratší a čitelnější, použití search.in
také poskytuje výhody výkonu a zabraňuje určitým omezením velikosti filtrů , pokud jsou ve filtru stovky nebo dokonce tisíce hodnot, které se mají zahrnout do filtru. Z tohoto důvodu důrazně doporučujeme místo složitějšího rozdělení výrazů rovnosti použít search.in
složitější disjunkci.
Poznámka:
Verze 4.01 standardu OData nedávno zavedla in
operátor, který má podobné chování jako search.in
funkce ve službě Azure AI Search. Azure AI Search ale tento operátor nepodporuje, takže místo toho musíte funkci použít search.in
.
Syntaxe
Následující ebNF (Extended Backus-Naur Form) definuje gramatiku search.in
funkce:
search_in_call ::=
'search.in(' variable ',' string_literal(',' string_literal)? ')'
K dispozici je také interaktivní diagram syntaxe:
Poznámka:
Úplný soubor EBNF najdete v referenčních informacích k syntaxi výrazů OData pro Azure AI Search .
Funkce search.in
testuje, jestli se dané pole řetězce nebo proměnná oblasti rovná jednomu z daného seznamu hodnot. Rovnost mezi proměnnou a každou hodnotou v seznamu je určena způsobem citlivým na malá a velká písmena, stejně jako u operátoru eq
. Výraz jako search.in(myfield, 'a, b, c')
je tedy ekvivalentní myfield eq 'a' or myfield eq 'b' or myfield eq 'c'
výrazu s tím rozdílem, že search.in
přinese mnohem lepší výkon.
Funkce má dvě přetížení search.in
:
search.in(variable, valueList)
search.in(variable, valueList, delimiters)
Parametry jsou definovány v následující tabulce:
Název parametru | Typ | Popis |
---|---|---|
variable |
Edm.String |
Odkaz na pole řetězce (nebo proměnná rozsahu nad polem kolekce řetězců v případě, kdy search.in se používá uvnitř výrazuany ).all |
valueList |
Edm.String |
Řetězec obsahující seznam hodnot s oddělovači, které se mají shodovat s parametrem variable . delimiters Pokud parametr není zadaný, výchozí oddělovače jsou mezera a čárka. |
delimiters |
Edm.String |
Řetězec, ve kterém se každý znak považuje za oddělovač při analýze parametru valueList . Výchozí hodnota tohoto parametru znamená ' ,' , že všechny hodnoty s mezerami a čárkami mezi nimi budou odděleny. Pokud potřebujete použít jiné oddělovače než mezery a čárky, protože hodnoty obsahují tyto znaky, můžete zadat alternativní oddělovače, například '|' v tomto parametru. |
Výkon výkonu search.in
Pokud použijete search.in
, můžete očekávat dobu odezvy podsekundové, když druhý parametr obsahuje seznam stovek nebo tisíců hodnot. Počet položek, do search.in
které můžete předat, neexistuje žádný explicitní limit, i když jste stále omezeni maximální velikostí žádosti. S rostoucím počtem hodnot se ale latence zvýší.
Příklady
Najděte všechny hotely s názvem rovnou 'Sea View motel' nebo 'Budget hotel'. Fráze obsahují mezery, což je výchozí oddělovač. Alternativní oddělovač můžete zadat v jednoduchých uvozovkách jako třetí řetězcový parametr:
search.in(HotelName, 'Sea View motel,Budget hotel', ',')
Vyhledejte všechny hotely s názvem, které se rovnají 'Sea View motel' nebo 'Budget hotel' oddělené '|'):
search.in(HotelName, 'Sea View motel|Budget hotel', '|')
Najděte všechny hotely s pokoji, které mají značku "wifi" nebo "tub":
Rooms/any(room: room/Tags/any(tag: search.in(tag, 'wifi, tub')))
Najděte shodu u frází v kolekci, například "vytápěné ručníky" nebo "fén" ve značkách.
Rooms/any(room: room/Tags/any(tag: search.in(tag, 'heated towel racks,hairdryer included', ','))
Najděte všechny hotely bez značky 'motel' nebo 'cabin':
Tags/all(tag: not search.in(tag, 'motel, cabin'))