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.
  • 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.

Próximas etapas