Операторы сбора OData в поиске ИИ Azure и any
all
При написании выражения фильтра 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".