Redis FT.SEARCH指定单个索引却返回两个索引数据的问题求助
Redis FT.SEARCH指定单个索引却返回两个索引数据的问题求助
看起来你碰到了RedisSearch里一个很容易踩的坑!我帮你梳理下问题原因和解决办法:
首先,你创建两个索引的时候没有指定PREFIX参数——这是关键问题!RedisSearch的FT.CREATE命令如果不声明PREFIX,它会默认把Redis中所有包含你Schema里定义字段的键都索引进去,不管键名是什么前缀。
也就是说:
- 你创建
idx:business时,它会把所有带有description、location这些字段的键(包括product:开头的)都加到这个索引里; - 创建
idx:product时同理,也会把business:开头的键索引进去;
所以你用FT.SEARCH查询idx:product的时候,自然会返回来自两个前缀的键数据。
解决办法:创建索引时必须指定PREFIX
你需要在创建索引时明确告诉RedisSearch,这个索引只对应特定前缀的键。修正后的代码如下:
// 创建business索引,只匹配键名以business:开头的哈希表 await redis.call('FT.CREATE', 'idx:business', 'PREFIX', 1, 'business:', 'SCHEMA', 'description', 'TEXT', 'location', 'GEO', 'SORTABLE', 'rating', 'NUMERIC', 'SORTABLE', 'sold', 'NUMERIC', 'SORTABLE' ); // 创建product索引,只匹配键名以product:开头的哈希表 await redis.call('FT.CREATE', 'idx:product', 'PREFIX', 1, 'product:', 'SCHEMA', 'description', 'TEXT', 'location', 'GEO', 'SORTABLE', 'rating', 'NUMERIC', 'SORTABLE', 'sold', 'NUMERIC', 'SORTABLE' );
额外步骤:清理旧索引
因为你之前已经创建了没有前缀限制的索引,所以需要先删除旧索引,再重新创建:
// 删除旧的错误索引 await redis.call('FT.DROPINDEX', 'idx:business'); await redis.call('FT.DROPINDEX', 'idx:product');
重新创建后,再执行你的FT.SEARCH查询,就只会返回product:前缀的键数据啦!
备注:内容来源于stack exchange,提问作者imin
相关产品推荐
相关产品推荐

