视频

了解更多
RediSearch 2.0 现已发布公开预览版!这个重要的新版本中的大多数功能都是根据您的反馈推动的,重点在于改善开发者体验和增强可扩展性。本文主要介绍如何开始使用 RediSearch 2.0 的新数据索引功能以及创建索引的更好方法。
在您的 Redis 数据库中拥有丰富的查询和聚合引擎,为许多超越缓存的新应用打开了大门。即使您需要使用复杂查询访问数据,您也可以将 Redis 用作您的主要数据库,而无需增加更新和索引数据的代码复杂性。所有这一切都拥有 Redis 闻名的高速、可靠性和可扩展性!
了解更多新功能,请参阅 RediSearch 2.0 简介
先决条件
要开始使用 RediSearch 2.0,您需要
获取一个启用 RediSearch 的 Redis 数据库
您可以通过多种方式安装和使用 RediSearch 2.0
为简单起见,本文将使用 Docker 镜像。(如果您已经安装了 RedisSearch 2.0,可以直接跳到下一节。)要使用 Docker 启动 Redis 实例,请打开终端并运行以下命令
> docker run -it --rm --name redis-search-2 \ -p 6379:6379 \ redis/redisearch:2.0.0
注意:容器退出时将自动移除(–rm 参数)。
使用您喜欢的 Redis 客户端,连接到 RediSearch 数据库。
如果您使用 Docker 启动了 Redis 实例,可以使用以下命令来使用容器中嵌入的 redis-cli
> docker exec -it redis-search-2 redis-cli
如果您想使用 Redis Insight,添加您的 RediSearch 实例并转到命令行界面。
插入数据
现在您已准备好插入一些数据。本例使用存储为 Redis Hashes 的电影数据,所以让我们插入几部电影
> HSET movie:11002 title "Star Wars: Episode V - The Empire Strikes Back" plot "Luke Skywalker begins Jedi training with Yoda." release_year 1980 genre "Action" rating 8.7 votes 1127635 (integer) 6 > HSET movie:11003 title "The Godfather" plot "The aging patriarch of an organized crime dynasty transfers control of his empire to his son." release_year 1972 genre "Drama" rating 9.2 votes 1563839 (integer) 6
数据库现在包含两个 Hashes。如果您知道电影的键(movie:11002),使用以下命令可以简单地检索信息
> HMGET movie:11002 title rating 1) "Star Wars: Episode V - The Empire Strikes Back" 2) "8.7"
但是,如何根据title、genre或release_year查询数据库以获取电影列表呢?
使用“核心” Redis 数据结构,您必须自己管理索引,例如使用 Sets 将 genre 与电影 ID 列表关联,并向您的应用添加大量代码来管理和查询索引。
但是使用 RediSearch,您可以简单地定义一个与您的数据关联的索引,并让数据库来管理它们。然后您可以使用查询引擎通过二级索引查询/搜索数据。
要创建索引,必须定义一个模式,列出要索引的字段及其类型,以便在查询中使用。
在本例中,您将索引四个字段
使用 FT.CREATE 命令创建索引
> FT.CREATE idx:movie ON hash PREFIX 1 "movie:" SCHEMA title TEXT SORTABLE release_year NUMERIC SORTABLE rating NUMERIC SORTABLE genre TAG SORTABLE OK
在运行查询之前,让我们仔细看看 FT.CREATE 命令
RediSearch 2.0 引擎将使用 PREFIX 值扫描数据库,并根据模式定义更新索引。这使得向使用 Hashes 的现有应用程序添加索引变得容易,无需更改您的代码。
您可以使用以下命令查看索引信息
> FT.INFO idx:movie 1) index_name 2) idx:movie ... 46) 1) global_idle 2) (integer) 0 ...
现在我们准备使用索引并查询数据库。
本节将使用 FT.SEARCH 命令及其语法;请注意,本文的目的是帮助您入门,因此我们只介绍基础知识,不深入所有细节。要了解更多关于 RediSearch 的信息,请查阅文档和教程。
全文搜索查询
RediSearch 是一个全文搜索引擎,允许应用程序运行强大的类 Google 查询。例如,要搜索所有包含“war”相关信息的电影,您可以运行以下命令
> FT.SEARCH idx:movie "war" RETURN 3 title release_year rating 1) (integer) 1 2) "movie:11002" 3) 1) "title" 2) "Star Wars: Episode V - The Empire Strikes Back" 3) "release_year" 4) "1980" 5) "rating" 6) "8.7"
如您所见,即使您只使用单词“war”来匹配标题中的“Wars”,电影 Star Wars: Episode V—The Empire Strikes Back 仍被找到。这是因为标题已被索引为文本,所以该字段经过了分词和词干提取处理。
此外,命令没有指定字段,因此单词“war”(及相关单词)会在索引的所有文本字段中进行搜索。如果您想搜索特定字段,可以使用 @field 符号表示法,如下所示
> FT.SEARCH idx:movie "@title:war" RETURN 3 title release_year rating
您还可以对此简单数据集运行额外的全文搜索查询,如下所示 (注意:为使文档简洁,此处未显示查询结果):
前缀匹配
> FT.SEARCH idx:movie "emp*" RETURN 3 title release_year rating
模糊搜索
> FT.SEARCH idx:movie "%gdfather%" RETURN 3 title release_year rating
联合查询
> FT.SEARCH idx:movie "war | %gdfather% " RETURN 3 title release_year rating
您可以在 RediSearch 文档中找到更多关于查询语法的信息。
标签字段搜索
使用标签字段“genre”查找所有“drama”电影
> FT.SEARCH idx:movie "@genre:{Drama}" RETURN 3 title release_year rating 1) (integer) 1 2) "movie:11003" 3) 1) "title" 2) "The Godfather" 3) "release_year" 4) "1972" 5) "rating" 6) "9.2"
语法 @field:{value} 表示您正在标签字段中进行搜索。您可以在 RediSearch 文档中找到更多关于标签过滤器(tag filter)的信息。
目前为止,您查询的所有数据都是在索引创建之前创建并在索引创建过程中被索引的。让我们通过添加一部新电影来改变一下
> HSET "movie:11005" title "Star Wars: Episode VI - Return of the Jedi" plot "The Rebels destroy the Empire's Death Star." release_year 1983 genre "Action" rating 8.3 votes 906260 (integer) 6
您可以重复使用之前的查询
> FT.SEARCH idx:movie "war" RETURN 3 title release_year rating 1) (integer) 2 2) "movie:11005" 3) 1) "title" 2) "Star Wars: Episode VI - Return of the Jedi" 3) "release_year" 4) "1983" 5) "rating" 6) "8.3" 4) "movie:11002" 5) 1) "title" 2) "Star Wars: Episode V - The Empire Strikes Back" 3) "release_year" 4) "1980" 5) "rating" 6) "8.7"
如您所见,新电影已自动被索引。
类似地,如果您删除或让电影过期,索引也会自动更新,如下所示
> EXPIRE "movie:11002" 15 (integer) 1
如果您等待 15 秒并运行搜索查询,您将看到该电影已从索引中移除。
当您想要进行临时搜索并让数据库管理数据和索引的过期时,这非常强大。您可以在我们的博客文章 临时搜索的用武之地 (The Case for Ephemeral Search) 中找到更多关于临时搜索的信息。
本文分享了 RediSearch 的一些基础知识,并展示了数据索引对于您的应用程序代码是透明的。此功能是 RediSearch 2.0 中的新特性,因为在 RediSearch 1.x 中,开发者必须专门使用 FT.ADD 命令来索引数据。
除了本文讨论的搜索和索引功能外,RediSearch 还包括强大的数据聚合功能,这些功能在 RediSearch 文档、教程和在线课程中都有介绍。
教程包含相同的数据,但数据集更大,并且有更多示例查询和聚合。它还包含一个应用程序,展示了如何将 RediSearch 与 Java、Python 和 Node.js 等编程语言一起使用。要了解更多信息,请查看以下额外资源