You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Redis Python中嵌套JSON时间戳字段的索引与搜索问题

问题分析与修复方案

你的代码存在三个核心问题,导致搜索返回0条结果:

1. 索引类型不匹配

你使用IndexType.HASH创建索引,但实际通过r.json().set()写入的是JSON类型键值,索引类型必须改为IndexType.JSON才能正确解析JSON结构。

2. 时间戳字段类型错误

你将timestamp转成了字符串(str(time.time())),但定义的是NumericField数字字段索引,字符串无法被数字索引识别,需要直接存储数字类型。

3. JSON数组路径错误

messages是数组结构,直接用$.messages.timestamp无法定位到数组内的timestamp字段,必须用$.messages[*].timestamp来遍历数组中的所有元素。


修复后的完整代码

import time
from redis import Redis
from redis.commands.search.indexDefinition import IndexDefinition, IndexType
from redis.commands.search.field import NumericField
from redis.commands.search.query import Query, NumericFilter


def main():
    r = None
    # 修复:timestamp存储为数字类型,而非字符串
    test_dict1 = {"context": {"test": {"other": "test"}, "messages": [{"text": "mytext", "timestamp": time.time()}]}}
    test_dict2 = {"context": {"test": {"other": "test"}, "messages": [{"text": "mytext2", "timestamp": time.time() + 10}]}}

    try:
        r = Redis()
        # 先创建索引再写入数据,确保新数据自动被索引
        # 修复1:索引类型改为IndexType.JSON;修复3:使用数组遍历路径$.messages[*].timestamp
        r.ft('timestamp').create_index(
            fields=[NumericField("$.messages[*].timestamp", as_name="msg_timestamp")],
            definition=IndexDefinition(prefix=['uuid:'], index_type=IndexType.JSON)
        )
        r.json().set("uuid:4587-7d5f9-4545", "$", test_dict1)
        r.json().set("uuid:4587-7d5f9-4546", "$", test_dict2)
        
        print(r.json().get("uuid:4587-7d5f9-4545", "$.context.test.other"))
        
        # 使用别名查询更简洁,也可以直接用完整路径
        q = Query("*").add_filter(NumericFilter(field="msg_timestamp", minval=0, maxval=time.time()))
        print(r.ft('timestamp').search(q))
    except Exception as e:
        raise e
    finally:
        if r is not None:
            r.flushall()


if __name__ == "__main__":
    main()

额外说明

  • 给JSON字段起别名(as_name="msg_timestamp")可以简化查询语句,避免重复写长路径。
  • 如果需要为已存在的JSON键创建索引,创建索引后需重新触发索引构建,建议优先采用先建索引再写数据的流程,自动完成索引同步。
  • 可通过r.ft('timestamp').info()查看索引详情,验证字段和路径配置是否正确。

内容的提问来源于stack exchange,提问作者Jack Avante

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 04:41:58