如何识别给定索引的模式变化?

上次更新于 2024 年 4 月 12 日

问题

是否可以识别使用 FT.CREATE 定义的索引的模式变化?

回答

Redis 不支持索引版本控制。因此,无法识别最新更改或查询对模式所做更改的历史记录。但是,命令 FT.ALTER 可以为索引添加新属性。使用 **别名** 功能跟踪 Redis 索引更改也是可能的。使用 Redis,您可以创建一个别名并指示应用程序使用它。可以随时创建具有所需更改的新索引:通过将别名指向最新索引,应用程序将立即透明地使用它。让我们考虑以下示例。我们存储一些数据

HSET item:1 name "book" price 9.99
HSET item:2 name "computer" price 399.99
HSET item:3 name "phone" price 199.99

然后,我们定义一个索引

FT.CREATE item_first_idx PREFIX 1 item: SCHEMA name TAG

并将其与别名关联

FT.ALIASADD item_idx item_first_idx

现在,我们可以使用别名搜索是否存在书籍

FT.SEARCH item_idx @name:{book} RETURN 1 price
1) (integer) 1
2) "item:1"
3) 1) "price"
   2) "9.99

现在,假设索引只在 `name` 字段上创建,则按价格搜索将不起作用。

FT.SEARCH item_idx '@price:[100 200]' RETURN 1 name
1) (integer) 0

然后,让我们在索引的第二个版本中引入一个新字段

FT.CREATE item_second_idx PREFIX 1 item: SCHEMA name TAG price NUMERIC SORTABLE

并使用命令 FT.ALIASUPDATE 将别名指向新索引

FT.ALIASUPDATE item_idx item_second_idx

搜索将按预期工作

FT.SEARCH item_idx '@price:[100 200]' RETURN 1 name
1) (integer) 1
2) "item:3"
3) 1) "name"
   2) "phone"

此时,我们有两个索引,但其中一个当前由别名引用。可以使用 FT.INFO 比较这两个索引并识别模式中的更改。请记住,要恢复旧版本索引使用的内存,您应该使用命令 FT.DROPINDEX 删除它们:它将删除索引,但保留数据库中的文档。

FT.DROPINDEX item_first_idx