如何识别给定索引的模式变化?
上次更新于 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