【问题标题】:How to have a dynamic value using Redisearch ft.create?如何使用 Redisearch ft.create 获得动态值?
【发布时间】:2022-10-17 21:56:30
【问题描述】:

我有一个简单的条目:

json.set a:1 . '{"name":"chloe", "age":26 , "foo" : {"bar" : 1}'

创建索引时,我可以做到

FT.CREATE ON JSON SCHEMA $.name AS name TEXT ..... 

但是bar 是一个动态值,可以更改。如何为foo 下的动态值创建索引?

【问题讨论】:

  • 那么您是否在考虑如下所示的数据:{"name":"chloe", "age":26 , "foo" : {"bar" : 1}{"name":"chloe", "age":26 , "foo" : {"baz" : 1}{"name":"chloe", "age":26 , "foo" : {"qux" : 1} 而无论属性名称如何,您都想获得1 的值?
  • @GuyRoyse 我希望得到 bar 的值,但 bar 是一个变量,可以是别的东西。我不想指定 bar 并希望说出任何作为 foo 子级的键。

标签: redis redisjson


【解决方案1】:

您可以使用完整的 JSONPath 语法来匹配 JSON 中的字段。如果属性foo 将始终包含一个对象该对象将始终包含一个,只有一个属性,您可以像这样使用 JSONPath $.foo.*


> FT.CREATE a:index ON JSON SCHEMA $.name AS name TEXT $.foo.* AS num NUMERIC
OK
> FT.SEARCH a:index "@num:[1 1]"
1) (integer) 1
2) "a:1"
3) 1) "$"
   2) "{"name":"chloe","age":26,"foo":{"bar":1}}"

请注意,如果 foo 包含多个属性,则此 JSONPath 很可能会返回多个结果:

{
  "name" : "chloe",
  "age": 26,
  "foo": {
    "bar": 1,
    "baz": 13
  }
}

如果您的字段是 TAG 字段并且 JSON 包含字符串而不是数字,这可能是可取的。但它不适用于 NUMERIC 字段。

【讨论】:

    猜你喜欢
    • 2021-11-28
    • 2022-11-30
    • 1970-01-01
    • 2019-06-19
    • 1970-01-01
    • 1970-01-01
    • 2019-10-31
    • 2023-03-28
    • 1970-01-01
    相关资源
    最近更新 更多