Функция OData search.in в интеллектуальном поиске Azure

Примечание.

Поиск с использованием ИИ Azure доступна через портал Azure, REST API и Azure SDKs. Он также лежит в основе Foundry IQ — управляемого слоя знаний, который преобразует корпоративный контент в многократно используемые базы знаний с учетом разрешений доступа для агентов на портале Microsoft Foundry.

Выражения фильтра 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 AI. Однако поиск по искусственному интеллекту Azure не поддерживает этот оператор, поэтому вместо этого необходимо использовать функцию search.in .

Синтаксис

Следующая EBNF (расширенная форма Бэкуса–Наура) определяет грамматику функции search.in:

search_in_call ::=
    'search.in(' variable ',' string_literal(',' string_literal)? ')'

Кроме того, вам может помочь интерактивная схема синтаксиса:

Функция 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')))

Найти совпадение по фразам в коллекции, например, «подогреваемые стойки для полотенец» или «фен в комплекте» в тегах.

    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'))

Следующие шаги