Redis Search日期查询语法报错问题求助
Redis Search日期查询报错解决方案
问题根源
你的查询报错直接原因是语法不兼容:tags字段是存储键值对字符串的数组(如StartDate_unixms:1609459200000),若该字段被定义为TAG或TEXT类型,Redis Search不支持在这类字段的匹配中使用[min +inf]这种数值范围查询语法;同时,字符串形式存储的日期无法被自动识别为数值进行范围比较。
解决方案
方案一:重构数据结构(推荐,性能最优)
- 从
tags数组中提取StartDate_unixms作为单独字段,以数值类型存入Redis Hash(如StartDate_unixms: 1609459200000)。 - 创建索引时将
StartDate_unixms定义为NUMERIC类型:FT.CREATE idx:employees ON HASH PREFIX 1 employee: SCHEMA employeeId TAG tags TAG StartDate_unixms NUMERIC - 修改查询语句为:
((@employeeId:{3}) | (@tags:{ParticipantEmployeeId:3})) @StartDate_unixms:[1577923200000 +inf]
方案二:现有结构下的临时查询方案(性能较差)
若无法修改数据结构,可通过ARRAY_FILTER和字符串处理函数实现范围判断:
((@employeeId:{3}) | (@tags:{ParticipantEmployeeId:3})) FILTER EXISTS(ARRAY_FILTER(@tags, x -> STARTSWITH(x, 'StartDate_unixms:') AND CAST(SUBSTR(x, 18), 'NUMERIC') >= 1577923200000))
- 逻辑:遍历
tags数组,筛选出以StartDate_unixms:开头的元素,截取数值部分并转换为数值后判断是否大于等于目标时间戳。 - 注意:该方法需对每个文档做数组遍历和字符串运算,数据量大时性能会显著下降,仅作为临时过渡方案。
内容的提问来源于stack exchange,提问作者Denis Vishchak
相关产品推荐
相关产品推荐

