数据库包含一些电影和一个索引,现在可以执行一些查询。
示例:包含字符串“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 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"
> 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"
您可以在文档中找到有关标签过滤器的更多信息。
示例:所有Thriller
或Action
电影,标题中没有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
在本教程中,您已经
movie:*
FT.CREATE
命令创建索引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 服务顶部的缓存层、查询用户会话内容等),这通常被称为“短暂搜索”用例:轻量级、快速且过期。