Azure AI 搜索中的 OData $orderby 语法
在 Azure AI 搜索中,$orderby 参数指定搜索结果的自定义排序顺序。 本文介绍 $orderby 的 OData 语法,并提供了示例。
Azure AI 搜索中的 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 AI 搜索的 OData 表达式语法参考以获取完整的 EBNF。
每个子句都有排序条件,可以选择后跟排序方向(asc
表示升序,或 desc
表示降序)。 如果不指定方向,则默认为升序。 在字段中有 NULL 值的情况下,如果排序是 asc
,则 NULL 值首先出现;如果排序是 desc
,则 NULL 值最后出现。
排序条件可以是 sortable
字段的路径,也可以是对 geo.distance
或 search.score
函数的调用。
如果多个文档具有相同的排序条件且未使用 search.score
函数(例如,如果按数字 Rating
字段排序,并且三个文档的评分均为 4 分),则会通过以降序按文档分数排序来打破平分的局面。 当文档分数相同时(例如,当请求中没有指定全文搜索查询时),平分文档的相对排序是不确定的。
可以指定多个排序条件。 表达式的顺序决定最终排序顺序。 例如,若要按分数降序排序,然后按评分排序,语法将为 $orderby=search.score() desc,Rating desc
。
$orderby 中 geo.distance
的语法与其在 $filter 中的语法相同。 如果在 $orderby 中使用 geo.distance
,其应用到的字段必须为 Edm.GeographyPoint
类型,且还必须 sortable
。
$orderby 中 search.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