学习

数据库包含一些电影和一个索引,现在可以执行一些查询了。

查询#

示例:包含字符串 "war" 的所有电影

> FT.SEARCH idx:movie "war"

1) (integer) 2
2) "movie:11005"
3)  1) "title"
    2) "Star Wars: Episode VI - Return of the Jedi"
    ...
   14) "tt0086190"
4) "movie:11002"
5)  1) "title"
    2) "Star Wars: Episode V - The Empire Strikes Back"
    ...
   13) "imdb_id"
   14) "tt0080684"

FT.SEARCH 命令返回一个结果列表,首先是结果数量,然后是元素列表(键和字段)。

如您所见,即使您只使用了“war”一词来匹配标题中的“Wars”,电影 Star Wars: Episode V - The Empire Strikes Back 也被找到了。这是因为标题已被索引为文本,因此字段已被 标记化 和 词干化

稍后,在更详细地查看查询语法时,您将了解更多搜索功能。

还可以使用 RETURN 参数限制查询返回的字段列表,让我们运行相同的查询,并仅返回标题和 release_year。

> FT.SEARCH idx:movie "war" RETURN 2 title release_year

1) (integer) 2
2) "movie:11005"
3) 1) "title"
   2) "Star Wars: Episode VI - Return of the Jedi"
   3) "release_year"
   4) "1983"
4) "movie:11002"
5) 1) "title"
   2) "Star Wars: Episode V - The Empire Strikes Back"
   3) "release_year"
   4) "1980"

此查询未指定任何“字段”但仍返回了一些电影,这是因为 Redis Stack 中的搜索默认会搜索所有 TEXT 字段。在当前索引中,只有 title 是 TEXT 字段。稍后您将看到如何更新索引,以向其中添加更多字段。

如果您需要在特定字段上执行查询,可以使用 @field: 语法指定,例如

> FT.SEARCH idx:movie "@title:war" RETURN 2 title release_year

示例

添加字符串 -jedi (减号)将指示查询引擎不返回包含 jedi 的值。

> FT.SEARCH idx:movie "war -jedi" RETURN 2 title release_year

1) (integer) 1
2) "movie:11002"
3) 1) "title"
   2) "Star Wars: Episode V - The Empire Strikes Back"
   3) "release_year"
   4) "1980"

示例:使用模糊搜索查询包含字符串“gdfather”的所有电影

如您所见,“godfather”一词包含拼写错误,但可以使用 模糊匹配进行匹配。模糊匹配基于 Levenshtein 距离 (LD)进行。

> FT.SEARCH idx:movie " %gdfather% " RETURN 2 title release_year

1) (integer) 1
2) "movie:11003"
3) 1) "title"
   2) "The Godfather"
   3) "release_year"
   4) "1972"

示例:所有 Thriller 电影

genre 字段被索引为 TAG,并允许精确匹配查询。

查询 TAG 字段的语法是 @field_name:{value}

> FT.SEARCH idx:movie "@genre:{Thriller}" RETURN 2 title release_year

1) (integer) 1
2) "movie:11004"
3) 1) "title"
   2) "Heat"
   3) "release_year"
   4) "1995"

示例:所有 Thriller 或 Action 电影

> FT.SEARCH idx:movie "@genre:{Thriller|Action}" RETURN 2 title release_year

1) (integer) 3
2) "movie:11004"
3) 1) "title"
   2) "Heat"
   3) "release_year"
   4) "1995"
4) "movie:11005"
5) 1) "title"
   2) "Star Wars: Episode VI - Return of the Jedi"
   3) "release_year"
   4) "1983"
6) "movie:11002"
7) 1) "title"
   2) "Star Wars: Episode V - The Empire Strikes Back"
   3) "release_year"
   4) "1980"

您可以在 文档中找到有关 Tag 过滤器的更多信息。

示例:所有标题中不包含 Jedi 的 Thriller 或 Action 电影

> FT.SEARCH idx:movie "@genre:{Thriller|Action} @title:-jedi" RETURN 2 title release_year

1) (integer) 2
2) "movie:11004"
3) 1) "title"
   2) "Heat"
   3) "release_year"
   4) "1995"
4) "movie:11002"
5) 1) "title"
   2) "Star Wars: Episode V - The Empire Strikes Back"
   3) "release_year"
   4) "1980"

示例:所有在 1970 年至 1980 年(含)之间发行的电影

FT.SEARCH 语法有两种查询数值字段的方法

  • 使用 FILTER 参数

  • 在查询字符串中使用 @field
> FT.SEARCH idx:movie * FILTER release_year 1970 1980 RETURN 2 title release_year
> FT.SEARCH idx:movie "@release_year:[1970 1980]" RETURN 2 title release_year

1) (integer) 2
2) "movie:11003"
3) 1) "title"
   2) "The Godfather"
   3) "release_year"
   4) "1972"
4) "movie:11002"
5) 1) "title"
   2) "Star Wars: Episode V - The Empire Strikes Back"
   3) "release_year"
   4) "1980"

要在 FILTER 或查询字符串中排除一个值,请在其前面加上 (,例如排除 1980 年:

> FT.SEARCH idx:movie "@release_year:[1970 (1980]" RETURN 2 title release_year

插入、更新、删除和设置文档过期时间#

在本教程中,您已完成

  1. 1. 创建了一些电影,作为 Redis 哈希 (),键模式为 movie:*
  2. 2. 使用 FT.CREATE 命令创建了索引
  3. 3. 使用 FT.SEARCH 查询了数据

创建索引时,使用 idx:movie ON hash PREFIX 1 "movie:" 参数指示索引引擎查看所有现有键并对其进行索引。

此外,匹配此模式/类型的新信息也将被索引。

让我们计算电影数量,添加一部新电影,然后再次计算

> FT.SEARCH idx:movie "*" LIMIT 0 0

1) (integer) 4


> HSET movie:11033 title "Tomorrow Never Dies" plot "James Bond sets out to stop a media mogul's plan to induce war between China and the U.K in order to obtain exclusive global media coverage." release_year 1997 genre "Action" rating 6.5 votes 177732 imdb_id tt0120347

> FT.SEARCH idx:movie "*" LIMIT 0 0

1) (integer) 5

新电影已被索引。您也可以在任何已索引的字段上进行搜索

> FT.SEARCH idx:movie "never" RETURN 2 title release_year

1) (integer) 1
2) "movie:11033"
3) 1) "title"
   2) "Tomorrow Never Dies"
   3) "release_year"
   4) "1997"

现在,您 更新 其中一个字段,并搜索 007

> HSET movie:11033 title "Tomorrow Never Dies - 007"


> FT.SEARCH idx:movie "007" RETURN 2 title release_year

1) (integer) 1
2) "movie:11033"
3) 1) "title"
   2) "Tomorrow Never Dies - 007"
   3) "release_year"
   4) "1997"

当您 删除 哈希时,索引也会更新,当键过期(TTL - 生命周期)时也会发生同样的情况。

例如,将詹姆斯邦德电影设置为 20 秒后过期

> EXPIRE "movie:11033" 20

您可以运行以下查询,您将看到文档在 20 秒后过期,并且搜索查询将不返回任何结果,表明索引已更新。

> FT.SEARCH idx:movie "007" RETURN 2 title release_year

1) (integer)
提示

当您将 Redis 用作主要数据库时,不一定会使用 TTL 来删除记录。但是,如果您存储和索引的数据是瞬时的(例如,位于另一个数据存储或 Web 服务顶部的缓存层、查询用户会话内容等),这通常被称为“短暂搜索”用例:轻量级、快速和过期。

更多#

您可以在文档中找到许多关于索引和搜索的其他功能

让我们看看如何检查、修改和删除索引。

上次更新时间 2024 年 3 月 18 日