如何在Redis-Stack中添加文档至指定索引且不被其他索引检索到
Redis-Stack 文档跨索引可见的原因与解决方法
问题原因
你遇到的现象本质是RedisSearch的默认索引规则导致的:
- 执行
FT.CREATE创建索引时,若未指定PREFIX参数,该索引会自动匹配所有Redis哈希类型的键——不管这些键是通过FT.ADD创建的,还是用HSET原生命令创建的。 - 你创建myIdx2时未设置前缀过滤,所以它会把已存在的doc1(哈希键)和后续新增的doc2都纳入索引,因此
FT.SEARCH myIdx2 *能查到所有哈希文档,和你预期的索引隔离不符。
解决方法
要实现文档在对应索引中隔离,有两种常用方式:
方式一:创建索引时指定PREFIX(推荐,兼容原生Redis命令)
通过PREFIX参数限定索引只处理特定前缀的哈希键,不同索引使用不同前缀,从根源上隔离文档:
# 创建myIdx,只处理前缀为doc:的哈希键 FT.CREATE myIdx PREFIX 1 doc: SCHEMA title TEXT body TEXT url TEXT # 向myIdx添加带前缀的文档doc:doc1 FT.ADD myIdx doc:doc1 1.0 FIELDS title "测试标题" body "测试内容" url "http://example.com" # 创建myIdx2,只处理前缀为doc2:的哈希键 FT.CREATE myIdx2 PREFIX 1 doc2: SCHEMA tag TEXT number NUMERIC address TEXT # 向myIdx2添加带前缀的文档doc2:doc2 FT.ADD myIdx2 doc2:doc2 1.0 FIELDS tag "redis" number 100 address "测试地址"
这种方式下,你依然可以用HGET doc:doc1 title这类原生Redis命令直接访问文档内容,同时索引只会匹配对应前缀的键,实现隔离。
方式二:使用FT.ADD的NOSAVE参数(仅搜索场景适用)
添加文档时加上NOSAVE,文档不会被保存为Redis哈希键,仅存在于目标索引中,天然实现隔离:
# 向myIdx添加仅存在于该索引的文档doc1 FT.ADD myIdx doc1 1.0 NOSAVE FIELDS title "测试标题" body "测试内容" url "http://example.com" # 向myIdx2添加仅存在于该索引的文档doc2 FT.ADD myIdx2 doc2 1.0 NOSAVE FIELDS tag "redis" number 100 address "测试地址"
注意:这种方式下无法用Redis原生哈希命令访问文档,只能通过FT.SEARCH或FT.GET获取内容,适合仅需搜索查询的场景。
内容的提问来源于stack exchange,提问作者mijaplex
相关产品推荐
相关产品推荐

