点 Redis 8 来了——它是开源的

了解更多

RediSearch 2.0 入门指南

RediSearch 2.0 现已发布公开预览版!这个重要的新版本中的大多数功能都是根据您的反馈推动的,重点在于改善开发者体验和增强可扩展性。本文主要介绍如何开始使用 RediSearch 2.0 的新数据索引功能以及创建索引的更好方法。 

在您的 Redis 数据库中拥有丰富的查询和聚合引擎,为许多超越缓存的新应用打开了大门。即使您需要使用复杂查询访问数据,您也可以将 Redis 用作您的主要数据库,而无需增加更新和索引数据的代码复杂性。所有这一切都拥有 Redis 闻名的高速、可靠性和可扩展性!

了解更多新功能,请参阅 RediSearch 2.0 简介

入门

先决条件

要开始使用 RediSearch 2.0,您需要

  • Docker
  • Redis 命令行界面。您的两个主要选择是
    • redis-cli,随 Redis 提供
    • RedisInsight,一个用于简化 Redis 应用开发的免费 GUI,它也包含命令行界面。

获取一个启用 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 并插入数据

使用您喜欢的 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"

但是,如何根据titlegenrerelease_year查询数据库以获取电影列表呢?

使用“核心” Redis 数据结构,您必须自己管理索引,例如使用 Sets 将 genre 与电影 ID 列表关联,并向您的应用添加大量代码来管理和查询索引。

但是使用 RediSearch,您可以简单地定义一个与您的数据关联的索引,并让数据库来管理它们。然后您可以使用查询引擎通过二级索引查询/搜索数据。

为电影创建 RediSearch 索引

要创建索引,必须定义一个模式,列出要索引的字段及其类型,以便在查询中使用。

在本例中,您将索引四个字段

  1. 标题
  2. 发布年份
  3. 评分
  4. 类型

使用 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 命令

  • idx:movie:索引的名称,您将在进行查询时使用它
  • ON hash:要索引的结构类型。(请注意,RediSearch 2.0 仅支持 Hash 结构,但此参数将来将允许 RediSearch 索引其他结构。)
  • PREFIX 1 “movie:”:应被索引的键的前缀。这是一个列表,所以我们只想索引 movie:* 键,数量为 1。如果您想索引具有相同字段的电影和电视剧,您可以使用:PREFIX 2 “movie:” “tv_show:”
  • SCHEMA …:定义模式、字段及其索引类型。如命令所示,我们使用了 TEXT、NUMERICTAGSORTABLE 参数。

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) 中找到更多关于临时搜索的信息。

https://www.youtube.com/embed/DJewW_qhpyk

接下来我可以做什么?

本文分享了 RediSearch 的一些基础知识,并展示了数据索引对于您的应用程序代码是透明的。此功能是 RediSearch 2.0 中的新特性,因为在 RediSearch 1.x 中,开发者必须专门使用 FT.ADD 命令来索引数据。 

除了本文讨论的搜索和索引功能外,RediSearch 还包括强大的数据聚合功能,这些功能在 RediSearch 文档、教程在线课程中都有介绍。

教程包含相同的数据,但数据集更大,并且有更多示例查询和聚合。它还包含一个应用程序,展示了如何将 RediSearch 与 Java、Python 和 Node.js 等编程语言一起使用。要了解更多信息,请查看以下额外资源