按索引字段排序
支持对查询结果进行排序
从 RediSearch 0.15 开始,您可以绕过评分函数机制,直接按不同文档属性(字段)的值对搜索结果进行排序,即使排序字段未被查询使用。例如,您可以搜索姓氏,并按名字进行排序。
声明可排序字段
在使用 FT.CREATE
创建索引时,您可以将 TEXT
、TAG
、NUMERIC
和 GEO
属性声明为 SORTABLE
。当一个属性可排序时,您可以按其值对结果进行排序,延迟相对较低。当一个属性不可排序时,它仍然可以按其值排序,但延迟会增加。例如,在以下模式中
FT.CREATE users SCHEMA first_name TEXT last_name TEXT SORTABLE age NUMERIC SORTABLE
字段 last_name
和 age
是可排序的,但 first_name
不是。这意味着您可以按姓氏和/或名字搜索,并按姓氏或年龄排序。
关于可排序字段的说明
在当前实现中,当声明一个可排序字段时,其内容会被复制到索引中的一个特殊位置,以便在排序过程中快速访问。这意味着使长字段可排序非常昂贵,您应该谨慎使用它。
规范化(UNF 选项)
默认情况下,文本字段在存储以进行排序时会以 Unicode 安全的方式进行规范化和小写转换。例如,America
和 america
在排序方面被认为是相等的。
使用 UNF
(非规范化形式)参数,可以禁用规范化并保留值的原始形式。因此,America
将排在 america
之前。
指定 SORTBY
如果索引包含可排序字段,您可以将 SORTBY
参数添加到搜索请求中(查询主体之外)以对结果进行排序。这将覆盖评分函数机制,两者不能组合使用。如果与 SORTBY
一起指定了 WITHSCORES
,则返回的得分只是结果集每个结果的相对位置。
SORTBY
的语法为
SORTBY {field_name} [ASC|DESC]
-
field_name
必须是在模式中定义的可排序字段。 -
ASC
表示升序,DESC
表示降序。 -
默认排序方式为
ASC
。
示例
> FT.CREATE users ON HASH PREFIX 1 "user" SCHEMA first_name TEXT SORTABLE last_name TEXT age NUMERIC SORTABLE
# Add some users
> HSET user1 first_name "alice" last_name "jones" age 35
> HSET user2 first_name "bob" last_name "jones" age 36
# Searching while sorting
# Searching by last name and sorting by first name
> FT.SEARCH users "@last_name:jones" SORTBY first_name DESC
# Searching by both first and last name, and sorting by age
> FT.SEARCH users "jones" SORTBY age ASC