按索引字段排序

支持查询结果排序

从 RediSearch 0.15 版本开始,您可以绕过评分函数机制,直接根据不同文档属性(字段)的值对搜索结果进行排序,即使查询中未使用该排序字段。例如,您可以按名字搜索,然后按姓氏排序。

声明可排序字段

使用 FT.CREATE 创建索引时,您可以将 TEXTTAGNUMERICGEO 属性声明为 SORTABLE。当属性可排序时,您可以根据其值以相对较低的延迟对结果进行排序。当属性不可排序时,仍可以根据其值进行排序,但延迟会增加。例如,在以下 Schema 中

FT.CREATE users SCHEMA first_name TEXT last_name TEXT SORTABLE age NUMERIC SORTABLE

字段 last_nameage 可排序,但 first_name 不可排序。这意味着您可以按名字和/或姓氏搜索,并按姓氏或年龄排序。

关于可排序字段的注意事项

在当前实现中,声明可排序字段时,其内容会被复制到索引中的一个特殊位置,以便在排序期间快速访问。这意味着使长字段可排序非常昂贵,您应谨慎使用。

规范化(UNF 选项)

默认情况下,文本字段在存储用于排序时会以 Unicode 安全的方式进行规范化和转换为小写。例如,在排序方面,Americaamerica 被视为相等。

使用 UNF(非规范化形式)参数,可以禁用规范化并保留值的原始形式。因此,America 会排在 america 之前。

指定 SORTBY

如果索引包含可排序字段,您可以在搜索请求(在查询主体之外)中添加 SORTBY 参数来对结果进行排序。这会覆盖评分函数机制,两者不能结合使用。如果将 WITHSCORESSORTBY 一起指定,返回的分数只是每个结果在结果集中的相对位置。

SORTBY 的语法是

SORTBY {field_name} [ASC|DESC]
  • field_name 必须是 Schema 中定义的可排序字段。

  • 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
评价本页
回到顶部 ↑