Sdílet prostřednictvím


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:

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.inkteré 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'))

Další kroky