学习

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

查询#

示例:包含字符串“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”。这是因为标题已作为文本索引,因此该字段是标记化的,并且词干化的。

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

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

> 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 字段。在当前索引中,只有标题作为 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 包含拼写错误,但可以使用模糊匹配来匹配。模糊匹配是基于莱文斯坦距离(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"

示例:所有ThrillerAction电影”

> 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"

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

示例:所有ThrillerAction电影,标题中没有Jedi

> 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 日