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
retornatrue
se o predicado for true para cada elemento da coleção. - Uma expressão usando
any
retornatrue
se o predicado for true para pelo menos um elemento da coleção.
- Uma expressão usando
- 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)
Correspondência de 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 , ne , lt , gt , le , ou ge 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 , ne , lt , gt , le , ou ge 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.