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 campos de coleção. Você pode conseguir isso usando o e all operadoresany.

Sintaxe

O seguinte EBNF (Extended Backus-Naur Form) 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 interativo também está disponível:

Nota

Consulte Referência de sintaxe de expressão OData para Azure AI Search para obter o EBNF completo.

Existem três formas de expressão que filtram coleções.

  • Os dois primeiros iteram sobre um campo de coleção, aplicando um predicado dado na forma de uma expressão lambda a cada elemento da coleção.
    • Uma expressão usando all retorna true se o predicado for true para cada elemento da coleção.
    • Uma expressão usando any retorna true se o predicado for true 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 algum elemento , 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. Ele define uma variável, chamada variável range, que mantém o elemento atual da coleção durante a iteração. Ele também define outra expressão booleana que é o critério de filtro a ser aplicado à variável range para cada elemento da coleção.

Exemplos

Corresponder documentos cujo tags campo contém exatamente a string "wifi":

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

Combinar documentos em que cada elemento do ratings campo se situa entre 3 e 5, inclusive:

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

Corresponder documentos onde qualquer uma das coordenadas geográficas no locations campo está dentro do polígono dado:

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 onde o rooms campo está vazio:

not rooms/any()

Combinar documentos em que (para todas as salas) o rooms/amenities campo contém "tv" e rooms/baseRate é inferior a 100:

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

Limitações

Nem todos os recursos das expressões de filtro estão disponíveis dentro do corpo de uma expressão lambda. As limitações diferem dependendo do tipo de dados do campo de coleta 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 Mesma
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 Mesma
Collection(Edm.GeographyPoint) Utilizar geo.distance com lt ou le

geo.intersects

Combinando subexpressões com or
Utilizar 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, , , , gtneltle, ouge

Combinando comparações com outras subexpressões usando or

Combinação de 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, , , , gtneltle, ouge

Combinando comparações com outras subexpressões usando and

Combinação de comparações, exceto eq com outras subexpressões usando or

Expressões usando combinações de and e or na Forma Normal Conjuntiva (CNF)

Para obter mais detalhes sobre essas limitações, bem como exemplos, consulte Solução de problemas de filtros de coleção no Azure AI Search. Para obter informações mais detalhadas sobre por que essas limitações existem, consulte Noções básicas sobre filtros de coleção no Azure AI Search.

Próximos passos