Функция OData search.in
в поиске ИИ Azure
Выражения фильтра OData часто используются для проверки соответствия одного поля в каждом документе одному из множества возможных значений. Например, именно так некоторые приложения реализуют фильтрацию по ролям безопасности — сравнивая поле, содержащее один или несколько идентификаторов субъектов, со списком идентификаторов субъектов, представляющих пользователя, выполняющего запрос. Написать подобный запрос можно с помощью операторов eq
и or
:
group_ids/any(g: g eq '123' or g eq '456' or g eq '789')
Однако этот же запрос можно написать быстрее с помощью функции search.in
:
group_ids/any(g: search.in(g, '123, 456, 789'))
Внимание
При использовании search.in
получается не только более простой и короткий код — она также обеспечивает преимущества производительности и позволяет обойти некоторые ограничения на размер фильтров, если в фильтр нужно включить сотни или даже тысячи значений. По этой причине мы настоятельно рекомендуем использовать search.in
вместо более сложного логического сложения выражений равенства.
Примечание.
Версия 4.01 стандарта OData недавно представила in
оператор, который имеет аналогичное поведение, как search.in
функция в поиске ИИ Azure. Однако поиск по искусственному интеллекту Azure не поддерживает этот оператор, поэтому вместо этого необходимо использовать функцию search.in
.
Синтаксис
Следующая EBNF (расширенная форма Бэкуса–Наура) определяет грамматику функции search.in
:
search_in_call ::=
'search.in(' variable ',' string_literal(',' string_literal)? ')'
Кроме того, вам может помочь интерактивная схема синтаксиса:
Примечание.
См . справочник по синтаксису выражений OData для поиска ИИ Azure для полного EBNF.
Функция search.in
проверяет наличие равенства между указанным строковым полем или переменной диапазона и одним из указанных списков значений. При проверке на равенство между переменной и каждым значением списка учитывается регистр, так же как и для оператора eq
. Следовательно, выражение, подобное search.in(myfield, 'a, b, c')
, эквивалентно выражению myfield eq 'a' or myfield eq 'b' or myfield eq 'c'
, за исключением того, что функция search.in
выполняется намного быстрее.
Существует две перегрузки функции search.in
:
search.in(variable, valueList)
search.in(variable, valueList, delimiters)
Определения параметров приведены в следующей таблице:
Наименование параметра | Тип | Описание |
---|---|---|
variable |
Edm.String |
Ссылка на строковое поле (или переменную диапазона для поля коллекции строк в том случае, если search.in используется внутри выражения any или all ). |
valueList |
Edm.String |
Строка, содержащая список значений с разделителями для сопоставления с параметром variable . Если параметр delimiters не указан, в качестве разделителей по умолчанию используются пробел и запятая. |
delimiters |
Edm.String |
Строка, в которой каждый символ обрабатывается как разделитель при синтаксическом анализе параметра valueList . Значение этого параметра по умолчанию — ' ,' . Это значит, что все значения с пробелами и/или запятыми между ними будут разделены. Если необходимо использовать другие разделители (например, если ваши значения уже содержат запятые и пробелы), можно указать в этом параметре альтернативный разделитель '|' . |
Производительность search.in
При использовании search.in
время отклика будет менее секунды, если второй параметр содержит список из сотен или тысяч значений. Явного ограничения на количество элементов, которые можно передать в search.in
, нет, однако по-прежнему есть ограничение на максимальный размер запроса. Однако задержка растет по мере увеличения количества значений.
Примеры
Найти все отели с названием Sea View motel или Budget hotel. Фразы содержат пробелы, которые являются разделителями по умолчанию. Вы можете указать альтернативный разделитель в одинарных кавычках в качестве третьего строкового параметра:
search.in(HotelName, 'Sea View motel,Budget hotel', ',')
Найти все отели с названием Sea View motel или Budget hotel; названия разделены знаком "|":
search.in(HotelName, 'Sea View motel|Budget hotel', '|')
Найти все гостиницы, в которых есть комнаты с тегом WiFi или tub (ванна):
Rooms/any(room: room/Tags/any(tag: search.in(tag, 'wifi, tub')))
Найти совпадение по фразам в коллекции, например heated towel racks (подогреваемые стойки для полотенец) или hairdryer included (фен в комплекте) в тегах.
Rooms/any(room: room/Tags/any(tag: search.in(tag, 'heated towel racks,hairdryer included', ','))
Найти все отели без тегов motel (мотель) и cabin (коттедж):
Tags/all(tag: not search.in(tag, 'motel, cabin'))