Операторы сбора OData в поиске ИИ Azure и anyall

При написании выражения фильтра OData для использования с поиском ИИ Azure часто полезно фильтровать поля коллекции. Это можно сделать с использованием операторов any и all.

Синтаксис

Приведенная далее EBNF (расширенная форма Бэкуса-Наура) определяет грамматику выражения OData, в котором используется any или all.

collection_filter_expression ::=
    field_path'/all(' lambda_expression ')'
    | field_path'/any(' lambda_expression ')'
    | field_path'/any()'

lambda_expression ::= identifier ':' boolean_expression

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

Примечание.

См . справочник по синтаксису выражений OData для поиска ИИ Azure для полного EBNF.

Существуют три формы выражений, которые фильтруют коллекции.

  • Первые две формы проходят итерации по коллекции, применяя предикат, указанный в форме лямбда–выражения, к каждому элементу коллекции.
    • Выражение, использующее all, возвращает true, если значение предиката равно true для каждого элемента коллекции.
    • Выражение, использующее any, возвращает true, если значение предиката равно true хотя бы для одного элемента коллекция.
  • Третья форма фильтра коллекции использует any без лямбда–выражения и проверяет, пусто ли поле коллекции. Если в коллекции есть какие-либо элементы, возвращается значение true. Если коллекция пуста, возвращается значение false.

Лямбда–выражение в фильтре коллекции аналогично телу цикла в языке программирования. Оно определяет переменную, называемую переменная диапазона, в которой во время итерации хранится текущий элемент коллекции. Оно также определяет другое логическое выражение, которое является условием фильтрации и применяется к переменной диапазона для каждого элемента коллекции.

Примеры

Сопоставить документы, поле tags в которых содержит точную строку "wifi":

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

Сопоставить документы, в которых каждый элемент поля ratings находится между 3 и 5, включительно:

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

Сопоставить документы, в которых любая из географических координат в поле locations находится в пределах заданного полигона:

locations/any(loc: geo.intersects(loc, geography'POLYGON((-122.031577 47.578581, -122.031577 47.678581, -122.131577 47.678581, -122.031577 47.578581))'))

Сопоставить документы, в которых поле rooms пустое:

not rooms/any()

Соответствует документам, где (для всех комнат) rooms/amenities поле содержит "tv", и rooms/baseRate меньше 100:

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

Ограничения

Не все функции выражений-фильтров доступны в теле лямбда-выражения. Ограничения зависят от типа данных в поле фильтруемой коллекции. В следующей таблице обобщенные такие ограничения.

Тип данных Функции, допустимые в лямбда-выражениях с параметром any Функции, допустимые в лямбда-выражениях с параметром all
Collection(Edm.ComplexType) Все, кроме search.ismatch и search.ismatchscoring Одинаковые
Collection(Edm.String) Сравнения с помощью оператора eq или search.in

Объединение подвыражений с помощью оператора or
Сравнения с помощью оператора ne или not search.in()

Объединение подвыражений с помощью оператора and
Collection(Edm.Boolean) Сравнения с помощью оператора eq или ne Одинаковые
Collection(Edm.GeographyPoint) Использование geo.distance с оператором lt или le

geo.intersects

Объединение подвыражений с помощью оператора or
Использование geo.distance с оператором gt или ge

not geo.intersects(...)

Объединение подвыражений с помощью оператора and
Collection(Edm.DateTimeOffset), , Collection(Edm.Double)Collection(Edm.Int32)Collection(Edm.Int64) Сравнения с помощью оператора eq, ne, lt, gt, le или ge

Объединение сравнений с другими подвыражениями с помощью оператора or

Объединение сравнений, кроме выполненных с помощью оператора ne, с другими подвыражениями с помощью оператора and

Выражения, в которых используются сочетания операторов and и or в дизъюнктивной нормальной форме (ДНФ)
Сравнения с помощью оператора eq, ne, lt, gt, le или ge

Объединение сравнений с другими подвыражениями с помощью оператора and

Объединение сравнений, кроме выполненных с помощью оператора eq, с другими подвыражениями с помощью оператора or

Выражения, в которых используются сочетания операторов and и or в конъюнктивной нормальной форме (КНФ)

Дополнительные сведения об этих ограничениях, а также примеры см. в разделе "Устранение неполадок с фильтрами коллекции" в службе "Поиск ИИ Azure". Дополнительные сведения о том, почему эти ограничения существуют, см. в статье "Общие сведения о фильтрах коллекций" в службе "Поиск ИИ Azure".

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