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.inelementu , 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'))

Następne kroki