【问题标题】:Redisearch unable to search nested JSON arrayRedisearch 无法搜索嵌套的 JSON 数组
【发布时间】:2023-02-08 02:11:33
【问题描述】:

我正在尝试使用 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\"}]}}"

使用 \ 有什么问题吗?或者我该如何逃避它?

【问题讨论】:

    标签: redis redisearch redisjson


    【解决方案1】:

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

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

    Including punctuation in tags

    你使用的是哪个redis版本?

    它在使用 Redis Stack 泊坞窗图像时有效,例如,

    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> 
    
    

    【讨论】:

    • 我也试过了。它也没有用。所以我用 _ 替换了 / 然后查询开始工作。
    • 您使用的是哪个版本?它在使用 Redis Stack 时有效,例如,使用 docker image redis/redis-stack:latest
    猜你喜欢
    • 2023-01-13
    • 2020-06-10
    • 1970-01-01
    • 2013-01-18
    • 1970-01-01
    • 2022-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多