Funkcja OData search.in
w usłudze Azure AI Search
Typowym scenariuszem w wyrażeniach filtru OData jest sprawdzenie, czy jedno pole w każdym dokumencie jest równe jednej z wielu możliwych wartości. Na przykład w ten sposób niektóre aplikacje implementują przycinanie zabezpieczeń — sprawdzając pole zawierające co najmniej jeden identyfikator podmiotu zabezpieczeń względem listy identyfikatorów podmiotów zabezpieczeń reprezentujących użytkownika wysyłającego zapytanie. Jednym ze sposobów na napisanie zapytania w następujący sposób jest użycie eq
operatorów i or
:
group_ids/any(g: g eq '123' or g eq '456' or g eq '789')
Istnieje jednak krótszy sposób na napisanie tego polecenia przy użyciu search.in
funkcji :
group_ids/any(g: search.in(g, '123, 456, 789'))
Ważne
Oprócz tego, że jest krótszy i łatwiejszy do odczytania, użycie search.in
zapewnia również korzyści z wydajności i pozwala uniknąć pewnych ograniczeń rozmiaru filtrów , gdy istnieją setki lub nawet tysiące wartości do uwzględnienia w filtrze. Z tego powodu zdecydowanie zalecamy użycie search.in
zamiast bardziej złożonego rozłączenia wyrażeń równości.
Uwaga
W wersji 4.01 standardu OData niedawno wprowadzono in
operator, który ma podobne zachowanie jak search.in
funkcja w usłudze Azure AI Search. Jednak usługa Azure AI Search nie obsługuje tego operatora, dlatego należy zamiast tego użyć search.in
funkcji.
Składnia
Następujący formularz EBNF (rozszerzony formularz Backus-Naur) definiuje gramatykę search.in
funkcji:
search_in_call ::=
'search.in(' variable ',' string_literal(',' string_literal)? ')'
Dostępny jest również interakcyjny diagram składni:
Uwaga
Zobacz dokumentację składni wyrażeń OData dla usługi Azure AI Search , aby zapoznać się z pełną pełną NF.
Funkcja search.in
sprawdza, czy dane pole ciągu lub zmienna zakresu jest równe jednej z danej listy wartości. Równość między zmienną a każdą wartością na liście jest określana w sposób uwzględniający wielkość liter, tak samo jak dla eq
operatora. W związku z tym wyrażenie podobne search.in(myfield, 'a, b, c')
jest równoważne myfield eq 'a' or myfield eq 'b' or myfield eq 'c'
wartościom , z tą różnicą, że search.in
daje znacznie lepszą wydajność.
Istnieją dwa przeciążenia search.in
funkcji:
search.in(variable, valueList)
search.in(variable, valueList, delimiters)
Parametry są zdefiniowane w poniższej tabeli:
Nazwa parametru | Type | Opis |
---|---|---|
variable |
Edm.String |
Odwołanie do pola ciągu (lub zmienna zakresu w polu kolekcji ciągów w przypadku, gdy search.in jest używana wewnątrz any wyrażenia lub all ). |
valueList |
Edm.String |
Ciąg zawierający rozdzielaną listę wartości, które mają być zgodne z parametrem variable . delimiters Jeśli parametr nie zostanie określony, domyślnymi ogranicznikami są spacje i przecinek. |
delimiters |
Edm.String |
Ciąg, w którym każdy znak jest traktowany jako separator podczas analizowania parametru valueList . Wartość domyślna tego parametru oznacza ' ,' , że wszystkie wartości ze spacjami i/lub przecinkami między nimi zostaną oddzielone. Jeśli musisz użyć separatorów innych niż spacje i przecinki, ponieważ wartości zawierają te znaki, możesz określić alternatywne ograniczniki, takie jak '|' w tym parametrze. |
Wydajność search.in
Jeśli używasz metody search.in
, możesz oczekiwać czasu odpowiedzi podrzędnej sekundy, gdy drugi parametr zawiera listę setek lub tysięcy wartości. Nie ma jawnego limitu liczby elementów, które można przekazać do search.in
elementu , chociaż nadal jest ograniczony przez maksymalny rozmiar żądania. Jednak opóźnienie będzie rosnąć wraz ze wzrostem liczby wartości.
Przykłady
Znajdź wszystkie hotele o nazwie równej "Sea View motel" lub "Budget hotel". Frazy zawierają spacje, które są domyślnym ogranicznikiem. Alternatywny ogranicznik można określić w cudzysłowie pojedynczym jako trzeci parametr ciągu:
search.in(HotelName, 'Sea View motel,Budget hotel', ',')
Znajdź wszystkie hotele o nazwie równej 'Sea View motel' lub 'Budget hotel' oddzielone '|'):
search.in(HotelName, 'Sea View motel|Budget hotel', '|')
Znajdź wszystkie hotele z pokojami, które mają tag "wifi" lub "tub":
Rooms/any(room: room/Tags/any(tag: search.in(tag, 'wifi, tub')))
Znajdź dopasowanie na frazy w kolekcji, takie jak "gorące stojaki na ręczniki" lub "dołączane do włosów" w tagach.
Rooms/any(room: room/Tags/any(tag: search.in(tag, 'heated towel racks,hairdryer included', ','))
Znajdź wszystkie hotele bez tagu "motel" lub "cabin":
Tags/all(tag: not search.in(tag, 'motel, cabin'))