reresearch无法搜索嵌套JSON数组



我正在尝试使用redis-search + redis-json。但面对问题的查询嵌套Json与数组。我创建了以下JSON

{
"src":{
"location":[
{
"ref":"/uuid/1/xyz",
"key":"zone"
},
{
"ref":"/uuid/2/abc",
"key":"zone"
}
]
}
}
127.0.0.1:6379> JSON.SET 300:100 $ '{"src":{"location":[{"ref":"/uuid/1/xyz", "key":"zone"},{"ref":"/uuid/2/abc", "key":"zone"}]}}'
JSON.GET 300:100
"{"src":{"location":[{"ref":"/uuid/1/xyz","key":"zone"},{"ref":"/uuid/2/abc","key":"zone"}]}}"
127.0.0.1:6379> JSON.GET 300:100 $.src.location[*]
"[[{"ref":"/uuid/1/xyz","key":"zone"},{"ref":"/uuid/2/abc","key":"zone"}]]"

创建指数

127.0.0.1:6379> FT.CREATE 300:idx6 ON JSON SCHEMA $.src.location[*].ref as ref TAG

尝试用标签

搜索
127.0.0.1:6379> FT.SEARCH 300:idx6 @ref:{/uuid/1/xyz}
1) (integer) 0

但是它不起作用。但是如果我用_替换ref中的/,我得到的结果是

127.0.0.1:6379> JSON.SET 300:100 $ '{"src":{"location":[{"ref":"_uuid_1_xyz", "key":"zone"},{"ref":"_uuid_2_abc", "key":"zone"}]}}'
127.0.0.1:6379> FT.CREATE 300:idx7 ON JSON SCHEMA $.src.location[*].ref as ref TAG
OK
127.0.0.1:6379> FT.SEARCH 300:idx7 @ref:{_uuid_1_xyz}
1) (integer) 1
2) "300:100"
3) 1) "$"
2) "{"src":{"location":[{"ref":"_uuid_1_xyz","key":"zone"},{"ref":"_uuid_2_abc","key":"zone"}]}}"

使用是否有问题,或者我如何转义它?

您需要转义查询中的标点符号,例如

FT.SEARCH 300:idx6 @ref:{/uuid/1/xyz}

参见在标签中包含标点

你使用的是哪个redis版本?

当使用Redis Stack docker镜像时,它正在工作,例如

docker run -d --name redis-stack -p 6379:6379 -p 8001:8001 redis/redis-stack:latest

(当前redis 6.2.6, RediSearch 2.2.10, RedisJSON 2.0.7)

redis-cli

中执行以下命令
127.0.0.1:6379> JSON.SET 300:100 $ '{"src":{"location":[{"ref":"/uuid/1/xyz", "key":"zone"},{"ref":"/uuid/2/abc", "key":"zone"}]}}'
OK
127.0.0.1:6379> FT.CREATE 300:idx6 ON JSON SCHEMA $.src.location[*].ref as ref TAG
OK

转义查询不需要替换/:

127.0.0.1:6379> FT.SEARCH 300:idx6 @ref:{/uuid/1/xyz}
1) (integer) 1
2) "300:100"
3) 1) "$"
2) "{"src":{"location":[{"ref":"/uuid/1/xyz","key":"zone"},{"ref":"/uuid/2/abc","key":"zone"}]}}"
127.0.0.1:6379> 

最新更新