Operatory kolekcji OData w usłudze Azure AI Search — any i all

Podczas pisania wyrażenia filtru OData do użycia z usługą Azure AI Search często warto filtrować pola kolekcji. Można to osiągnąć za pomocą any operatorów i all .

Składnia

Poniższy formularz EBNF (rozszerzony formularz Backus-Naur) definiuje gramatykę wyrażenia OData, które używa any wartości lub all.

collection_filter_expression ::=
    field_path'/all(' lambda_expression ')'
    | field_path'/any(' lambda_expression ')'
    | field_path'/any()'

lambda_expression ::= identifier ':' boolean_expression

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.

Istnieją trzy formy wyrażenia, które filtrują kolekcje.

  • Pierwsze dwie iterują w polu kolekcji, stosując predykat podany w postaci wyrażenia lambda do każdego elementu kolekcji.
    • Wyrażenie używające all metody zwraca true wartość , jeśli predykat ma wartość true dla każdego elementu kolekcji.
    • Wyrażenie używające any metody zwraca true wartość , jeśli predykat ma wartość true dla co najmniej jednego elementu kolekcji.
  • Trzecia forma filtru kolekcji używa any bez wyrażenia lambda w celu sprawdzenia, czy pole kolekcji jest puste. Jeśli kolekcja zawiera jakiekolwiek elementy, zwraca wartość true. Jeśli kolekcja jest pusta, zwraca wartość false.

Wyrażenie lambda w filtrze kolekcji przypomina treść pętli w języku programowania. Definiuje zmienną o nazwie zmienną zakresu, która przechowuje bieżący element kolekcji podczas iteracji. Definiuje również inne wyrażenie logiczne, które jest kryterium filtru, które ma być stosowane do zmiennej zakresu dla każdego elementu kolekcji.

Przykłady

Dopasuj dokumenty, których tags pole zawiera dokładnie ciąg "wifi":

tags/any(t: t eq 'wifi')

Dopasuj dokumenty, w których każdy element ratings pola mieści się w przedziale od 3 do 5 włącznie:

ratings/all(r: r ge 3 and r le 5)

Dopasuj dokumenty, w których każda współrzędna geograficzna w locations polu znajduje się w danym wielokącie:

locations/any(loc: geo.intersects(loc, geography'POLYGON((-122.031577 47.578581, -122.031577 47.678581, -122.131577 47.678581, -122.031577 47.578581))'))

Dopasuj dokumenty, w rooms których pole jest puste:

not rooms/any()

Dopasuj dokumenty, w których (dla wszystkich pomieszczeń) rooms/amenities pole zawiera wartość "tv" i rooms/baseRate jest mniejsze niż 100:

rooms/all(room: room/amenities/any(a: a eq 'tv') and room/baseRate lt 100.0)

Ograniczenia

Nie każda funkcja wyrażeń filtru jest dostępna wewnątrz treści wyrażenia lambda. Ograniczenia różnią się w zależności od typu danych pola kolekcji, które chcesz filtrować. Poniższa tabela zawiera podsumowanie ograniczeń.

Typ danych Funkcje dozwolone w wyrażeniach lambda z any Funkcje dozwolone w wyrażeniach lambda z all
Collection(Edm.ComplexType) Wszystko z wyjątkiem search.ismatch i search.ismatchscoring To samo
Collection(Edm.String) Porównania z lub eqsearch.in

Łączenie wyrażeń podrzędnych z or
Porównania z lub nenot search.in()

Łączenie wyrażeń podrzędnych z and
Collection(Edm.Boolean) Porównania z lub eqne To samo
Collection(Edm.GeographyPoint) Używanie z geo.distance programem lt lub le

geo.intersects

Łączenie wyrażeń podrzędnych z or
Używanie z geo.distance programem gt lub ge

not geo.intersects(...)

Łączenie wyrażeń podrzędnych z and
Collection(Edm.DateTimeOffset), Collection(Edm.Double), Collection(Edm.Int32), Collection(Edm.Int64) Porównania przy użyciu poleceń eq, , nelt, gt, lelubge

Łączenie porównań z innymi wyrażeniami podrzędnymi przy użyciu or

Łączenie porównań z wyjątkiem ne innych wyrażeń podrzędnych przy użyciu and

Wyrażenia używające kombinacji and i or w postaci normalnej odsuwanej (DNF)
Porównania przy użyciu poleceń eq, , nelt, gt, lelubge

Łączenie porównań z innymi wyrażeniami podrzędnymi przy użyciu and

Łączenie porównań z wyjątkiem eq innych wyrażeń podrzędnych przy użyciu or

Wyrażenia używające kombinacji and i or w postaci normalnej conjunctive (CNF)

Aby uzyskać więcej informacji na temat tych ograniczeń, a także przykłady, zobacz Rozwiązywanie problemów z filtrami kolekcji w usłudze Azure AI Search. Aby uzyskać bardziej szczegółowe informacje na temat tego, dlaczego istnieją te ograniczenia, zobacz Understanding collection filters in Azure AI Search (Opis filtrów kolekcji w usłudze Azure AI Search).

Następne kroki