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进行聚合时,仅返回第一个值。例如:
- 执行索引创建命令:
FT.CREATE mySearch ON JSON PREFIX 1 myPrefix: SCHEMA $.inventory[*].name as itemName TEXT - 执行聚合命令:
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 CASESENSITIVETEXT类型,但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
相关产品推荐
相关产品推荐

