如何用RedisJson和RedisSearch按数组属性长度过滤对象?
用RedisJSON和RedisSearch筛选数组长度符合条件的对象
要实现按users数组长度筛选的需求,需要结合RedisJSON的JSONPath能力和RedisSearch的索引查询功能,步骤如下:
1. 创建RedisSearch索引
首先需要为JSON键创建索引,将users数组的长度提取为可查询的数值字段。假设你的JSON键都带有统一前缀(比如user:),执行以下命令创建索引:
FT.CREATE user_list_idx ON JSON PREFIX 1 "user:" SCHEMA $.users.length() AS user_count NUMERIC
user_list_idx:自定义的索引名称,可根据实际修改PREFIX 1 "user:":指定只索引前缀为user:的键,需替换为你实际的键前缀$.users.length():通过JSONPath获取users数组的长度AS user_count NUMERIC:将数组长度映射为名为user_count的数值类型字段,用于后续范围查询
2. 执行筛选查询
基于创建好的索引,即可通过FT.SEARCH命令实现不同条件的筛选:
筛选users.length > X的对象(例如X=10)
FT.SEARCH user_list_idx "@user_count:[11 +inf]" RETURN 1 "$"
[11 +inf]:表示数值大于10的范围(+inf代表正无穷)RETURN 1 "$":指定返回完整的JSON对象;若只需返回键名,可改为RETURN 0
筛选users.length < X的对象(例如X=5)
FT.SEARCH user_list_idx "@user_count:[-inf 4]" RETURN 1 "$"
筛选users.length = X的对象(例如X=3)
FT.SEARCH user_list_idx "@user_count:[3 3]" RETURN 1 "$"
筛选users.length >= X或users.length <= X的对象
- 大于等于X:
FT.SEARCH user_list_idx "@user_count:[X +inf]" RETURN 1 "$" - 小于等于X:
FT.SEARCH user_list_idx "@user_count:[-inf X]" RETURN 1 "$"
注意事项
- 若你的JSON键没有统一前缀,可调整
PREFIX参数(比如PREFIX 0表示索引所有JSON键,但不推荐,会影响性能) - 索引创建后,新添加的符合前缀的JSON键会自动被索引;若要索引已存在的键,可执行
FT.ALTER user_list_idx ADD SCHEMA ...后,用FT.REINDEX重新索引现有键 - 确保Redis服务器已安装并启用RedisJSON和RedisSearch模块
内容的提问来源于stack exchange,提问作者Yaniv
相关产品推荐
相关产品推荐

