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 zwracatrue
wartość , jeśli predykat ma wartość true dla każdego elementu kolekcji. - Wyrażenie używające
any
metody zwracatrue
wartość , jeśli predykat ma wartość true dla co najmniej jednego elementu kolekcji.
- Wyrażenie używające
- 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 eq search.in Łączenie wyrażeń podrzędnych z or |
Porównania z lub ne not search.in() Łączenie wyrażeń podrzędnych z and |
Collection(Edm.Boolean) |
Porównania z lub eq ne |
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 , , ne lt , gt , le lubge Łą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 , , ne lt , gt , le lubge Łą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).