Função OData search.in
no Azure AI Search
Um cenário comum em expressões de filtro OData é verificar se um único campo em cada documento é igual a um dos muitos valores possíveis. Por exemplo, é assim que alguns aplicativos implementam a filtragem de segurança -- verificando um campo que contém uma ou mais IDs principais em relação a uma lista de IDs principais que representam o usuário que emite a consulta. Uma maneira de escrever uma consulta como esta é usar os eq
operadores e or
:
group_ids/any(g: g eq '123' or g eq '456' or g eq '789')
No entanto, há uma maneira mais curta de escrever isso, usando a search.in
função:
group_ids/any(g: search.in(g, '123, 456, 789'))
Importante
Além de ser mais curto e fácil de ler, o uso search.in
também proporciona benefícios de desempenho e evita certas limitações de tamanho dos filtros quando há centenas ou até milhares de valores para incluir no filtro. Por esta razão, recomendamos vivamente o uso search.in
de expressões de igualdade, em vez de uma disjunção mais complexa.
Nota
A versão 4.01 do padrão OData introduziu recentemente o in
operador, que tem comportamento semelhante à search.in
função no Azure AI Search. No entanto, o Azure AI Search não oferece suporte a esse operador, portanto, você deve usar a search.in
função.
Sintaxe
O seguinte EBNF (Extended Backus-Naur Form) define a gramática da search.in
função:
search_in_call ::=
'search.in(' variable ',' string_literal(',' string_literal)? ')'
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.
A search.in
função testa se um determinado campo de cadeia de caracteres ou variável de intervalo é igual a um de uma determinada lista de valores. A igualdade entre a variável e cada valor na lista é determinada de forma sensível a maiúsculas e minúsculas, da mesma forma que para o eq
operador. Portanto, uma expressão como search.in(myfield, 'a, b, c')
é equivalente a myfield eq 'a' or myfield eq 'b' or myfield eq 'c'
, só que search.in
vai render um desempenho muito melhor.
Existem duas sobrecargas da search.in
função:
search.in(variable, valueList)
search.in(variable, valueList, delimiters)
Os parâmetros são definidos na tabela a seguir:
Nome do parâmetro | Tipo | Description |
---|---|---|
variable |
Edm.String |
Uma referência de campo de cadeia de caracteres (ou uma variável de intervalo sobre um campo de coleção de cadeia de caracteres no caso em que search.in é usado dentro de uma any expressão ou all ). |
valueList |
Edm.String |
Uma cadeia de caracteres que contém uma lista delimitada de valores para corresponder ao variable parâmetro. Se o delimiters parâmetro não for especificado, os delimitadores padrão serão espaço e vírgula. |
delimiters |
Edm.String |
Uma cadeia de caracteres onde cada caractere é tratado como um separador ao analisar o valueList parâmetro. O valor padrão deste parâmetro é ' ,' o que significa que quaisquer valores com espaços e/ou vírgulas entre eles serão separados. Se você precisar usar separadores diferentes de espaços e vírgulas porque seus valores incluem esses caracteres, poderá especificar delimitadores alternativos, como '|' neste parâmetro. |
Desempenho de search.in
Se você usar search.in
o , poderá esperar um tempo de resposta inferior a um segundo quando o segundo parâmetro contiver uma lista de centenas ou milhares de valores. Não há limite explícito para o número de itens para search.in
os quais você pode passar, embora ainda esteja limitado pelo tamanho máximo da solicitação. No entanto, a latência crescerá à medida que o número de valores crescer.
Exemplos
Encontre todos os hotéis com nome igual a 'Sea View motel' ou 'Budget hotel'. As frases contêm espaços, que é um delimitador padrão. Você pode especificar um delimitador alternativo entre aspas simples como o terceiro parâmetro de cadeia de caracteres:
search.in(HotelName, 'Sea View motel,Budget hotel', ',')
Encontre todos os hotéis com nome igual a 'Sea View motel' ou 'Budget hotel' separados por '|'):
search.in(HotelName, 'Sea View motel|Budget hotel', '|')
Encontre todos os hotéis com quartos com a tag 'wifi' ou 'banheira':
Rooms/any(room: room/Tags/any(tag: search.in(tag, 'wifi, tub')))
Encontre uma correspondência em frases de uma coleção, como "toalheiros aquecidos" ou "secador de cabelo incluído" nas etiquetas.
Rooms/any(room: room/Tags/any(tag: search.in(tag, 'heated towel racks,hairdryer included', ','))
Encontre todos os hotéis sem a tag 'motel' ou 'cabine':
Tags/all(tag: not search.in(tag, 'motel, cabin'))