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

RediSearch聚合LOAD时能否用通配符获取多JSON值?如何实现?

问题描述

假设有如下结构的JSON对象存储在Redis中(键为myPrefix:myKey):

{
  "inventory": [
    {
      "name": "Carrot",
      "desc": "A fresh vegetable"
    },
    {
      "name": "Knife",
      "desc": "A tool to cut things"
    }
  ]
}

使用JsonPath通配符,通过JSON.GET myPrefix:myKey $.inventory[*].name(或$.inventory..name)可获取inventory中所有name值,返回结果为"[\"Carrot\",\"Knife\"]"。

但使用RediSearch的LOAD进行聚合时,仅返回第一个值。例如:

  1. 执行索引创建命令:
    FT.CREATE mySearch ON JSON PREFIX 1 myPrefix: SCHEMA $.inventory[*].name as itemName TEXT
    
  2. 执行聚合命令:
    FT.AGGREGATE mySearch * LOAD 2 @__key @itemName groupby 1 @__key reduce tolist 1 @itemName as itemsList
    

返回结果仅包含"Carrot":

1) "1"
2) 1) "__key"
   2) "myPrefix:myKey"
   3) "itemsList"
   4) 1) "Carrot"

请问是否可以通过FT.AGGREGATE命令完整查询这类嵌套JSON数据?若可以,该如何操作?

解决方案

可以实现,核心是让RediSearch正确识别JSON数组的多值属性,具体操作如下:

  • 修改索引创建命令
    在定义Schema时,需将字段标记为支持多值的类型(推荐TAG类型,对离散字符串的多值处理更友好):
    FT.CREATE mySearch ON JSON PREFIX 1 myPrefix: SCHEMA $.inventory[*].name as itemName TAG CASESENSITIVE
    
    若需要保留文本检索能力,也可使用TEXT类型,但TAG在聚合场景下对多值的兼容更稳定。
  • 执行聚合查询命令
    使用REDUCE TOLIST完成多值的收集:
    FT.AGGREGATE mySearch * LOAD 2 @__key @itemName GROUPBY 1 @__key REDUCE TOLIST 1 @itemName AS itemsList
    

需要注意,该方案要求Redis版本≥6.2、RediSearch版本≥2.4,这两个版本开始完善了对JSON多值字段的索引与聚合支持。当索引正确创建后,@itemName会包含数组中所有的name值,最终itemsList会返回["Carrot", "Knife"]。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 21:04:53