Spring Boot使用RediSearch查询Redis无法获取日期时间字段如何解决
问题根因与解决方案
RediSearch默认不支持直接对MM/dd/yyyy、HH:mm格式的字符串日期时间字段做检索,问题出在索引定义、数据存储、查询构造三个环节的配置不匹配,按以下步骤调整即可:
1. 调整索引字段定义
创建RediSearch索引时,日期、时间字段不要定义为TEXT类型,统一设置为NUMERIC类型:
// 定义索引schema示例 Schema schema = new Schema() .addTextField("empName", 1.0) // 日期字段存储Unix时间戳,设为NUMERIC类型 .addNumericField("entryDate") // 单独的时间字段存储当日的秒级数值,设为NUMERIC类型 .addNumericField("checkinTime"); // 创建索引 client.createIndex(schema, Client.IndexOptions.defaultOptions());
2. 调整数据存储逻辑
写入数据时先把日期时间转成对应数值再存入:
// 示例:把07/21/2021转成秒级Unix时间戳 SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy"); long entryDateTimestamp = dateFormat.parse("07/21/2021").getTime() / 1000; // 示例:把09:12转成当日秒数 9*3600 + 12*60 = 33120 String[] timeArr = "09:12".split(":"); long checkinTimeValue = Integer.parseInt(timeArr[0]) * 3600 + Integer.parseInt(timeArr[1]) * 60; // 写入Redis Map<String, Object> fields = new HashMap<>(); fields.put("empName", "raju"); fields.put("entryDate", entryDateTimestamp); fields.put("checkinTime", checkinTimeValue); client.addDocument("doc:1", fields);
3. 调整查询构造逻辑
查询前先把输入的日期时间字符串转成对应数值再构造查询语句:
// 精确匹配日期07/21/2021的示例 SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy"); long targetDateTimestamp = dateFormat.parse("07/21/2021").getTime() / 1000; Query dateQuery = new Query("@entryDate:" + targetDateTimestamp); SearchResult dateResult = client.search(dateQuery); // 精确匹配时间09:12的示例 String[] targetTimeArr = "09:12".split(":"); long targetTimeValue = Integer.parseInt(targetTimeArr[0]) * 3600 + Integer.parseInt(targetTimeArr[1]) * 60; Query timeQuery = new Query("@checkinTime:" + targetTimeValue); SearchResult timeResult = client.search(timeQuery);
特殊场景说明
如果你必须保留原格式的字符串存储且仅需要精确匹配、不需要范围/排序查询,那么查询时要对斜杠做转义处理即可:
// 转义特殊字符斜杠 String targetDate = "07\\/21\\/2021"; Query q = new Query("@entryDateStr:" + targetDate);
该方式仅适用于固定精确匹配场景,不支持日期范围查询、排序等操作,优先推荐使用数值存储的方案。
内容的提问来源于stack exchange,提问作者26280 LMS
相关产品推荐
相关产品推荐

