Operadores de coleção OData no Azure AI Search – any
e all
Ao escrever uma expressão de filtro OData para usar com o Azure AI Search, geralmente é útil filtrar nos campos de coleção. Isso é realizado usando os operadores any
e all
.
Sintaxe
A EBNF (forma estendida de Backus-Naur) a seguir define a gramática de uma expressão OData que usa any
ou all
.
collection_filter_expression ::=
field_path'/all(' lambda_expression ')'
| field_path'/any(' lambda_expression ')'
| field_path'/any()'
lambda_expression ::= identifier ':' boolean_expression
Um diagrama de sintaxe interativa também está disponível:
Observação
Confira Referência de sintaxe de expressão OData para Azure IA Search para ver a EBNF completa.
Há três formas de expressão que filtram coleções.
- As duas primeiras iteram em um campo de coleção, aplicando um predicado fornecido na forma de uma expressão lambda para cada elemento da coleção.
- Uma expressão que usa
all
retornarátrue
se o predicado for verdadeiro para cada elemento da coleção. - Uma expressão que usa
any
retornarátrue
se o predicado for verdadeiro para, pelo menos, um elemento da coleção.
- Uma expressão que usa
- A terceira forma de filtro de coleção usa
any
sem uma expressão lambda para testar se um campo de coleção está vazio. Se a coleção tiver elementos, ela retornarátrue
. Se a coleção estiver vazia, ela retornaráfalse
.
Uma expressão lambda em um filtro de coleção é como o corpo de um loop em uma linguagem de programação. Ela define uma variável, chamada variável de intervalo, que contém o elemento atual da coleção durante a iteração. Ela também define outra expressão booliana que é o critério de filtro a ser aplicado à variável de intervalo para cada elemento da coleção.
Exemplos
Corresponder documentos cujo campo tags
contém exatamente a cadeia de caracteres “wifi”:
tags/any(t: t eq 'wifi')
Corresponder documentos em que cada elemento do campo ratings
está entre 3 e 5, inclusive:
ratings/all(r: r ge 3 and r le 5)
Corresponder documentos em que qualquer uma das coordenadas geográficas no campo locations
está dentro do polígono determinado:
locations/any(loc: geo.intersects(loc, geography'POLYGON((-122.031577 47.578581, -122.031577 47.678581, -122.131577 47.678581, -122.031577 47.578581))'))
Corresponder documentos em que o campo rooms
está vazio:
not rooms/any()
Corresponder documentos em que (para todas as salas) o campo rooms/amenities
contem “tv” e rooms/baseRate
é menor que 100:
rooms/all(room: room/amenities/any(a: a eq 'tv') and room/baseRate lt 100.0)
Limitações
Nem todos recursos de expressões de filtro estão disponíveis dentro do corpo de uma expressão lambda. As limitações são diferentes dependendo do tipo de dados do campo de coleção que você deseja filtrar. A tabela a seguir resume as limitações.
Tipo de dados | Recursos permitidos em expressões lambda com any |
Recursos permitidos em expressões lambda com all |
---|---|---|
Collection(Edm.ComplexType) |
Tudo exceto search.ismatch e search.ismatchscoring |
Idêntico |
Collection(Edm.String) |
Comparações com eq ou search.in Combinando subexpressões com or |
Comparações com ne ou not search.in() Combinando subexpressões com and |
Collection(Edm.Boolean) |
Comparações com eq ou ne |
Idêntico |
Collection(Edm.GeographyPoint) |
Usando geo.distance com lt ou le geo.intersects Combinando subexpressões com or |
Usando geo.distance com gt ou ge not geo.intersects(...) Combinando subexpressões com and |
Collection(Edm.DateTimeOffset) , Collection(Edm.Double) , Collection(Edm.Int32) , Collection(Edm.Int64) |
Comparações usando eq , ne , lt , gt , le ou ge Combinando comparações com outras subexpressões usando or Combinar comparações, exceto ne com outras subexpressões usando and Expressões usando combinações de and e or na forma normal disjuntiva (DNF) |
Comparações usando eq , ne , lt , gt , le ou ge Combinando comparações com outras subexpressões usando and Combinar comparações, exceto eq com outras subexpressões usando or Expressões usando combinações de and e or no formato normal de conjuntiva (CNF) |
Veja mais detalhes sobre essas limitações e exemplos em Solução de problemas de filtros de coleta no Azure AI Search. Veja informações mais detalhadas sobre o motivo dessas limitações em Noções básicas sobre filtros de coleta no Azure AI Search.