数据库包含一些电影和一个索引,现在可以执行一些查询了。
示例:包含字符串 "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 字段。在当前索引中,只有 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
在本教程中,您已完成
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 服务顶部的缓存层、查询用户会话内容等),这通常被称为“短暂搜索”用例:轻量级、快速和过期。