在创建索引之前,让我们先描述数据集并插入条目。
在此项目中,你将使用一个描述电影的简单数据集,目前所有记录都是英文的。你将在另一个教程中了解更多关于其他语言的信息。
电影由以下属性表示
movie_id
:电影的唯一 ID,此数据库内部使用title
:电影标题。plot
:电影摘要。genre
:电影类型,目前一部电影只有一个类型。release_year
:电影上映年份,为数值类型。rating
:表示公众对这部电影评分的数值。votes
:投票数。poster
:电影海报链接。imdb_id
:电影在 IMDB 数据库中的 ID。作为一名 Redis 开发者,构建应用时首先要考虑的是定义键和数据的结构(数据设计/数据建模)。
在 Redis 中定义键的常用方法是使用特定的模式。例如,在此应用中,数据库可能会处理各种业务对象:电影、演员、影院、用户等,我们可以使用以下模式
业务对象:键
例如
movie:001
表示 ID 为 001 的电影user:001
表示 ID 为 001 的用户对于电影信息,你应该使用 Redis Hash。
Redis Hash 允许应用将所有电影属性组织成单独的字段;此外,Redis Stack 将根据索引定义对字段进行索引。
现在是时候向数据库添加一些数据了,让我们使用 redis-cli
或 RedisInsight 插入几部电影。
连接到你的 Redis 实例后,运行以下命令
> HSET movie:11002 title "Star Wars: Episode V - The Empire Strikes Back" plot "After the Rebels are brutally overpowered by the Empire on the ice planet Hoth, Luke Skywalker begins Jedi training with Yoda, while his friends are pursued by Darth Vader and a bounty hunter named Boba Fett all over the galaxy." release_year 1980 genre "Action" rating 8.7 votes 1127635 imdb_id tt0080684
> HSET movie:11003 title "The Godfather" plot "The aging patriarch of an organized crime dynasty transfers control of his clandestine empire to his reluctant son." release_year 1972 genre "Drama" rating 9.2 votes 1563839 imdb_id tt0068646
> HSET movie:11004 title "Heat" plot "A group of professional bank robbers start to feel the heat from police when they unknowingly leave a clue at their latest heist." release_year 1995 genre "Thriller" rating 8.2 votes 559490 imdb_id tt0113277
> HSET "movie:11005" title "Star Wars: Episode VI - Return of the Jedi" genre "Action" votes 906260 rating 8.3 release_year 1983 plot "The Rebels dispatch to Endor to destroy the second Empire's Death Star." ibmdb_id "tt0086190"
现在可以使用电影 ID 从哈希中获取信息。例如,如果你想获取标题和评分,执行以下命令
> HMGET movie:11002 title rating
1) "Star Wars: Episode V - The Empire Strikes Back"
2) "8.7"
你可以使用以下命令增加这部电影的评分
> HINCRBYFLOAT movie:11002 rating 0.1
"8.8"
但是如何按上映年份、评分或标题获取一部或多部电影列表?
一种选择是读取所有电影,检查所有字段,然后只返回匹配的电影;不用说,这是一个非常糟糕的主意。
然而,这就是 Redis 开发者经常使用 SET/SORTED SET 结构创建自定义二级索引指向电影哈希的地方。这需要一些繁重的设计和实现。
这就是 Redis Stack 中的搜索和查询能够提供帮助的地方,也是创建它的原因。
Redis Stack 通过提供一种简单自动的方式在 Redis Hashes 上创建二级索引,极大地简化了这一点。(未来将支持更多数据结构)
使用 Redis Stack 时,如果要查询某个字段,必须首先对该字段进行索引。让我们开始为我们的 movies
索引以下字段
创建索引时,你需要定义
不要索引所有字段
索引占用内存空间,并且在主数据更新时必须更新。因此,请谨慎创建索引,并根据你的需求保持定义最新。
使用以下命令创建索引
> FT.CREATE idx:movie ON hash PREFIX 1 "movie:" SCHEMA title TEXT SORTABLE release_year NUMERIC SORTABLE rating NUMERIC SORTABLE genre TAG SORTABLE
在运行一些查询之前,让我们详细看看这个命令
FT.CREATE
:使用给定的 spec 创建索引。索引名称将用于所有键名,因此请尽量简短。idx:movie
:索引的名称ON hash
:要索引的结构类型。PREFIX 1 "movie:"
:要索引的键前缀。这是一个列表,因为我们只想索引 movie:* 键,所以数字是 1。假设你想索引具有相同字段的电影和电视剧,你可以使用:PREFIX 2 "movie:" "tv_show:"
SCHEMA ...
:定义要索引的模式、字段及其类型,如命令所示,我们使用了 TEXT、NUMERIC 和 TAG 以及 SORTABLE 参数。你可以使用以下命令查看索引信息
> FT.INFO idx:movie