子句说明
用户可以通过查询语句控制结果的排序方式,包括指定排序的字段和升降序。
语法说明
排序子句格式为:+field1;-field2
field为要排序的字段,+为按字段值升序排序,-为降序排序;
field也支持简单的算术运算,如+、-、*、\等,但参与运算的字段类型必须一致;
支持多维排序,中间用分号(;)分隔;多维排序的含义为,先按照第一维分数排序,如果第一维分数一样,再按照第二维分数进行档内排序,以此类推。
field部分也可以为“RANK”,表示按照相关性(即排序表达式的计算分值)进行排序。
注意事项
sort为非必选子句。如果不填,则默认为sort=-RANK(按照相关性分值降序返回结果);如果显式使用了sort子句,且子句中不包含RANK,那么定义了排序表达式也不会起作用;
在sort中出现的字段必须在定义应用结构的时候,创建为属性;
返回值为数值型的(int或者float)功能性函数也可以在sort子句中使用;
literal 类型字段,英文字母按字母先后顺序排序,数字按位置按个比较大小排序,中文按ASCII码排序。
大部分场景下array类型字段均不支持。
多维sort(如:sort=-field1;-field2;-field3)排序性能与每一维排序的数据特点有关,所以排序性能不能稳定保证,推荐使用排序表达式做排序。例:设置精排:normalize(field1)*100+normalize(field2)*10+normalize(field3)+first_phase_score*10000 (表示获取基础排序表达式分数) ,可参考业务排序函数。
功能性函数使用
distance: 获取两个点之间的球面距离。一般用于LBS的距离计算。
举例:
查找用户搜索的外婆家,并按照距离由近及远排序:
query=default:'外婆家'&&sort=+distance(lon,lat,"120.34256","30.56982")
tag_match: 用于对查询语句和文档做标签匹配,使用匹配结果对文档进行算分加权
举例:(详细案例可点击上方链接)
sort=-tag_match("user_options", options, "mul", "sum", "false", "true", 100)。
示例
查找应用中包含“浙大”的文档,并按照type进行升序排序,如果type相同,则按照文本相关性进行排序(参考排序策略配置):
query=default:'浙大'&&sort=+type;-RANK //精排表达式可以为text_relevance(fileld)
查找应用中包含“浙大”的文档,并按照hits(点击)和comments(评论数)总和降序排序:
query=default:'浙大'&&sort=-(hits+comments)