RedisSearch嵌套数组查询问题:筛选无封禁且均价合规的房间
RedisSearch嵌套数组查询仅处理首个元素的问题排查与解决
错误原因
直接通过JSON路径(如$.DailySpecs.IsBlocked)访问数组字段时,RedisSearch默认仅提取数组的第一个元素,不会自动遍历整个数组执行筛选或计算逻辑,这就是你的查询只处理首个DailySpecs元素的核心问题。
正确查询思路与示例
要实现需求,必须先通过UNWIND指令将数组拆分为独立元素,再针对每个元素应用筛选条件,最后按房间维度聚合计算。
假设你的索引名为room_idx,目标日期区间为2024-06-01至2024-06-10,要筛选平均折扣价在100-200之间的房间,示例查询如下:
FT.AGGREGATE room_idx "*" LOAD 0 UNWIND "$.DailySpecs" AS daily FILTER "@daily.IsBlocked == '0'" FILTER "@daily.Date >= '2024-06-01' && @daily.Date <= '2024-06-10'" GROUPBY 1 @$.RoomId REDUCE AVG 1 @daily.AfterDiscountAmount AS avg_price FILTER "@avg_price BETWEEN 100 AND 200"
关键步骤说明
UNWIND "$.DailySpecs" AS daily:将每个房间的DailySpecs数组拆分为独立的daily对象,让后续筛选逻辑作用于数组的每一个元素。- 双层
FILTER:先过滤未封禁的日期项,再筛选指定日期区间内的记录。 GROUPBY @$.RoomId:按房间ID分组,确保聚合计算针对单个房间的符合条件的日期项。REDUCE AVG:计算该房间在目标区间内的平均折扣价,最后过滤出符合价格条件的房间。
索引创建注意事项
确保创建索引时,正确映射数组内的所有元素字段,示例如下:
FT.CREATE room_idx ON JSON PREFIX 1 "room:" SCHEMA $.DailySpecs.*.IsBlocked AS is_blocked TAG $.DailySpecs.*.Date AS date TEXT $.DailySpecs.*.AfterDiscountAmount AS discount_price NUMERIC $.RoomId AS room_id TAG
这里用*.匹配数组内的所有元素,保证索引能正确捕获数组中每个字段的取值。
内容的提问来源于stack exchange,提问作者iman safari
相关产品推荐
相关产品推荐

