Синтаксис OData $orderby в поиске ИИ Azure

В поиске ИИ Azure параметр $orderby задает пользовательский порядок сортировки результатов поиска. В этой статье описывается синтаксис OData $orderby и приведены примеры.

Построение и константы пути полей описаны в обзоре языка OData в поиске ИИ Azure. Дополнительные сведения о поведении сортировки см. в разделе "Упорядочивание результатов".

Синтаксис

Параметр $orderby принимает разделенный запятыми список из не более 32 предложений order-by. Синтаксис предложения order-by описывается следующим EBNF (Расширенная форма Бэкуса — Наура):

order_by_clause ::= (field_path | sortable_function) ('asc' | 'desc')?

sortable_function ::= geo_distance_call | 'search.score()'

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

Примечание.

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

Каждое предложение имеет критерий сортировки, за которым при необходимости следует направление сортировки (asc для сортировки по возрастанию или desc — по убыванию). Если направление указано не было, по умолчанию будет использоваться направление по возрастанию. Если в поле есть нулевые значения (null), то такие значения будут отображаться первыми, если сортировка имеет тип asc, и последними, если сортировка имеет тип desc.

Критерием сортировки может быть либо имя поля sortable, либо вызов функций geo.distance или search.score.

Для строковых полей будет использоваться порядок сортировки ASCII по умолчанию и порядок сортировки Юникода по умолчанию. По умолчанию сортировка учитывает регистр, но вы можете использовать нормализатор для предварительной обработки текста перед сортировкой, чтобы изменить это поведение. Вы также можете использовать asciifolding нормализатор для преобразования символов, отличных от ASCII, в эквивалент ASCII, если он существует.

Если несколько документов имеют одинаковые критерии сортировки и функция search.score не используется (например, если вы сортируете по числовому полю Rating и все три документа имеют оценку 4), результаты будут отсортированы по оценке документов в убывающем порядке. Если оценки документов одинаковы (например, если в запросе не указан полнотекстовый поиск), относительный порядок связанных документов будет неопределенным.

Вы можете определить несколько условий сортировки. Порядок выражений определяет окончательный порядок сортировки. Например, для сортировки по убыванию оценки, а затем по значению рейтинга синтаксис будет таким: $orderby=search.score() desc,Rating desc.

Синтаксис для geo.distance в $orderby такой же, как и в $filter. При использовании функции geo.distance в $orderby поле, к которому она применяется, должно быть сортируемым (sortable) и иметь тип Edm.GeographyPoint.

Синтаксис для search.score в $orderby — search.score(). Функция search.score не принимает параметров.

Примеры

Сортировать отели по возрастанию базового тарифа:

    $orderby=BaseRate asc

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

    $orderby=Rating desc,BaseRate

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

    $orderby=Rating desc,geo.distance(Location, geography'POINT(-122.131577 47.678581)') asc

Сортировать отели в порядке убывания по search.score и рейтингу, а затем в порядке возрастания по расстоянию от заданных координат. Между двумя отелями с одинаковыми показателями релевантности и рейтингами в первую очередь будет показан ближайший:

    $orderby=search.score() desc,Rating desc,geo.distance(Location, geography'POINT(-122.131577 47.678581)') asc

См. также