在创建索引之前,让我们描述数据集并插入条目。
在本项目中,您将使用一个简单的数据集来描述电影,目前,所有记录都是英文。您将在另一个教程中了解有关其他语言的更多信息。
一部电影由以下属性表示
movie_id
: 电影的唯一 ID,在本数据库中是内部的title
: 电影的标题。plot
: 电影的摘要。genre
: 电影的类型,目前电影只有一种类型。release_year
: 电影发布的年份,以数值形式表示。rating
: 代表公众对这部电影评分的数值。votes
: 投票数。poster
: 电影海报的链接。imdb_id
: 电影在 IMDB 数据库中的 id。作为一名 Redis 开发人员,构建应用程序时要查看的第一件事之一是定义键和数据结构(数据设计/数据建模)。
在 Redis 中定义键的常用方法是在其中使用特定模式。例如,在这个应用程序中,数据库可能会处理各种业务对象:电影、演员、影院、用户等,我们可以使用以下模式
business_object:key
例如
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
: 使用给定的规范创建索引。索引名称将在所有键名称中使用,因此请使其简短。idx:movie
: 索引的名称ON hash
: 要索引的结构类型。PREFIX 1 "movie:"
: 应索引的键的前缀。这是一个列表,因此由于我们只希望索引 movie:* 键,因此数字为 1。假设您想索引具有相同字段的电影和电视节目,您可以使用:PREFIX 2 "movie:" "tv_show:"
SCHEMA ...
: 定义模式、字段及其类型以进行索引,如您在命令中看到的,我们使用 TEXT、NUMERIC 和 TAG 以及 SORTABLE 参数。您可以使用以下命令查看索引信息
> FT.INFO idx:movie