Azure 认知搜索中的 OData $orderby 语法

在Azure 认知搜索中,$orderby 参数指定搜索结果的自定义排序顺序。 本文介绍 $orderby 的 OData 语法,并提供了示例。

Azure 认知搜索的 OData 语言概述中介绍了字段路径构造和常数。 有关排序行为的详细信息,请参阅排序结果

语法

$orderby 参数接受最多 32 个 order-by 子句的逗号分隔列表。 以下 EBNF(扩展巴科斯-瑙尔范式)描述了 order-by 子句的语法:

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

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

下面还提供了交互式语法图:

注意

请参阅 Azure 认知搜索的 OData 表达式语法参考以了解完整的 EBNF。

每个子句都有排序条件,可以选择后跟排序方向(asc 表示升序,或 desc 表示降序)。 如果不指定方向,则默认为升序。 在字段中有 NULL 值的情况下,如果排序是 asc,则 NULL 值首先出现;如果排序是 desc,则 NULL 值最后出现。

排序条件可以是 sortable 字段的路径,也可以是对 geo.distancesearch.score 函数的调用。

如果多个文档具有相同的排序条件且未使用 search.score 函数(例如,如果按数字 Rating 字段排序,并且三个文档的评分均为 4 分),则会通过以降序按文档分数排序来打破平分的局面。 当文档分数相同时(例如,当请求中没有指定全文搜索查询时),平分文档的相对排序是不确定的。

可以指定多个排序条件。 表达式的顺序决定最终排序顺序。 例如,若要按分数降序排序,然后按评分排序,语法将为 $orderby=search.score() desc,Rating desc

$orderbygeo.distance 的语法与其在 $filter 中的语法相同。 如果在 $orderby 中使用 geo.distance,其应用到的字段必须为 Edm.GeographyPoint 类型,且还必须 sortable

$orderbysearch.score 的语法为 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

另请参阅