按索引字段排序

支持对查询结果进行排序

从 RediSearch 0.15 开始,您可以绕过评分函数机制,直接按不同文档属性(字段)的值对搜索结果进行排序,即使查询未使用排序字段也是如此。例如,您可以搜索 First name 并按 Last Name 排序。

声明可排序字段

使用FT.CREATE中,您可以声明TEXT,TAG,NUMERICGEOattributes 设置为SORTABLE.当属性可排序时,您可以按其值对结果进行排序,且延迟相对较低。当属性不可排序时,仍可按其值对其进行排序,但延迟会增加。例如,在以下架构中:

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

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

有关可排序字段的注释

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

规范化(UNF 选项)

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

使用UNF(un-normalized form) 参数,则可以禁用规范化并保留值的原始形式。因此America将更早america.

指定 SORTBY

如果索引包含可排序字段,则可以添加SORTBY参数添加到搜索请求中(在查询正文之外)对结果进行排序。这将覆盖评分函数机制,并且两者不能组合使用。如果WITHSCORESSORTBY,则返回的分数只是每个结果在结果集中的相对位置。

的语法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